Merged with trunk R1141
authorDavid Robillard <d@drobilla.net>
Sun, 19 Nov 2006 16:45:16 +0000 (16:45 +0000)
committerDavid Robillard <d@drobilla.net>
Sun, 19 Nov 2006 16:45:16 +0000 (16:45 +0000)
git-svn-id: svn://localhost/ardour2/branches/midi@1142 d708f5d6-7413-0410-9779-e7cbd77b26cf

209 files changed:
DOCUMENTATION/TRANSLATORS
SConstruct
ardour.rc.in
ardour_system.rc
gtk2_ardour/SConscript
gtk2_ardour/about.cc
gtk2_ardour/actions.cc
gtk2_ardour/add_route_dialog.cc
gtk2_ardour/ardev_common.sh
gtk2_ardour/ardour.bindings
gtk2_ardour/ardour.colors
gtk2_ardour/ardour.menus
gtk2_ardour/ardour.sh.in
gtk2_ardour/ardour2_ui.rc
gtk2_ardour/ardour_ui.cc
gtk2_ardour/ardour_ui.h
gtk2_ardour/ardour_ui2.cc
gtk2_ardour/ardour_ui_options.cc
gtk2_ardour/audio_clock.cc
gtk2_ardour/audio_region_editor.cc
gtk2_ardour/audio_region_editor.h
gtk2_ardour/audio_region_view.cc
gtk2_ardour/audio_region_view.h
gtk2_ardour/automation_line.cc
gtk2_ardour/automation_line.h
gtk2_ardour/automation_time_axis.cc
gtk2_ardour/canvas-waveview.c
gtk2_ardour/editing.cc
gtk2_ardour/editing.h
gtk2_ardour/editor.cc
gtk2_ardour/editor.h
gtk2_ardour/editor_actions.cc
gtk2_ardour/editor_audio_import.cc
gtk2_ardour/editor_canvas.cc
gtk2_ardour/editor_markers.cc
gtk2_ardour/editor_mixer.cc
gtk2_ardour/editor_mouse.cc
gtk2_ardour/editor_ops.cc
gtk2_ardour/editor_region_list.cc
gtk2_ardour/editor_route_list.cc
gtk2_ardour/editor_rulers.cc
gtk2_ardour/editor_tempodisplay.cc
gtk2_ardour/export_dialog.cc
gtk2_ardour/export_region_dialog.cc
gtk2_ardour/fft_graph.cc
gtk2_ardour/gain_automation_time_axis.cc
gtk2_ardour/gui_thread.h
gtk2_ardour/i18n.h
gtk2_ardour/icons/hide.png [new file with mode: 0644]
gtk2_ardour/icons/record_normal_red.png [new file with mode: 0644]
gtk2_ardour/icons/record_tape_red.png [new file with mode: 0644]
gtk2_ardour/icons/strip_width.png [new file with mode: 0644]
gtk2_ardour/io_selector.cc
gtk2_ardour/io_selector.h
gtk2_ardour/keyboard.cc
gtk2_ardour/location_ui.cc
gtk2_ardour/main.cc
gtk2_ardour/marker_time_axis_view.cc
gtk2_ardour/mixer_strip.cc
gtk2_ardour/mixer_strip.h
gtk2_ardour/mixer_ui.cc
gtk2_ardour/new_session_dialog.cc
gtk2_ardour/option_editor.cc
gtk2_ardour/option_editor.h
gtk2_ardour/plugin_ui.cc
gtk2_ardour/po/SConscript [deleted file]
gtk2_ardour/po/ru_RU.po
gtk2_ardour/po/sv_SE.po [new file with mode: 0644]
gtk2_ardour/public_editor.h
gtk2_ardour/redirect_box.cc
gtk2_ardour/redirect_box.h
gtk2_ardour/region_gain_line.cc
gtk2_ardour/region_selection.cc
gtk2_ardour/region_view.cc
gtk2_ardour/route_time_axis.cc
gtk2_ardour/route_time_axis.h
gtk2_ardour/route_ui.cc
gtk2_ardour/route_ui.h
gtk2_ardour/selection.h
gtk2_ardour/sfdb_ui.cc
gtk2_ardour/sfdb_ui.h
gtk2_ardour/streamview.cc
gtk2_ardour/time_axis_view.cc
gtk2_ardour/utils.cc
gtk2_ardour/visual_time_axis.cc
libs/ardour/SConscript
libs/ardour/ardour/audio_diskstream.h
libs/ardour/ardour/audio_track.h
libs/ardour/ardour/audio_unit.h
libs/ardour/ardour/audiofilesource.h
libs/ardour/ardour/audioregion.h
libs/ardour/ardour/audiosource.h
libs/ardour/ardour/automation_event.h
libs/ardour/ardour/configuration_vars.h
libs/ardour/ardour/coreaudiosource.h
libs/ardour/ardour/curve.h
libs/ardour/ardour/destructive_filesource.h
libs/ardour/ardour/diskstream.h
libs/ardour/ardour/insert.h
libs/ardour/ardour/io.h
libs/ardour/ardour/location.h
libs/ardour/ardour/midi_diskstream.h
libs/ardour/ardour/midi_region.h
libs/ardour/ardour/midi_track.h
libs/ardour/ardour/panner.h
libs/ardour/ardour/playlist.h
libs/ardour/ardour/redirect.h
libs/ardour/ardour/region.h
libs/ardour/ardour/route.h
libs/ardour/ardour/session.h
libs/ardour/ardour/sndfilesource.h
libs/ardour/ardour/source.h
libs/ardour/ardour/state_manager.h [deleted file]
libs/ardour/ardour/tempo.h
libs/ardour/ardour/track.h
libs/ardour/ardour/types.h
libs/ardour/ardour/vst_plugin.h
libs/ardour/audio_diskstream.cc
libs/ardour/audio_playlist.cc
libs/ardour/audio_track.cc
libs/ardour/audioengine.cc
libs/ardour/audiofilesource.cc
libs/ardour/audioregion.cc
libs/ardour/audiosource.cc
libs/ardour/automation_event.cc
libs/ardour/control_protocol_manager.cc
libs/ardour/coreaudiosource.cc
libs/ardour/curve.cc
libs/ardour/destructive_filesource.cc
libs/ardour/diskstream.cc
libs/ardour/globals.cc
libs/ardour/i18n.h
libs/ardour/insert.cc
libs/ardour/io.cc
libs/ardour/location.cc
libs/ardour/midi_diskstream.cc
libs/ardour/midi_region.cc
libs/ardour/midi_track.cc
libs/ardour/panner.cc
libs/ardour/playlist.cc
libs/ardour/plugin_manager.cc
libs/ardour/po/sv_SE.po [new file with mode: 0644]
libs/ardour/redirect.cc
libs/ardour/region.cc
libs/ardour/route.cc
libs/ardour/send.cc
libs/ardour/session.cc
libs/ardour/session_click.cc
libs/ardour/session_command.cc
libs/ardour/session_state.cc
libs/ardour/session_transport.cc
libs/ardour/sndfile_helpers.cc
libs/ardour/sndfilesource.cc
libs/ardour/source.cc
libs/ardour/source_factory.cc
libs/ardour/sse_functions_64bit.s
libs/ardour/state_manager.cc [deleted file]
libs/ardour/tempo.cc
libs/ardour/track.cc
libs/ardour/utils.cc
libs/ardour/vst_plugin.cc
libs/clearlooks/SConscript [new file with mode: 0644]
libs/clearlooks/bits.c [new file with mode: 0644]
libs/clearlooks/clearlooks_draw.c [new file with mode: 0644]
libs/clearlooks/clearlooks_draw.h [new file with mode: 0644]
libs/clearlooks/clearlooks_rc_style.c [new file with mode: 0644]
libs/clearlooks/clearlooks_rc_style.h [new file with mode: 0644]
libs/clearlooks/clearlooks_style.c [new file with mode: 0644]
libs/clearlooks/clearlooks_style.h [new file with mode: 0644]
libs/clearlooks/clearlooks_theme_main.c [new file with mode: 0644]
libs/clearlooks/cpdll.sh [new file with mode: 0755]
libs/clearlooks/support.c [new file with mode: 0644]
libs/clearlooks/support.h [new file with mode: 0644]
libs/fst/SConscript
libs/gtkmm2ext/SConscript
libs/gtkmm2ext/barcontroller.cc
libs/gtkmm2ext/click_box.cc
libs/gtkmm2ext/gtkmm2ext/click_box.h
libs/gtkmm2ext/gtkmm2ext/gtk_ui.h
libs/gtkmm2ext/tearoff.cc
libs/libsndfile/SConscript
libs/midi++2/SConscript
libs/midi++2/midi++/factory.h
libs/midi++2/midifactory.cc
libs/midi++2/midimanager.cc
libs/pbd/SConscript
libs/pbd/controllable.cc
libs/pbd/convert.cc
libs/pbd/pbd/command.h
libs/pbd/pbd/controllable.h
libs/pbd/pbd/convert.h
libs/pbd/pbd/crossthread.h [new file with mode: 0644]
libs/pbd/pbd/destructible.h
libs/pbd/pbd/memento_command.h
libs/pbd/pbd/rcu.h
libs/pbd/pbd/shiva.h
libs/pbd/pbd/statefuldestructible.h
libs/pbd/pbd/undo.h
libs/pbd/pbd/xml++.h
libs/pbd/undo.cc
libs/pbd/whitespace.cc
libs/pbd/xml++.cc
libs/surfaces/control_protocol/SConscript
libs/surfaces/control_protocol/basic_ui.cc
libs/surfaces/tranzport/tranzport_control_protocol.cc
svn_revision.h [new file with mode: 0644]
tools/osx_packaging/ardour2_mac_ui.rc
vst/SConscript
vst/ardevst

index 5d54a48ecb6e7a3e34323e822e7405c136df3894..c09a40406b1b85c6a7f99b2e81e5f7ff48c14c49 100644 (file)
@@ -6,6 +6,7 @@ Many thanks to these translators for making Ardour available in other
 languages:
 
 French: Alain Fr�hel <alain.frehel@free.fr>
+        Christophe Combelles <ccomb@free.fr>
 
 German: Karsten Petersen <kapet@kapet.de>
 
index a06fadbef7cec06703160238186f2660aed611d0..27e04b2ee11e4c5e7cfc973276575c52fbd0296c 100644 (file)
@@ -9,13 +9,14 @@ import errno
 import time
 import platform
 import string
+import commands
 from sets import Set
 import SCons.Node.FS
 
 SConsignFile()
 EnsureSConsVersion(0, 96)
 
-version = '2.0beta5.1'
+version = '2.0beta8'
 
 subst_dict = { }
 
@@ -40,7 +41,7 @@ opts.AddOptions(
     PathOption('PREFIX', 'Set the install "prefix"', '/usr/local'),
     BoolOption('SURFACES', 'Build support for control surfaces', 0),
     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('VERSIONED', 'Add version information to ardour/gtk executable name inside the build directory', 0),
+    BoolOption('VERSIONED', 'Add revision information to ardour/gtk executable name inside the build directory', 0),
     BoolOption('VST', 'Compile with support for VST', 0)
 )
 
@@ -230,41 +231,71 @@ def i18n (buildenv, sources, installenv):
         moname = domain + '.mo'
         installenv.Alias('install', installenv.InstallAs (os.path.join (modir, moname), lang + '.mo'))
 
+
+def fetch_svn_revision (path):
+    cmd = "svn info "
+    cmd += path
+    cmd += " | awk '/^Revision:/ { print $2}'"
+    return commands.getoutput (cmd)
+
+def create_stored_revision (target = None, source = None, env = None):
+    if os.path.exists('.svn'):    
+        rev = fetch_svn_revision ('.');
+        try:
+            text  = "#ifndef __ardour_svn_revision_h__\n"
+            text += "#define __ardour_svn_revision_h__\n"
+            text += "static const char* ardour_svn_revision = \"" + rev + "\";\n";
+            text += "#endif\n"
+            print '============> writing svn revision info to svn_revision.h\n'
+            o = file ('svn_revision.h', 'w')
+            o.write (text)
+            o.close ()
+        except IOError:
+            print "Could not open svn_revision.h for writing\n"
+            sys.exit (-1)
+    else:
+        print "You cannot use \"scons revision\" on without using a checked out"
+        print "copy of the Ardour source code repository"
+        sys.exit (-1)
+
 #
 # A generic builder for version.cc files
 #
 # note: requires that DOMAIN, MAJOR, MINOR, MICRO are set in the construction environment
 # note: assumes one source files, the header that declares the version variables
 #
+
 def version_builder (target, source, env):
-   text  = "int " + env['DOMAIN'] + "_major_version = " + str (env['MAJOR']) + ";\n"
-   text += "int " + env['DOMAIN'] + "_minor_version = " + str (env['MINOR']) + ";\n"
-   text += "int " + env['DOMAIN'] + "_micro_version = " + str (env['MICRO']) + ";\n"
-   
-   try:
-      o = file (target[0].get_path(), 'w')
-      o.write (text)
-      o.close ()
-   except IOError:
-      print "Could not open", target[0].get_path(), " for writing\n"
-      sys.exit (-1)
-   
-   text  = "#ifndef __" + env['DOMAIN'] + "_version_h__\n"
-   text += "#define __" + env['DOMAIN'] + "_version_h__\n"
-   text += "extern int " + env['DOMAIN'] + "_major_version;\n"
-   text += "extern int " + env['DOMAIN'] + "_minor_version;\n"
-   text += "extern int " + env['DOMAIN'] + "_micro_version;\n"
-   text += "#endif /* __" + env['DOMAIN'] + "_version_h__ */\n"
-   
-   try:
-      o = file (target[1].get_path(), 'w')
-      o.write (text)
-      o.close ();
-   except IOError:
-      print "Could not open", target[1].get_path(), " for writing\n"
-      sys.exit (-1)
-   
-   return None
+
+    text  = "int " + env['DOMAIN'] + "_major_version = " + str (env['MAJOR']) + ";\n"
+    text += "int " + env['DOMAIN'] + "_minor_version = " + str (env['MINOR']) + ";\n"
+    text += "int " + env['DOMAIN'] + "_micro_version = " + str (env['MICRO']) + ";\n"
+    
+    try:
+        o = file (target[0].get_path(), 'w')
+        o.write (text)
+        o.close ()
+    except IOError:
+        print "Could not open", target[0].get_path(), " for writing\n"
+        sys.exit (-1)
+
+    text  = "#ifndef __" + env['DOMAIN'] + "_version_h__\n"
+    text += "#define __" + env['DOMAIN'] + "_version_h__\n"
+    text += "extern const char* " + env['DOMAIN'] + "_revision;\n"
+    text += "extern int " + env['DOMAIN'] + "_major_version;\n"
+    text += "extern int " + env['DOMAIN'] + "_minor_version;\n"
+    text += "extern int " + env['DOMAIN'] + "_micro_version;\n"
+    text += "#endif /* __" + env['DOMAIN'] + "_version_h__ */\n"
+    
+    try:
+        o = file (target[1].get_path(), 'w')
+        o.write (text)
+        o.close ()
+    except IOError:
+        print "Could not open", target[1].get_path(), " for writing\n"
+        sys.exit (-1)
+        
+    return None
 
 version_bld = Builder (action = version_builder)
 env.Append (BUILDERS = {'VersionBuild' : version_bld})
@@ -278,32 +309,18 @@ env.Append (BUILDERS = {'VersionBuild' : version_bld})
 #
 
 def versioned_builder(target,source,env):
-    # build ID is composed of a representation of the date of the last CVS transaction
-    # for this (SConscript) file
+    w, r = os.popen2( "svn info | awk '/^Revision:/ { print $2}'")
     
-    try:
-        o = file (source[0].get_dir().get_path() +  '/CVS/Entries', "r")
-    except IOError:
-        print "Could not CVS/Entries for reading"
-        return -1
-    
-    last_date = ""
-    lines = o.readlines()
-    for line in lines:
-        if line[0:12] == '/SConscript/':
-            parts = line.split ("/")
-            last_date = parts[3]
-            break
-    o.close ()
-    
-    if last_date == "":
-        print "No SConscript CVS update info found - versioned executable cannot be built"
+    last_revision = r.readline().strip()
+    w.close()
+    r.close()
+    if last_revision == "":
+        print "No SVN info found - versioned executable cannot be built"
         return -1
     
-    tag = time.strftime ('%Y%M%d%H%m', time.strptime (last_date))
-    print "The current build ID is " + tag
+    print "The current build ID is " + last_revision
     
-    tagged_executable = source[0].get_path() + '-' + tag
+    tagged_executable = source[0].get_path() + '-' + last_revision
     
     if os.path.exists (tagged_executable):
         print "Replacing existing executable with the same build tag."
@@ -361,7 +378,7 @@ env.Append (BUILDERS = {'Tarball' : tarball_bld})
 #
 
 if env['VST']:
-    sys.stdout.write ("Are you building Ardour for personal use (rather than distributiont to others)? [no]: ")
+    sys.stdout.write ("Are you building Ardour for personal use (rather than distribution to others)? [no]: ")
     answer = sys.stdin.readline ()
     answer = answer.rstrip().strip()
     if answer != "yes" and answer != "y":
@@ -462,7 +479,7 @@ libraries['flac'] = conf.Finish ()
 
 libraries['boost'] = LibraryInfo ()
 conf = Configure (libraries['boost'])
-if conf.CheckHeader ('boost/shared_ptr.hpp', language='CXX') == 0:
+if conf.CheckHeader ('boost/shared_ptr.hpp', language='CXX') == False:
         print "Boost header files do not appear to be installed."
         sys.exit (1)
     
@@ -523,7 +540,7 @@ elif conf.CheckCHeader('/System/Library/Frameworks/CoreMIDI.framework/Headers/Co
     subst_dict['%MIDITYPE%'] = "coremidi"
     print "Using CoreMIDI"
 else:
-    print "It appears you don't have the required MIDI libraries installed."
+    print "It appears you don't have the required MIDI libraries installed. For Linux this means you are missing the development package for ALSA libraries."
     sys.exit (1)
 
 env = conf.Finish()
@@ -549,7 +566,7 @@ if env['SYSLIBS']:
 # cannot use system one for the time being
 #
     
-    libraries['sndfile'] = LibraryInfo(LIBS='libsndfile',
+    libraries['sndfile-ardour'] = LibraryInfo(LIBS='libsndfile-ardour',
                                     LIBPATH='#libs/libsndfile',
                                     CPPPATH=['#libs/libsndfile', '#libs/libsndfile/src'])
 
@@ -587,7 +604,8 @@ if env['SYSLIBS']:
     gtk_subdirs = [
 #        'libs/flowcanvas',
         'libs/gtkmm2ext',
-        'gtk2_ardour'
+        'gtk2_ardour',
+        'libs/clearlooks'
         ]
 
 else:
@@ -616,7 +634,7 @@ else:
     libraries['soundtouch'] = LibraryInfo(LIBS='soundtouch',
                                           LIBPATH='#libs/soundtouch',
                                           CPPPATH=['#libs', '#libs/soundtouch'])
-    libraries['sndfile'] = LibraryInfo(LIBS='libsndfile',
+    libraries['sndfile-ardour'] = LibraryInfo(LIBS='libsndfile-ardour',
                                     LIBPATH='#libs/libsndfile',
                                     CPPPATH=['#libs/libsndfile', '#libs/libsndfile/src'])
 #    libraries['libglademm'] = LibraryInfo(LIBS='libglademm',
@@ -656,8 +674,9 @@ else:
        'libs/gtkmm2/gtk',
        'libs/libgnomecanvasmm',
 #      'libs/flowcanvas',
-    'libs/gtkmm2ext',
-    'gtk2_ardour'
+        'libs/gtkmm2ext',
+        'gtk2_ardour',
+        'libs/clearlooks'
         ]
 
 #
@@ -722,10 +741,10 @@ if os.environ.has_key('HOME'):
 
 conf = Configure (env)
 
-have_cxx = conf.TryAction (Action (env['CXX'] + ' --version'))
+have_cxx = conf.TryAction (Action (str(env['CXX']) + ' --version'))
 if have_cxx[0] != 1:
     print "This system has no functional C++ compiler. You cannot build Ardour from source without one."
-    exit (1)
+    sys.exit (1)
 else:
     print "Congratulations, you have a functioning C++ compiler."
 
@@ -950,6 +969,9 @@ env = conf.Finish()
 
 rcbuild = env.SubstInFile ('ardour.rc','ardour.rc.in', SUBST_DICT = subst_dict)
 
+the_revision = env.Command ('frobnicatory_decoy', [], create_stored_revision)
+
+env.Alias('revision', the_revision)
 env.Alias('install', env.Install(os.path.join(config_prefix, 'ardour2'), 'ardour_system.rc'))
 env.Alias('install', env.Install(os.path.join(config_prefix, 'ardour2'), 'ardour.rc'))
 
@@ -959,13 +981,8 @@ Default (rcbuild)
 
 Precious (env['DISTTREE'])
 
-#
-# note the special "cleanfirst" source name. this triggers removal
-# of the existing disttree
-#
-
 env.Distribute (env['DISTTREE'],
-                [ 'SConstruct',
+               [ 'SConstruct', 'svn_revision.h',
                   'COPYING', 'PACKAGER_README', 'README',
                   'ardour.rc.in',
                   'ardour_system.rc',
@@ -989,12 +1006,13 @@ env.Distribute (env['DISTTREE'],
                 glob.glob ('DOCUMENTATION/README*')
                 )
 
-srcdist = env.Tarball(env['TARBALL'], env['DISTTREE'])
+srcdist = env.Tarball(env['TARBALL'], [ env['DISTTREE'], the_revision ])
 env.Alias ('srctar', srcdist)
 
 #
 # don't leave the distree around
 #
+
 env.AddPreAction (env['DISTTREE'], Action ('rm -rf ' + str (File (env['DISTTREE']))))
 env.AddPostAction (srcdist, Action ('rm -rf ' + str (File (env['DISTTREE']))))
 
index 735b19c233291e1223b3f8f38d7b96171bc675da..a8c8b74bfd3513acef0ce94db6ccfe48e1eb9085 100644 (file)
@@ -1,4 +1,4 @@
-<?xml version="1.0"?>
+<?xml version="1.0" encoding="UTF-8"?>
 <Ardour>
   <MIDI-port tag="%MIDITAG%" device="ardour" type="%MIDITYPE%" mode="duplex"/>
   <MIDI-port tag="control" device="ardour" type="%MIDITYPE%" mode="duplex"/>
@@ -31,6 +31,7 @@
     <Option name="quieten-at-speed" value="1.000000"/>
     <Option name="use-vst" value="yes"/>
     <Option name="use-tranzport" value="yes"/>
+    <Option name="destructive-xfade-msecs" value="500"/>
   </Config>
   <extra>
     <Keyboard edit-button="3" edit-modifier="4" delete-button="3" delete-modifier="1" snap-modifier="32"/>
index 05cdcab3fd29ac64b15865e52e8f5fea2af9b8b0..b7f6c22e9b47e86b568639dfa2a9d44cde10d3ed 100644 (file)
@@ -1,4 +1,4 @@
-<?xml version="1.0"?>
+<?xml version="1.0" encoding="UTF-8"?>
 <Ardour>
   <Config>
     <Option name="minimum-disk-io-bytes" value="262144"/>
index 7ef2b668c9bb29433f7d0f19178e8a77635b1eae..bf8e4f560ed9ef14a1dabe2ba1da8cc2805f754d 100644 (file)
@@ -19,6 +19,7 @@ gtkardour.Append(DOMAIN=domain, MAJOR=1,MINOR=0,MICRO=2)
 gtkardour.Append(CCFLAGS="-DPACKAGE=\\\"" + domain + "\\\"")
 gtkardour.Append(CXXFLAGS="-DPACKAGE=\\\"" + domain + "\\\"")
 gtkardour.Append(CXXFLAGS="-DLIBSIGC_DISABLE_DEPRECATED")
+gtkardour.Append(CPPPATH="#/")  # for top level svn_revision.h
 #gtkardour.Append(CXXFLAGS="-DFLOWCANVAS_AA")
 gtkardour.Append(PACKAGE=domain)
 gtkardour.Append(POTFILE=domain + '.pot')
@@ -34,7 +35,7 @@ gtkardour.Merge ([
     libraries['libgnomecanvas2'],
     libraries['libgnomecanvasmm'],
     libraries['sysmidi'],
-    libraries['sndfile'],
+    libraries['sndfile-ardour'],
     libraries['flac'],
     libraries['lrdf'],
     libraries['glibmm2'],
@@ -261,8 +262,6 @@ versionflag = '-DVERSIONSTRING=\\\"' + env['VERSION'] + '\\\"'
 
 gtkardour.Append(CXXFLAGS=versionflag)
 
-gtkardour.VersionBuild(['version.cc','version.h'], 'SConscript')
-
 executable = 'ardour.bin'
 
 ardour = gtkardour.Program(target = executable, source = gtkardour_files + extra_sources)
@@ -310,6 +309,7 @@ env.Alias('install', env.Install(os.path.join(install_prefix, 'share/ardour2'),
 env.Alias('install', env.Install(os.path.join(install_prefix, 'share/ardour2/pixmaps'), pixmap_files))
 env.Alias('install', env.Install(os.path.join(install_prefix, 'share/ardour2/icons'), icon_files))
 
+env.Alias ('version', gtkardour.VersionBuild(['version.cc','version.h'], []))
                
 #dist
 env.Alias ('tarball', env.Distribute (env['DISTTREE'],
index d43273f78668bff4bd70d79f84e319fd9750ed68..959830725e02187eeaa879d01365cd7c761da373 100644 (file)
@@ -32,6 +32,7 @@
 #include "utils.h"
 #include "version.h"
 
+#include "svn_revision.h"
 #include "about.h"
 #include "rgb_macros.h"
 #include "ardour_ui.h"
@@ -139,11 +140,16 @@ static const char* authors[] = {
        N_("Per Sigmond"),
        N_("Doug Mclain"),
        N_("Petter Sundlöf"),
+       N_("Thorsten Wilms"),
+       N_("Ben Loftis"),
+       N_("Stefan Kersten"),
+       N_("Christopher George"),
+       N_("Robert Jordens"),
        0
 };
 
 static const char* translators[] = {
-       N_("French:\n\tAlain Fréhel <alain.frehel@free.fr>\n"),
+       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_("Italian:\n\tFilippo Pappalardo <filippo@email.it>\n"),
        N_("Portuguese:\n\tRui Nuno Capela <rncbc@rncbc.org>\n"),
@@ -184,16 +190,11 @@ About::About ()
                       "under certain conditions; see the file COPYING for details.\n"));
        set_name (X_("ardour"));
        set_website (X_("http://ardour.org/"));
-       set_website_label (X_("visit http://www.ardour.org/"));
-       set_version ((string_compose(_("%1\n(built with ardour/gtk %2.%3.%4 libardour: %5.%6.%7)"), 
+       set_website_label (_("visit http://www.ardour.org/"));
+       set_version ((string_compose(_("%1\n(built from revision %2)"),
                                     VERSIONSTRING, 
-                                    gtk_ardour_major_version, 
-                                    gtk_ardour_minor_version, 
-                                    gtk_ardour_micro_version, 
-                                    libardour_major_version, 
-                                    libardour_minor_version, 
-                                    libardour_micro_version))); 
-
+                                    ardour_svn_revision)));
+       
 
 #ifdef WITH_PAYMENT_OPTIONS
        paypal_button.add (paypal_pixmap);
index 885a23ffc75cb3c0d39f3973536bc07ddc6d9300..2fe305cf84b8e07e52fe641f75fcd6d0e1e29fd7 100644 (file)
@@ -85,15 +85,6 @@ ActionManager::init ()
        }
 }
 
-RefPtr<Action>
-ActionManager::register_action (RefPtr<ActionGroup> group, const char * name, const char * label, slot<void> sl, guint key, Gdk::ModifierType mods)
-{
-       RefPtr<Action> act = register_action (group, name, label, sl);
-       AccelMap::add_entry (act->get_accel_path(), key, mods);
-
-       return act;
-}
-
 RefPtr<Action>
 ActionManager::register_action (RefPtr<ActionGroup> group, const char * name, const char * label, slot<void> sl)
 {
@@ -117,15 +108,6 @@ ActionManager::register_action (RefPtr<ActionGroup> group, const char * name, co
 }
 
 
-RefPtr<Action>
-ActionManager::register_radio_action (RefPtr<ActionGroup> group, RadioAction::Group& rgroup, const char * name, const char * label, slot<void> sl, guint key, Gdk::ModifierType mods)
-{
-       RefPtr<Action> act = register_radio_action (group, rgroup, name, label, sl);
-       AccelMap::add_entry (act->get_accel_path(), key, mods);
-
-       return act;
-}
-
 RefPtr<Action>
 ActionManager::register_radio_action (RefPtr<ActionGroup> group, RadioAction::Group& rgroup, const char * name, const char * label, slot<void> sl)
 {
@@ -137,15 +119,6 @@ ActionManager::register_radio_action (RefPtr<ActionGroup> group, RadioAction::Gr
        return act;
 }
 
-RefPtr<Action>
-ActionManager::register_toggle_action (RefPtr<ActionGroup> group, const char * name, const char * label, slot<void> sl, guint key, Gdk::ModifierType mods)
-{
-       RefPtr<Action> act = register_toggle_action (group,name, label, sl);
-       AccelMap::add_entry (act->get_accel_path(), key, mods);
-
-       return act;
-}
-
 RefPtr<Action>
 ActionManager::register_toggle_action (RefPtr<ActionGroup> group, const char * name, const char * label, slot<void> sl)
 {
index 4a2c3d2a2a7c8d9eedb3a88d5b817a3d21828328..591fe642441b3b7bf74274c57c1159c9f9ce12e5 100644 (file)
@@ -38,20 +38,20 @@ using namespace std;
 using namespace PBD;
 
 static const char* channel_setup_names[] = {
-       "Mono",
-       "Stereo",
-       "3 Channels",
-       "4 Channels",
-       "6 Channels",
-       "8 Channels",
-       "Manual Setup",
+       N_("Mono"),
+       N_("Stereo"),
+       N_("3 Channels"),
+       N_("4 Channels"),
+       N_("6 Channels"),
+       N_("8 Channels"),
+       N_("Manual Setup"),
        "MIDI",
        0
 };
 
 static const char* track_mode_names[] = {
-       "Normal",
-       "Tape",
+       N_("Normal"),
+       N_("Tape"),
        0
 };
 
@@ -67,11 +67,11 @@ AddRouteDialog::AddRouteDialog ()
          routes_spinner (routes_adjustment)
 {
        if (channel_combo_strings.empty()) {
-               channel_combo_strings = PBD::internationalize (channel_setup_names);
+               channel_combo_strings = I18N (channel_setup_names);
        }
 
        if (track_mode_strings.empty()) {
-               track_mode_strings = PBD::internationalize (track_mode_names);
+               track_mode_strings = I18N (track_mode_names);
        }
 
        set_name ("AddRouteDialog");
index 165db68369b31eee048d81fc5509bbd6f0175221..d4109de8bb7c2cdda92a0568175f7fcd72311a8f 100755 (executable)
@@ -3,11 +3,13 @@ cd `dirname "$0"`/..
 #export G_DEBUG=fatal_criticals
 
 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
 
 # DYLD_LIBRARY_PATH is for darwin.
 export DYLD_LIBRARY_PATH=$LD_LIBRARY_PATH
+# For the internal clearlooks engine
+export GTK_PATH=$PWD/libs/clearlooks:~/.ardour2
 
-# LADSPA_PATH for OSX
-export LADSPA_PATH=$LADSPA_PATH:/Library/Audio/Plug-Ins/LADSPA
index 244e21436c653661954336fceddf80e9c117a197..5a0eb469b7fbc7b33b6373ee294c0af02eab2ae9 100644 (file)
 
 (gtk_accel_path "<Actions>/Common/goto-editor" "<alt>e")
 (gtk_accel_path "<Actions>/Common/goto-mixer" "<alt>m")
-(gtk-accel_path "<Actions>/Common/ToggleSoundFileBrowser" "<alt>f")
-(gtk-accel_path "<Actions>/Common/ToggleLocations" "<alt>l")
-(gtk-accel_path "<Actions>/Common/ToggleBigClock" "<alt>b")
-(gtk-accel_path "<Actions>/Common/ToggleColorManager" "<alt>c")
+(gtk_accel_path "<Actions>/Common/ToggleSoundFileBrowser" "<alt>f")
+(gtk_accel_path "<Actions>/Common/ToggleLocations" "<alt>l")
+(gtk_accel_path "<Actions>/Common/ToggleBigClock" "<alt>b")
+(gtk_accel_path "<Actions>/Common/ToggleColorManager" "<alt>c")
 
 (gtk_accel_path "<Actions>/Editor/editor-copy" "<control>c")
 (gtk_accel_path "<Actions>/Common/Quit" "<control>q")
index cc4420823475f979577c4fad636352363c46e3e6..097c72f6d88dd5585e943b935852870a96054256 100644 (file)
@@ -1,18 +1,18 @@
 cWaveForm 0.0 0.0 0.0 0.80
 cMutedWaveForm 0.35 0.35 0.35 1.0
-cSelectedFrameBase 0.0 0.57 0.66 0.5
-cFrameBase 0.0 0.76 0.75 0.5
+cSelectedFrameBase 0.71 0.57 0.66 1.0
+cFrameBase 0.75 0.75 0.76 1.0
 cAudioTrackOutline 0.00 0.00 0.00 1.00
 cAudioTrackBase 0.80 0.80 1.0 0.5
-cAudioBusBase 0.65 0.65 0.75 0.41
+cAudioBusBase 0.86 0.82 0.92 0.41
 cMidiTrackOutline 0.00 0.00 0.00 1.00
 cMidiTrackBase 1.0 0.85 0.85 0.5
 cMidiBusBase 0.75 0.65 0.65 0.41
-cMeterBar 0.40 0.40 0.40 1.0
-cTempoBar 0.45 0.45 0.45 1.0
-cMarkerBar 0.50 0.50 0.50 1.0
-cRangeMarkerBar 0.55 0.55 0.55 1.0
-cTransportMarkerBar 0.60 0.60 0.60 1.0
+cMeterBar 0.40 0.40 0.45 1.0
+cTempoBar 0.45 0.45 0.50 1.0
+cMarkerBar 0.50 0.50 0.55 1.0
+cRangeMarkerBar 0.55 0.55 0.59 1.0
+cTransportMarkerBar 0.60 0.60 0.64 1.0
 cTimeStretchFill 0.89 0.71 0.71 0.59
 cTimeStretchOutline 0.39 0.39 0.39 0.59
 cAutomationLine 0.27 0.74 0.35 1.0
@@ -68,8 +68,8 @@ cEnteredAutomationLine 0.87 0.39 0.39 1.00
 cEnteredMarker 0.87 0.39 0.39 1.00
 cMeterMarker 0.95 0.26 0.36 1.00
 cTempoMarker 0.95 0.26 0.36 1.00
-cMeasureLineBeat 0.55 0.55 0.55 1.00
-cMeasureLineBar 0.45 0.45 0.45 1.00
+cMeasureLineBeat 0.40 0.40 0.40 0.50
+cMeasureLineBar 0.55 0.55 0.60 0.70
 cGhostTrackBaseOutline 0.00 0.00 0.00 1.00
 cGhostTrackBaseFill 0.27 0.00 0.49 0.50
 cImageTrackBase 0.87 0.87 0.85 1.00
index 845acac40080fd2a509c5efbba03708a84b57c59..97441e5023516bebba182f9b887ebb687633d20e 100644 (file)
                    <menuitem action='zoom-focus-playhead'/>
                    <menuitem action='zoom-focus-edit'/>
                </menu>
+              <menu name='SnapMode' action='SnapMode'>
+                  <menuitem action='snap-normal'/>
+                  <menuitem action='snap-magnetic'/>
+              </menu>
                <menu name='SnapTo' action='SnapTo'>
-                   <menuitem action='snap-to-beat'/>
-                   <menuitem action='snap-to-bar'/>
+                  <menuitem action='snap-to-frame'/>
+                  <menuitem action='snap-to-cd-frame'/>
+                  <menuitem action='snap-to-smpte-frame'/>
+                  <menuitem action='snap-to-smpte-seconds'/>
+                  <menuitem action='snap-to-smpte-minutes'/>
+                  <menuitem action='snap-to-seconds'/>
+                  <menuitem action='snap-to-minutes'/>
+                  <menuitem action='snap-to-thirtyseconds'/>
+                  <menuitem action='snap-to-asixteenthbeat'/>
+                  <menuitem action='snap-to-eighths'/>
+                  <menuitem action='snap-to-quarters'/>
+                  <menuitem action='snap-to-thirds'/>
+                  <menuitem action='snap-to-beat'/>
+                  <menuitem action='snap-to-bar'/>
+                  <menuitem action='snap-to-mark'/>
+                  <menuitem action='snap-to-edit-cursor'/>
+                  <menuitem action='snap-to-region-start'/>
+                  <menuitem action='snap-to-region-end'/>
+                  <menuitem action='snap-to-region-sync'/>
+                  <menuitem action='snap-to-region-boundary'/>
                </menu>
                <menu name='MeterFalloff' action='MeterFalloff'>
                     <menuitem action='MeterFalloffOff'/>
                <menuitem action='ToggleOptionsEditor'/>
                <menuitem action='ToggleSoundFileBrowser'/>
                <menuitem action='ToggleInspector'/>
-               <menuitem action='ToggleConnections'/>
                <menuitem action='ToggleLocations'/>
                <menuitem action='ToggleColorManager'/>
                <menuitem action='ToggleBigClock'/>
                        <menuitem action='FileHeaderFormatCAF'/>
                   </menu>
                </menu>
-              <menu action='SMPTE'>
+              <menu action='Timecode'>
                   <menuitem action='Smpte23976'/>
                   <menuitem action='Smpte24'/>
                   <menuitem action='Smpte24976'/>
index b748c9695449485bcfeeaaf80fc38dfa61020bc9..107321024b6c79e0d62c7871cdf335b5b0a64888 100644 (file)
@@ -1,5 +1,7 @@
 #!/bin/sh
 
+export GTK_PATH=%INSTALL_PREFIX%/lib/ardour2:$GTK_PATH
+
 export LD_LIBRARY_PATH=%INSTALL_PREFIX%/lib/ardour2:$LD_LIBRARY_PATH 
 # DYLD_LIBRARY_PATH is for Darwin
 export DYLD_LIBRARY_PATH=$LD_LIBRARY_PATH
index abcfd4c262b2b107d78a868893d7d8d4a68ce1b6..d01534086895a3c3774eb9bc5cc59a6d20295b45 100644 (file)
@@ -86,6 +86,8 @@ style "default_base" = "medium_text"
   GtkButton::button_relief = GTK_RELIEF_NONE
   GtkTreeView::vertical-padding = 0
   GtkTreeView::horizontal-padding = 0
+  GtkTreeView::even-row-color = { 0, 0, 0 }
+  GtkTreeView::odd-row-color = { 0, 0, 0 }
   
   fg[NORMAL] = { 0.80, 0.80, 0.80 }    
   fg[ACTIVE] = { 0.80, 0.80, 0.80 }    
@@ -93,8 +95,8 @@ style "default_base" = "medium_text"
   fg[INSENSITIVE] = { 0.80, 0.80, 0.80 }       
   fg[SELECTED] = { 0.80, 0.80, 0.80 }  
   
-  bg[NORMAL] = { 0.40, 0.41, 0.41 }
-  bg[ACTIVE] = { 0.40, 0.41, 0.41 }
+  bg[NORMAL] = { 0.35, 0.35, 0.40 }
+  bg[ACTIVE] = { 0.35, 0.35, 0.40 }
   bg[PRELIGHT] = "#565690"
   bg[INSENSITIVE] = { 0.10, 0.10, 0.10 }
   bg[SELECTED] = { 0, 0.40, 0.60 }
@@ -105,24 +107,25 @@ style "default_base" = "medium_text"
   text[INSENSITIVE] = { 0.80, 0.80, 0.80}      
   text[SELECTED] = { 1.0, 1.0, 1.0 }
   
-  base[ACTIVE]     = "#2f272f"
-  base[NORMAL]      =  "#1c1e21"
+  base[ACTIVE]     = "#272a2f"
+  base[NORMAL]      =  "#1a1e20"
   base[PRELIGHT]     = { 0.20, 0.20, 0.20 }
   base[INSENSITIVE]  = "#4c5159"
   base[SELECTED]     = { 0.25, 0.25, 0.25 }
-  
-  engine "clearlooks"  {
+
+  engine "clearlooks" 
+  {
     menubarstyle      = 0       # 0 = flat, 1 = sunken, 2 = flat gradient
     menuitemstyle     = 0       # 0 = flat, 1 = 3d-ish (gradient), 2 = 3d-ish (button)
     listviewitemstyle = 0       # 0 = flat, 1 = 3d-ish (gradient)
-    progressbarstyle  = 0       # 0 = candy bar, 1 = flat
+    progressbarstyle  = 1       # 0 = candy bar, 1 = fancy candy bar, 2 = flat
   }
 }
 
 style "base_frame"
 {
        fg[NORMAL] = { 0.80, 0.80, 0.80 }
-       bg[NORMAL] = { 0.40, 0.40, 0.40 }
+       bg[NORMAL] = { 0.35, 0.35, 0.40 }
 }
 
 style "transport_base" = "medium_bold_text"
@@ -136,8 +139,8 @@ style "transport_base" = "medium_bold_text"
 /*
 style "black_mackie_menu_bar" = "medium_bold_text"
 {
-      fg[NORMAL] = { 1.0, 1.0, 1.0 }
-      bg[NORMAL] = { 0, 0, 0 }
+  fg[NORMAL] = { 1.0, 1.0, 1.0 }
+  bg[NORMAL] = { 0, 0, 0 }
 }
 */
 style "default_buttons_menus" 
@@ -145,11 +148,11 @@ style "default_buttons_menus"
   font_name = "sans 8"
   fg[ACTIVE] = { 1.0, 1.0, 1.0 }
   
-  bg[NORMAL] = { 0.35, 0.35, 0.35 }
+  bg[NORMAL] = { 0.30, 0.30, 0.35 }
   bg[ACTIVE] = "#565690"
-  bg[PRELIGHT] = { 0.20, 0.20, 0.20 }
-  bg[INSENSITIVE] = { 0.20, 0.20, 0.20 }
-  bg[SELECTED] = { 0.20, 0.20, 0.20 }  
+  bg[PRELIGHT] = { 0.15, 0.15, 0.20 }
+  bg[INSENSITIVE] = { 0.15, 0.15, 0.20 }
+  bg[SELECTED] = { 0.15, 0.15, 0.20 }  
 }
 
 style "very_small_button" = "default_buttons_menus"
@@ -203,6 +206,15 @@ style "solo_button" = "small_button"
        fg[ACTIVE] = { 0, 0, 0 }
 }
 
+style "safe_solo_button" = "small_button"
+{
+       bg[PRELIGHT] = { 0, 1.0, 0 }
+       bg[ACTIVE] = { 0.19, 0.97, 0.69 }
+
+       fg[PRELIGHT] = { 0, 0, 0 }
+       fg[ACTIVE] = { 0, 0, 0 }
+}
+
 style "mixer_solo_button" = "solo_button"
 {
        font_name = "sans 7"
@@ -211,6 +223,14 @@ style "mixer_solo_button" = "solo_button"
 
 }
 
+style "mixer_safe_solo_button" = "safe_solo_button"
+{
+       font_name = "sans 7"
+       xthickness = 0
+       ythickness = 0
+
+}
+
 
 style "mute_button" = "small_button"
 {
@@ -248,8 +268,8 @@ style "mixer_red_active_button" = "very_small_button"
        fg[ACTIVE] = { 0, 1.0, 1.0 }
        bg[ACTIVE] = { 0.7, 0, 0 }
 
-       base[INSENSITIVE] = { 0.21, 0.21, 0.21 }
-       bg[INSENSITIVE] = { 0.21, 0.21, 0.21 }
+       base[INSENSITIVE] = { 0.16, 0.16, 0.21 }
+       bg[INSENSITIVE] = { 0.16, 0.16, 0.21 }
 }
 
 style "time_button" = "default_buttons_menus"
@@ -277,10 +297,10 @@ style "shuttle_control" = "very_small_text"
        fg[SELECTED] = { 0.85, 0.92, 0.98 }
        fg[INSENSITIVE] = { 0.85, 0.92, 0.98 }
 
-       bg[NORMAL] = { 0.31, 0.31, 0.31 }
-       bg[PRELIGHT] = { 0.31, 0.31, 0.31 }
-       bg[INSENSITIVE] = { 0.31, 0.31, 0.31 }
-       bg[ACTIVE] = { 0.50, 1.0, 0.50 }
+       bg[NORMAL] = { 0.26, 0.26, 0.31 }
+       bg[PRELIGHT] = { 0.26, 0.26, 0.31 }
+       bg[INSENSITIVE] = { 0.26, 0.26, 0.31 }
+       bg[ACTIVE] = { 0.70, 0.70, 0.70 }
        bg[SELECTED] = { 1.0, 0.04, 0.04 }
 }
 
@@ -305,20 +325,20 @@ style "options_window"  = "default_base"
 
 style "option_entry"  = "default_base"
 {
-       fg[NORMAL] = { 0.50, 1.0, 1.0 }
-       fg[ACTIVE] = { 0.50, 1.0, 1.0 }
+       fg[NORMAL] = { 1.0, 1.0, 1.0 }
+       fg[ACTIVE] = { 1.0, 1.0, 1.0 }
        fg[INSENSITIVE] = { 0.80, 0.80, 0.80 }
        
-       base[INSENSITIVE] = { 0.12, 0.12, 0.12 }
+       base[INSENSITIVE] = { 0.07, 0.07, 0.12 }
        
-       bg[NORMAL] = { 0.40, 0.40, 0.40 }
-       bg[ACTIVE] = { 0.40, 0.40, 0.40 }
+       bg[NORMAL] = { 0.35, 0.35, 0.40 }
+       bg[ACTIVE] = { 0.35, 0.35, 0.40 }
 }
 
 style "red_when_active" = "medium_text"
 {
        fg[NORMAL] = { 0.80, 0.80, 0.80 }
-       bg[NORMAL] = { 0.31, 0.31, 0.31 }
+       bg[NORMAL] = { 0.26, 0.26, 0.31 }
 
        fg[ACTIVE] = { 0.80, 0.80, 0.80 }
        bg[ACTIVE] = { 1.0, 0, 0}
@@ -338,13 +358,13 @@ style "xrun_warn"
        bg[ACTIVE] = { 0.09, 1.0, 0.46 }
 }
 /*
-style "menu_bar_base"
+style "menu_bar_base" = "default_base"
 {
-  bg[NORMAL] = { 0, 0, 0 }     
-  bg[ACTIVE] = { 0, 0, 0 }
-  bg[PRELIGHT] = { 0, 0, 0 }
-  bg[INSENSITIVE] = { 0, 0, 0 }
-  bg[SELECTED] = { 0, 0, 0 }
+       bg[NORMAL] = { 0.2, 0.2, 0.3 }
+       bg[ACTIVE] = { 0, 0, 0 }
+       bg[PRELIGHT] = { 0, 0, 0 }
+       bg[INSENSITIVE] = { 0, 0, 0 }
+       bg[SELECTED] = { 0, 0, 0 }
 }
 */
 style "fatal_message" = "medium_text"
@@ -389,15 +409,15 @@ style "warning_message" = "medium_text"
 
 style "medium_entry" = "medium_text"
 {
-       fg[NORMAL] = { 0.50, 1.0, 1.0 }
-       fg[ACTIVE] = { 0.50, 1.0, 1.0 }
-       fg[SELECTED] = { 0.50, 1.0, 0.50 }
+       fg[NORMAL] = { 0.70, 0.70, 0.70 }
+       fg[ACTIVE] = { 0.70, 0.70, 0.70 }
+       fg[SELECTED] = { 1.0, 1.0, 1.0 }
        
-       bg[NORMAL] = { 0.40, 0.40, 0.40 }
+       bg[NORMAL] = { 0.35, 0.35, 0.40 }
        
        base[NORMAL] = { 0, 0, 0 }
        base[ACTIVE] = { 0, 0, 0 }
-       base[SELECTED] = { 0.5, 0.5, 1.0 }
+       base[SELECTED] = { 0.70, 0.70, 0.70 }
 }
 
 style "medium_entry_noselection_fg" = "medium_entry"
@@ -407,15 +427,15 @@ style "medium_entry_noselection_fg" = "medium_entry"
 
 style "medium_entry_noselection_bg" = "medium_entry"
 {
-       bg[SELECTED] = { 0.50, 1.0, 1.0 }
+       bg[SELECTED] = { 1.0, 1.0, 1.0 }
 }
 
 style "medium_bold_entry"  = "medium_bold_text"
 {
-       fg[NORMAL] = { 0.50, 1.0, 1.0 }
-       fg[ACTIVE] = { 0.50, 1.0, 1.0 }
+       fg[NORMAL] = { 0.70, 0.70, 0.70 }
+       fg[ACTIVE] = { 0.70, 0.70, 0.70 }
        
-       bg[NORMAL] = { 0.40, 0.40, 0.40 }
+       bg[NORMAL] = { 0.35, 0.35, 0.40 }
        
        base[NORMAL] = { 0, 0, 0 }
        base[ACTIVE] = { 0, 0, 0 }
@@ -425,8 +445,8 @@ style "medium_bold_entry"  = "medium_bold_text"
 
 style "small_entry" = "small_text"
 {
-       fg[NORMAL] = { 0.50, 1.0, 1.0 }
-       fg[ACTIVE] = { 0.50, 1.0, 1.0 }
+       fg[NORMAL] = { 0.70, 0.70, 0.70 }
+       fg[ACTIVE] = { 0.70, 0.70, 0.70 }
        bg[NORMAL] = { 0.0, 0.0, 0.0 }
        base[NORMAL] = { 0, 0, 0 }
        base[ACTIVE] = { 0, 0, 0 }
@@ -441,10 +461,10 @@ style "red_active_small_entry" = "small_entry"
 
 style "small_bold_entry" = "small_bold_text"
 {
-       fg[NORMAL] = { 0.50, 1.0, 1.0 }
-       fg[ACTIVE] = { 0.50, 1.0, 1.0 }
+       fg[NORMAL] = { 0.70, 0.70, 0.70 }
+       fg[ACTIVE] = { 0.70, 0.70, 0.70 }
        
-       bg[NORMAL] = { 0.40, 0.40, 0.40 }
+       bg[NORMAL] = { 0.35, 0.35, 0.40 }
        
        base[NORMAL] = { 0, 0, 0 }
        base[ACTIVE] = { 0, 0, 0 }
@@ -523,7 +543,7 @@ style "audio_track_base" = "default_base"
 {
   font_name = "sans 6"
   fg[NORMAL] = { 0.77, 0.77, 0.72 }    
-  bg[NORMAL] = { 0.32, 0.32, 0.45 }
+  bg[NORMAL] = { 0.18, 0.19, 0.22 }
   bg[ACTIVE] = { 0.20, 0.20, 0.20 }    
   bg[PRELIGHT] = { 0.20, 0.20, 0.20 }
   bg[INSENSITIVE] = { 0.20, 0.20, 0.20 }
@@ -534,8 +554,9 @@ style "midi_bus_base"
 {
   font_name = "sans 6"
   fg[NORMAL] = { 0.77, 0.77, 0.72 }    
-  fg[NORMAL] = { 0.8, 0.7, 0.2 }       
-  bg[NORMAL] = { 0.26, 0.20, 0.20 }    
+  fg[NORMAL] = { 0.7, 0.8, 0.2 }       
+  #bg[NORMAL] = {0, 0.36, 0.40 }
+  bg[NORMAL] = "#444466"       
 }
 
 style "midi_track_base" = "default_base"
@@ -570,7 +591,7 @@ style "active_track_name_display"
 
 style "track_separator"
 {
-       bg[NORMAL] = { 0.40, 0.40, 0.40 }
+       bg[NORMAL] = { 0.35, 0.35, 0.40 }
 }
 
 #
@@ -626,7 +647,7 @@ style "region_list_display" = "small_bold_text"
 {
        fg[NORMAL] = { 0.80, 0.80, 0.80 }
        fg[ACTIVE] = { 0.80, 0.80, 0.80 }
-       fg[SELECTED] = { 0.50, 1.0, 1.0 }
+       fg[SELECTED] = { 0.70, 0.70, 0.70 }
        bg[NORMAL] = { 0, 0, 0 }
        bg[ACTIVE] = { 0, 0, 0 }
        bg[SELECTED] = { 0, 0, 0 }
@@ -638,11 +659,11 @@ style "region_list_display" = "small_bold_text"
 
 style "main_canvas_area"
 {
-       bg[NORMAL] = { 0.38, 0.38, 0.38 }
-       bg[ACTIVE] = { 0.38, 0.38, 0.38 }
-       bg[INSENSITIVE] = { 0.38, 0.38, 0.38 }
-       bg[SELECTED] = { 0.38, 0.38, 0.38 }
-       bg[PRELIGHT] = { 0.38, 0.38, 0.38 }
+       bg[NORMAL] = { 0.20, 0.20, 0.25 }
+       bg[ACTIVE] = { 0.20, 0.20, 0.25 }
+       bg[INSENSITIVE] = { 0.20, 0.20, 0.25 }
+       bg[SELECTED] = { 0.20, 0.20, 0.25 }
+       bg[PRELIGHT] = { 0.20, 0.20, 0.25 }
 }
 
 style "track_controls_inactive"
@@ -685,7 +706,7 @@ style "plugin_slider"
 
        fg[NORMAL] = { 0.37, 0.43, 0.52 }
        fg[ACTIVE] = { 0.37, 0.43, 0.52 }
-       fg[INSENSITIVE] = {0.40, 0.40, 0.40 } # matches default_base
+       fg[INSENSITIVE] = {0.35, 0.35, 0.40 } # matches default_base
        fg[SELECTED] = { 0.37, 0.43, 0.52 }
        fg[PRELIGHT] = { 0.37, 0.43, 0.52 }
 
@@ -736,7 +757,7 @@ style "redirect_list_display"
 
        font_name = "sans 7"
        text[NORMAL] = { 0.80, 0.80, 0.80 }
-       text[ACTIVE] = { 0.5, 0.5, 0.9 }
+       text[ACTIVE] = { 0.70, 0.70, 0.70 }
        text[INSENSITIVE] = { 0, 0, 0 }
        text[SELECTED] = { 0.9, 0.3, 0.3 }
 
@@ -749,7 +770,7 @@ style "redirect_list_display"
         # text
 
        fg[NORMAL] = { 0.5, 0.5, 0.5 }  # used for inactive
-       fg[ACTIVE] = { 0.5, 1.0, 1.0 }  # used for active
+       fg[ACTIVE] = { 1.0, 1.0, 1.0 }  # used for active
 }
 
 style "inspector_redirect_list_display" = "redirect_list_display"
@@ -768,12 +789,6 @@ style "pan_zone" = "default_base"
        fg[ACTIVE] = { 0.95, 0.48, 0.11 }
 }
 
-style "wall_clock" = "medium_bold_text"
-{
-       fg[NORMAL] = { 1.0, 1.0, 1.0 }
-       bg[NORMAL] = { 0, 0, 0 }
-}
-
 style "paler_red_when_active" = "medium_text"
 {
        fg[NORMAL] = { 0.80, 0.80, 0.80 }
@@ -812,31 +827,85 @@ style "selected_strip_frame"
 style "flashing_alert" = "very_small_text"
 {
        fg[NORMAL] = { 0.80, 0.80, 0.80 }
-       bg[NORMAL] = { 0.31, 0.31, 0.31 }
+       bg[NORMAL] = { 0.26, 0.26, 0.31 }
 
        fg[ACTIVE] = { 0.80, 0.80, 0.80 }
        bg[ACTIVE] = { 1.0, 0, 0}
 }
 
-style "selected_io_selector_port_list" = "medium_text"
+style "selected_io_selector_port_list" = "medium_bold_text"
 {
-       fg[NORMAL] = { 0.50, 1.0, 1.0 }
-       fg[SELECTED] = { 0.50, 1.0, 1.0 }
-       base[NORMAL] = { 0, 0, 0 }
-       base[SELECTED] = { 0, 0, 0 }
+
+       GtkTreeView::even-row-color = { 0.64, 0.68, 0.54 }
+       GtkTreeView::odd-row-color = { 0.64, 0.68, 0.54 }
+
+# fg is used to color the fg (text) of the column header button
+
+       fg[NORMAL] = { 0.80, 0.80, 0.70 }
+       fg[SELECTED] = { 0.80, 0.80, 0.70 }
+       fg[ACTIVE] = { 0.80, 0.80, 0.70 }
+       fg[PRELIGHT] = { 0.80, 0.80, 0.70 }
+       fg[INSENSITIVE] = { 0.80, 0.80, 0.70 }
+
+# bg is used used to color the background of the column header button
+
+       bg[NORMAL] = { 0.30, 0.30, 0.35 }
+       bg[ACTIVE] = { 0.30, 0.30, 0.35 }
+       bg[PRELIGHT] = { 0.30, 0.30, 0.35 }
+       bg[INSENSITIVE] = { 0.30, 0.30, 0.35 }
+       bg[SELECTED] = { 0.30, 0.30, 0.35 }
+
+# text is used to color the treeview row text
+
+       text[NORMAL] = { 0.80, 0.80, 0.70 }
+       text[SELECTED] = { 0.80, 0.80, 0.70 }
+
+# base is used to color a treeview with no rows
+
+       base[NORMAL] = { 0.64, 0.68, 0.54 }
+       base[ACTIVE] = { 0.64, 0.68, 0.54 }
+       base[PRELIGHT] = { 0.64, 0.68, 0.54 }
+       base[INSENSITIVE] = { 0.64, 0.68, 0.54 }
+       base[SELECTED] = { 0.64, 0.68, 0.54 }
+
 }
 
 style "io_selector_port_list" = "medium_text"
 {
-       fg[NORMAL] = {0.80, 0.80, 0.70 }
-       fg[SELECTED] = {0.80, 0.80, 0.70 }
-       base[NORMAL] = { 0.26, 0.26, 0.26 }
-       base[SELECTED] = { 0.26, 0.26, 0.26 }
+
+# fg is used to color the fg (text) of the column header button
+
+       fg[NORMAL] = { 0.80, 0.80, 0.70 }
+       fg[SELECTED] = { 0.80, 0.80, 0.70 }
+       fg[ACTIVE] = { 0.80, 0.80, 0.70 }
+       fg[PRELIGHT] = { 0.80, 0.80, 0.70 }
+       fg[INSENSITIVE] = { 0.80, 0.80, 0.70 }
+
+# bg is used used to color the background of the column header button
+
+       bg[NORMAL] = { 0.30, 0.30, 0.35 }
+       bg[ACTIVE] = { 0.30, 0.30, 0.35 }
+       bg[PRELIGHT] = { 0.30, 0.30, 0.35 }
+       bg[INSENSITIVE] = { 0.30, 0.30, 0.35 }
+       bg[SELECTED] = { 0.30, 0.30, 0.35 }
+
+# text is used to color the treeview row text
+
+       text[NORMAL] = { 0.80, 0.80, 0.70 }
+       text[SELECTED] = { 0.80, 0.80, 0.70 }
+
+# base is used to color a treeview with no rows
+
+       base[NORMAL] = { 0, 0, 0 }
+       base[ACTIVE] = { 0, 0, 0 }
+       base[PRELIGHT] = { 0, 0, 0 }
+       base[INSENSITIVE] = { 0, 0, 0 }
+       base[SELECTED] = { 0, 0, 0 }
 }
 
 style "io_selector_notebook" = "default_base"
 {
-       fg[NORMAL] = { 0.50, 1.0, 1.0 }
+       fg[NORMAL] = { 1.0, 1.0, 1.0 }
         font_name ="sans bold 8"
 }
 
@@ -880,11 +949,11 @@ style "pan_slider"
        bg[SELECTED] = { 0, 0, 0 }
        bg[PRELIGHT] = { 0, 0, 0 }
 
-       text[NORMAL] = { 0.85, 0.92, 0.98 }
-       text[ACTIVE] = { 0.85, 0.92, 0.98 }
-       text[INSENSITIVE] = { 0.85, 0.92, 0.98 }
-       text[SELECTED] = { 0.85, 0.92, 0.98 }
-       text[PRELIGHT] = { 0.85, 0.92, 0.98 }
+       text[NORMAL] = { 0.70, 0.70, 0.70 }
+       text[ACTIVE] = { 0.70, 0.70, 0.70 }
+       text[INSENSITIVE] = { 0.70, 0.70, 0.70 }
+       text[SELECTED] = { 0.70, 0.70, 0.70 }
+       text[PRELIGHT] = { 0.70, 0.70, 0.70 }
 }
 
 style "region_list_whole_file"
@@ -966,8 +1035,8 @@ widget "*EditorTimeButton*" style "time_button"
 widget "*EditorMixerButton*" style "default_buttons_menus"
 widget "*SoloButton*" style "solo_button"
 widget "*SoloButton.*" style "solo_button"
-widget "*SafeSoloButton*" style "solo_button"
-widget "*SafeSoloButton.*" 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"
@@ -1116,8 +1185,6 @@ widget "*MixerTrackDisplayList" style "track_list_display"
 widget "*MixerSnapshotDisplayList" style "track_list_display"
 widget "*MixerAuxDisplayList" style "track_list_display"
 widget "*MixerGroupList" style "track_list_display"
-/*widget "*WallClock" style "wall_clock"
-widget "*CPULoad" style "wall_clock"*/
 widget "*RegionEditorLabel" style "medium_text"
 widget "*RegionEditorSmallLabel" style "small_text"
 widget "*RegionEditorEntry" style "medium_entry"
@@ -1151,7 +1218,9 @@ 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"
index cc7b43b6b63b3e7a128644925272bb5449cb6a0d..58e60f7627e7795d3cb25b3c85b5cd73053cf598 100644 (file)
@@ -542,11 +542,11 @@ ARDOUR_UI::update_buffer_load ()
 }
 
 void
-ARDOUR_UI::count_recenabled_diskstreams (Route& route)
+ARDOUR_UI::count_recenabled_streams (Route& route)
 {
        Track* track = dynamic_cast<Track*>(&route);
        if (track && track->diskstream()->record_enabled()) {
-               rec_enabled_diskstreams++;
+               rec_enabled_streams += track->n_inputs().get_total();
        }
 }
 
@@ -568,11 +568,11 @@ ARDOUR_UI::update_disk_space()
                int secs;
                nframes_t fr = session->frame_rate();
                
-               rec_enabled_diskstreams = 0;
-               session->foreach_route (this, &ARDOUR_UI::count_recenabled_diskstreams);
+               rec_enabled_streams = 0;
+               session->foreach_route (this, &ARDOUR_UI::count_recenabled_streams);
                
-               if (rec_enabled_diskstreams) {
-                       frames /= rec_enabled_diskstreams;
+               if (rec_enabled_streams) {
+                       frames /= rec_enabled_streams;
                }
                
                hrs  = frames / (fr * 3600);
@@ -1038,7 +1038,7 @@ ARDOUR_UI::transport_stop ()
                return;
        }
        
-       if (Config->get_auto_loop()) {
+       if (session->get_play_loop ()) {
                session->request_play_loop (false);
        }
        
@@ -1092,7 +1092,7 @@ ARDOUR_UI::transport_roll ()
 
        rolling = session->transport_rolling ();
 
-       if (Config->get_auto_loop()) {
+       if (session->get_play_loop()) {
                session->request_play_loop (false);
                auto_loop_button.set_active (false);
                roll_button.set_active (true);
@@ -1110,7 +1110,7 @@ void
 ARDOUR_UI::transport_loop()
 {
        if (session) {
-               if (Config->get_auto_loop()) {
+               if (session->get_play_loop()) {
                        if (session->transport_rolling()) {
                                Location * looploc = session->locations()->auto_loop_location();
                                if (looploc) {
@@ -1269,7 +1269,6 @@ ARDOUR_UI::engine_stopped ()
        ActionManager::set_sensitive (ActionManager::jack_opposite_sensitive_actions, true);
 }
 
-
 void
 ARDOUR_UI::engine_running ()
 {
@@ -1471,7 +1470,6 @@ ARDOUR_UI::snapshot_session ()
 
        prompter.set_name ("Prompter");
        prompter.add_button (Gtk::Stock::SAVE, Gtk::RESPONSE_ACCEPT);
-       prompter.set_response_sensitive (Gtk::RESPONSE_ACCEPT, false);
        prompter.set_prompt (_("Name of New Snapshot"));
        prompter.set_initial_text (now);
        
@@ -1621,7 +1619,6 @@ ARDOUR_UI::save_template ()
        prompter.set_prompt (_("Name for mix template:"));
        prompter.set_initial_text(session->name() + _("-template"));
        prompter.add_button (Gtk::Stock::SAVE, Gtk::RESPONSE_ACCEPT);
-       prompter.set_response_sensitive (Gtk::RESPONSE_ACCEPT, false);
 
        switch (prompter.run()) {
        case RESPONSE_ACCEPT:
@@ -1646,18 +1643,25 @@ ARDOUR_UI::new_session (bool startup, std::string predetermined_path)
        int response = Gtk::RESPONSE_NONE;
 
        new_session_dialog->set_modal(true);
-       new_session_dialog->set_name(predetermined_path);
+       new_session_dialog->set_name (predetermined_path);
        new_session_dialog->reset_recent();
        new_session_dialog->show();
 
        do {
                response = new_session_dialog->run ();
+               
+               _session_is_new = false;
 
-               if(response == Gtk::RESPONSE_CANCEL || response == Gtk::RESPONSE_DELETE_EVENT) {
-                       quit();
+               if (response == Gtk::RESPONSE_CANCEL || response == Gtk::RESPONSE_DELETE_EVENT) {
+
+                       if (!session) {
+                               quit();
+                       }
+                       new_session_dialog->hide ();
                        return;
 
                } else if (response == Gtk::RESPONSE_NONE) {
+
                        /* Clear was pressed */
                        new_session_dialog->reset();
 
@@ -1709,8 +1713,6 @@ ARDOUR_UI::new_session (bool startup, std::string predetermined_path)
                        
                        } else {
 
-                               _session_is_new = true;
-                             
                                if (session_name.empty()) {
                                        response = Gtk::RESPONSE_NONE;
                                        continue;
@@ -1726,14 +1728,43 @@ ARDOUR_UI::new_session (bool startup, std::string predetermined_path)
                                } else {
 
                                        session_path = new_session_dialog->session_folder();
-                                       
+
                                }
-                       
+                               
                                //XXX This is needed because session constructor wants a 
                                //non-existant path. hopefully this will be fixed at some point.
                                
                                session_path = Glib::build_filename (session_path, session_name);
                                                
+                               if (g_file_test (session_path.c_str(), GFileTest (G_FILE_TEST_EXISTS | G_FILE_TEST_IS_DIR))) {
+
+                                       Glib::ustring str = string_compose (_("This session\n%1\nalready exists. Do you want to open it?"), session_path);
+
+                                       MessageDialog msg (str,
+                                                          false,
+                                                          Gtk::MESSAGE_WARNING,
+                                                          Gtk::BUTTONS_YES_NO,
+                                                          true);
+
+
+                                       msg.set_name (X_("CleanupDialog"));
+                                       msg.set_wmclass (_("existing_session"), "Ardour");
+                                       msg.set_position (Gtk::WIN_POS_MOUSE);
+                                       
+                                       switch (msg.run()) {
+                                       case RESPONSE_YES:
+                                               load_session (session_path, session_name);
+                                               goto done;
+                                               break;
+                                       default:
+                                               response = RESPONSE_NONE;
+                                               new_session_dialog->reset ();
+                                               continue;
+                                       }
+                               }
+
+                               _session_is_new = true;
+
                                std::string template_name = new_session_dialog->session_template_name();
                                                
                                if (new_session_dialog->use_session_template()) {
@@ -1793,6 +1824,7 @@ ARDOUR_UI::new_session (bool startup, std::string predetermined_path)
                
        } while (response == Gtk::RESPONSE_NONE);
 
+  done:
        show();
        new_session_dialog->get_window()->set_cursor();
        new_session_dialog->hide();
@@ -1844,6 +1876,9 @@ This prevents the session from being loaded."));
        Config->set_current_owner (ConfigVariableBase::Interface);
 
        session_loaded = true;
+
+       goto_editor_window ();
+
        return 0;
 }
 
@@ -1911,10 +1946,6 @@ ARDOUR_UI::show ()
 
                shown_flag = true;
        }
-       
-       if (about) {
-               about->present ();
-       }
 }
 
 void
@@ -1922,8 +1953,16 @@ ARDOUR_UI::show_splash ()
 {
        if (about == 0) {
                about = new About();
+               about->signal_response().connect(mem_fun (*this, &ARDOUR_UI::about_signal_response) );
        }
        about->present();
+       flush_pending ();
+}
+
+void
+ARDOUR_UI::about_signal_response(int response)
+{
+       hide_splash();
 }
 
 void
@@ -1947,7 +1986,7 @@ ARDOUR_UI::display_cleanup_results (Session::cleanup_report& rep, const gchar* l
                                    _("No audio files were ready for cleanup"), 
                                    true,
                                    Gtk::MESSAGE_INFO,
-                                   (Gtk::ButtonsType)(Gtk::BUTTONS_CLOSE)  );
+                                   (Gtk::ButtonsType)(Gtk::BUTTONS_OK)  );
                msgd.set_secondary_text (_("If this seems suprising, \n\
 check for any existing snapshots.\n\
 These may still include regions that\n\
index d3723e87a5240fb55263328f5bae9a5dd8b93742..60b3b309b946fc345c8e2854ef793d6991c6142b 100644 (file)
@@ -151,7 +151,6 @@ class ARDOUR_UI : public Gtkmm2ext::UI
        void toggle_big_clock_window ();
        void toggle_connection_editor ();
        void toggle_route_params_window ();
-       void toggle_tempo_window ();
        void toggle_editing_space();
 
        Gtk::Tooltips& tooltips() { return _tooltips; }
@@ -168,7 +167,6 @@ class ARDOUR_UI : public Gtkmm2ext::UI
        void rec_enable_button_blink (bool onoff, ARDOUR::AudioDiskstream *, Gtk::Widget *w);
 
        void name_io_setup (ARDOUR::AudioEngine&, string&, ARDOUR::IO& io, bool in);
-       void choose_io (ARDOUR::IO&, bool input);
 
        static gint hide_and_quit (GdkEventAny *ev, ArdourDialog *);
 
@@ -227,7 +225,6 @@ class ARDOUR_UI : public Gtkmm2ext::UI
        void toggle_click ();
 
        void toggle_session_auto_loop ();
-       void toggle_session_punch_in ();
        
        void toggle_options_window ();
 
@@ -284,14 +281,10 @@ class ARDOUR_UI : public Gtkmm2ext::UI
        Gtk::Table          option_table;
 
        int  setup_windows ();
-       void setup_session_menu ();
        void setup_transport ();
        void setup_clock ();
-       void setup_session_info ();
        void setup_adjustables ();
 
-       Gtk::MenuBar* make_menubar ();
-       
        static ARDOUR_UI *theArdourUI;
 
        void startup ();
@@ -299,8 +292,6 @@ class ARDOUR_UI : public Gtkmm2ext::UI
 
        void finish();
        int  ask_about_saving_session (const string & why);
-       gint ask_about_save_deleted (GdkEventAny*);
-       void save_session_choice_made (int);
        int  save_the_session;
 
        void queue_transport_change ();
@@ -314,8 +305,6 @@ class ARDOUR_UI : public Gtkmm2ext::UI
 
        void use_config ();
 
-       void clear_meters ();
-
        static gint _blink  (void *);
        void blink ();
        gint blink_timeout_tag;
@@ -326,6 +315,8 @@ class ARDOUR_UI : public Gtkmm2ext::UI
        void control_methods_adjusted ();
        void mmc_device_id_adjusted ();
 
+       void about_signal_response(int response);
+
   private:
        Gtk::VBox     top_packer;
 
@@ -444,8 +435,6 @@ class ARDOUR_UI : public Gtkmm2ext::UI
        void allow_mmc_and_local ();
        void allow_local_only ();
 
-       static void rate_printer (char buf[32], Gtk::Adjustment &, void *);
-
        Gtk::Menu*        session_popup_menu;
 
        struct RecentSessionModelColumns : public Gtk::TreeModel::ColumnRecord {
@@ -465,7 +454,6 @@ class ARDOUR_UI : public Gtkmm2ext::UI
        Gtk::FileChooserDialog* open_session_selector;
        
        void build_session_selector();
-       void recent_session_selection_changed ();
        void redisplay_recent_sessions();
        void recent_session_row_activated (const Gtk::TreePath& path, Gtk::TreeViewColumn* col);
 
@@ -483,7 +471,6 @@ class ARDOUR_UI : public Gtkmm2ext::UI
 
        void build_menu_bar ();
        void build_control_surface_menu ();
-       void pack_toplevel_controls();
 
        Gtk::Label   wall_clock_label;
        Gtk::EventBox wall_clock_box;
@@ -521,8 +508,6 @@ class ARDOUR_UI : public Gtkmm2ext::UI
        
        void open_session ();
        void open_recent_session ();
-       void open_ok_clicked ();
-
        void save_template ();
 
        void session_add_audio_route (bool disk, int32_t input_channels, int32_t output_channels, ARDOUR::TrackMode mode, uint32_t how_many);
@@ -544,14 +529,11 @@ class ARDOUR_UI : public Gtkmm2ext::UI
        void transport_rewind (int option);
        void transport_loop ();
 
-       void transport_locating ();
        void transport_rolling ();
        void transport_rewinding ();
        void transport_forwarding ();
        void transport_stopped ();
 
-       void send_all_midi_feedback ();
-       
        bool _session_is_new;
        void connect_to_session (ARDOUR::Session *);
        void connect_dependents_to_session (ARDOUR::Session *);
@@ -563,9 +545,6 @@ class ARDOUR_UI : public Gtkmm2ext::UI
 
        void snapshot_session ();
 
-       void map_record_state ();
-       void queue_map_record_state ();
-
        Mixer_UI   *mixer;
        int         create_mixer ();
        
@@ -591,7 +570,6 @@ class ARDOUR_UI : public Gtkmm2ext::UI
        /* route dialog */
 
        AddRouteDialog *add_route_dialog;
-       void add_route_dialog_done (int status);
 
        /* SoundFile Browser */
        SoundFileBrowser *sfdb;
@@ -604,15 +582,13 @@ class ARDOUR_UI : public Gtkmm2ext::UI
 
        /* Keymap handling */
 
-       Glib::RefPtr<Gtk::ActionGroup> get_common_actions();
        void install_actions ();
-       void test_binding_action (const char *);
        void start_keyboard_prefix();
 
        void toggle_record_enable (uint32_t);
 
-       uint32_t rec_enabled_diskstreams;
-       void count_recenabled_diskstreams (ARDOUR::Route&);
+       uint32_t rec_enabled_streams;
+       void count_recenabled_streams (ARDOUR::Route&);
 
        About* about;
        bool shown_flag;
@@ -631,8 +607,6 @@ class ARDOUR_UI : public Gtkmm2ext::UI
        struct timeval last_peak_grab;
        struct timeval last_shuttle_request;
 
-       void editor_display_control_changed (Editing::DisplayControl c);
-
        bool have_disk_overrun_displayed;
        bool have_disk_underrun_displayed;
 
@@ -678,7 +652,6 @@ class ARDOUR_UI : public Gtkmm2ext::UI
        void toggle_StopTransportAtEndOfSession();
        void toggle_GainReduceFastTransport();
        void toggle_LatchedSolo();
-       void toggle_SoloViaBus();
        void toggle_LatchedRecordEnable ();
 
        void mtc_port_changed ();
index 7f724312aa8dc6b6a15eb4a81a361975ceebdce6..25fe14423340031fe9c63fce1c0828d0fcb56c8d 100644 (file)
@@ -139,7 +139,7 @@ ARDOUR_UI::transport_rolling ()
                roll_button.set_active (false);
                auto_loop_button.set_active (false);
 
-       } else if (Config->get_auto_loop ()) {
+       } else if (session->get_play_loop ()) {
                auto_loop_button.set_active (true);
                play_selection_button.set_active (false);
                roll_button.set_active (false);
index 82147f04ee2be550ea3e6d86cdb7e588f6d7f86f..707d3109f7275d5ec2dfb3c24eb9cdb243839854 100644 (file)
@@ -280,7 +280,7 @@ void
 ARDOUR_UI::toggle_session_auto_loop ()
 {
        if (session) {
-               if (Config->get_auto_loop()) {
+               if (session->get_play_loop()) {
                        if (session->transport_rolling()) {
                                transport_roll();
                        } else {
@@ -769,8 +769,6 @@ ARDOUR_UI::parameter_changed (const char* parameter_name)
                map_solo_model ();
        } else if (PARAM_IS ("auto-play")) {
                ActionManager::map_some_state ("Transport", "ToggleAutoPlay", &Configuration::get_auto_play);
-       } else if (PARAM_IS ("auto-loop")) {
-               ActionManager::map_some_state ("Transport", "Loop", &Configuration::get_auto_loop);
        } else if (PARAM_IS ("auto-return")) {
                ActionManager::map_some_state ("Transport", "ToggleAutoReturn", &Configuration::get_auto_return);
        } else if (PARAM_IS ("auto-input")) {
index 575f45ca381134fa3413dde535ffe4ff8c8c2dee..4ec8c1b89f99881a61db96f8235a8d5817fc2437 100644 (file)
@@ -1712,7 +1712,7 @@ AudioClock::build_ops_menu ()
        MenuList& mode_items = mode_menu->items();
        mode_menu->set_name ("ArdourContextMenu");
        
-       mode_items.push_back (MenuElem (_("SMPTE"), bind (mem_fun(*this, &AudioClock::set_mode), SMPTE)));
+       mode_items.push_back (MenuElem (_("Timecode"), bind (mem_fun(*this, &AudioClock::set_mode), SMPTE)));
        mode_items.push_back (MenuElem (_("Bars:Beats"), bind (mem_fun(*this, &AudioClock::set_mode), BBT)));
        mode_items.push_back (MenuElem (_("Minutes:Seconds"), bind (mem_fun(*this, &AudioClock::set_mode), MinSec)));
        mode_items.push_back (MenuElem (_("Audio Frames"), bind (mem_fun(*this, &AudioClock::set_mode), Frames)));
index b6bb4589a9a950e8a4f5416de2de7fef3db4f3a7..c5645d479cabb1e5b799a4045c620bc653da8353 100644 (file)
     $Id$
 */
 
+#include <pbd/memento_command.h>
+
 #include <ardour/audioregion.h>
+#include <ardour/playlist.h>
 #include <ardour/utils.h>
 #include <gtkmm2ext/utils.h>
 #include <gtkmm2ext/stop_signal.h>
@@ -42,28 +45,12 @@ AudioRegionEditor::AudioRegionEditor (Session& s, boost::shared_ptr<AudioRegion>
          _region (r),
          _region_view (rv),
          name_label (_("NAME:")),
-         lock_button (_("lock")),
-         mute_button (_("mute")),
-         opaque_button (_("opaque")),
-         envelope_active_button(_("active")),
-         envelope_view_button(_("visible")),
-         raise_arrow (Gtk::ARROW_UP, Gtk::SHADOW_OUT),
-         lower_arrow (Gtk::ARROW_DOWN, Gtk::SHADOW_OUT),
-         layer_label (_("Layer")),
          audition_button (_("play")),
          time_table (3, 2),
          start_clock ("AudioRegionEditorClock", true),
          end_clock ("AudioRegionEditorClock", true),
          length_clock ("AudioRegionEditorClock", true, true),
-         sync_offset_clock ("AudioRegionEditorClock", true, true),
-         envelope_loop_table (1, 3),
-         envelope_label (_("ENVELOPE")),
-         fade_in_table (4, 3),
-         fade_in_length_adjustment (5.0, 0.0, 10000, 0.05, 1),
-         fade_in_length_spinner (fade_in_length_adjustment, 10),
-         fade_out_table (4, 3),
-         fade_out_length_adjustment (5.0, 0.0, 10000, 0.05, 1),
-         fade_out_length_spinner (fade_out_length_adjustment, 10)
+         sync_offset_clock ("AudioRegionEditorClock", true, true)
 
 {
        start_clock.set_session (&_session);
@@ -77,66 +64,15 @@ AudioRegionEditor::AudioRegionEditor (Session& s, boost::shared_ptr<AudioRegion>
        name_hbox.pack_start (name_label, false, false);
        name_hbox.pack_start (name_entry, false, false);
 
-       raise_button.add (raise_arrow);
-       lower_button.add (lower_arrow);
-       layer_frame.set_name ("BaseFrame");
-       layer_frame.set_shadow_type (Gtk::SHADOW_IN);
-       layer_frame.add (layer_value_label);
-       layer_label.set_name ("AudioRegionEditorLabel");
-       layer_value_label.set_name ("AudioRegionEditorLabel");
-       Gtkmm2ext::set_size_request_to_display_given_text (layer_value_label, "99", 5, 2);
-
-       layer_hbox.set_spacing (5);
-       layer_hbox.pack_start (layer_label, false, false);
-       layer_hbox.pack_start (layer_frame, false, false);
-#if 0
-       layer_hbox.pack_start (raise_button, false, false);
-       layer_hbox.pack_start (lower_button, false, false);
-#endif
-
-       mute_button.set_name ("AudioRegionEditorToggleButton");
-       opaque_button.set_name ("AudioRegionEditorToggleButton");
-       lock_button.set_name ("AudioRegionEditorToggleButton");
-       envelope_active_button.set_name ("AudioRegionEditorToggleButton");
-       envelope_view_button.set_name ("AudioRegionEditorToggleButton");
-       fade_in_active_button.set_name ("AudioRegionEditorToggleButton");
-       fade_out_active_button.set_name ("AudioRegionEditorToggleButton");
-       audition_button.set_name ("AudioRegionEditorToggleButton");
-
-       ARDOUR_UI::instance()->tooltips().set_tip (mute_button, _("mute this region"));
-       ARDOUR_UI::instance()->tooltips().set_tip (opaque_button, _("regions underneath this one cannot be heard"));
-       ARDOUR_UI::instance()->tooltips().set_tip (lock_button, _("prevent any changes to this region"));
-       ARDOUR_UI::instance()->tooltips().set_tip (envelope_active_button, _("use the gain envelope during playback"));
-       ARDOUR_UI::instance()->tooltips().set_tip (envelope_view_button, _("show the gain envelope"));
-       ARDOUR_UI::instance()->tooltips().set_tip (fade_in_active_button, _("use fade in curve during playback"));
-       ARDOUR_UI::instance()->tooltips().set_tip (fade_out_active_button, _("use fade out curve during playback"));
        ARDOUR_UI::instance()->tooltips().set_tip (audition_button, _("audition this region"));
 
-       mute_button.unset_flags (Gtk::CAN_FOCUS);
-       opaque_button.unset_flags (Gtk::CAN_FOCUS);
-       lock_button.unset_flags (Gtk::CAN_FOCUS);
-       envelope_active_button.unset_flags (Gtk::CAN_FOCUS);
-       envelope_view_button.unset_flags (Gtk::CAN_FOCUS);
-       fade_in_active_button.unset_flags (Gtk::CAN_FOCUS);
-       fade_out_active_button.unset_flags (Gtk::CAN_FOCUS);
        audition_button.unset_flags (Gtk::CAN_FOCUS);
        
-       mute_button.set_events (mute_button.get_events() & ~(Gdk::ENTER_NOTIFY_MASK|Gdk::LEAVE_NOTIFY_MASK));
-       opaque_button.set_events (opaque_button.get_events() & ~(Gdk::ENTER_NOTIFY_MASK|Gdk::LEAVE_NOTIFY_MASK));
-       lock_button.set_events (lock_button.get_events() & ~(Gdk::ENTER_NOTIFY_MASK|Gdk::LEAVE_NOTIFY_MASK));
-       envelope_active_button.set_events (envelope_active_button.get_events() & ~(Gdk::ENTER_NOTIFY_MASK|Gdk::LEAVE_NOTIFY_MASK));
-       envelope_view_button.set_events (envelope_view_button.get_events() & ~(Gdk::ENTER_NOTIFY_MASK|Gdk::LEAVE_NOTIFY_MASK));
-       fade_in_active_button.set_events (fade_in_active_button.get_events() & ~(Gdk::ENTER_NOTIFY_MASK|Gdk::LEAVE_NOTIFY_MASK));
-       fade_out_active_button.set_events (fade_out_active_button.get_events() & ~(Gdk::ENTER_NOTIFY_MASK|Gdk::LEAVE_NOTIFY_MASK));
        audition_button.set_events (audition_button.get_events() & ~(Gdk::ENTER_NOTIFY_MASK|Gdk::LEAVE_NOTIFY_MASK));
 
        top_row_button_hbox.set_border_width (5);
        top_row_button_hbox.set_spacing (5);
        top_row_button_hbox.set_homogeneous (false);
-       top_row_button_hbox.pack_start (mute_button, false, false);
-       top_row_button_hbox.pack_start (opaque_button, false, false);
-       top_row_button_hbox.pack_start (lock_button, false, false);
-       top_row_button_hbox.pack_start (layer_hbox, false, false, 5);
        top_row_button_hbox.pack_end (audition_button, false, false);
        
        top_row_hbox.pack_start (name_hbox, true, true);
@@ -170,87 +106,9 @@ AudioRegionEditor::AudioRegionEditor (Session& s, boost::shared_ptr<AudioRegion>
        time_table.attach (length_alignment, 0, 1, 2, 3, Gtk::FILL, Gtk::FILL);
        time_table.attach (length_clock, 1, 2, 2, 3, Gtk::FILL, Gtk::FILL);
 
-       envelope_label.set_name ("AudioRegionEditorLabel");
-
-       envelope_loop_table.set_border_width (5);
-       envelope_loop_table.set_row_spacings (2);
-       envelope_loop_table.attach (envelope_label, 0, 1, 0, 1, Gtk::FILL, Gtk::FILL);
-       envelope_loop_table.attach (envelope_active_button, 0, 1, 1, 2, Gtk::FILL|Gtk::EXPAND, Gtk::FILL);
-       envelope_loop_table.attach (envelope_view_button, 0, 1, 2, 3, Gtk::FILL|Gtk::EXPAND, Gtk::FILL);
-
-       /* fade in */
-
-       fade_in_table.set_border_width (5);
-       fade_in_table.set_homogeneous (false);
-
-       fade_in_label.set_name ("AudioRegionEditorLabel");
-       fade_in_active_button_label.set_name ("AudioRegionEditorSmallLabel");
-       fade_in_length_label.set_name ("AudioRegionEditorSmallLabel");
-
-       fade_in_label.set_text (_("FADE IN"));
-       fade_in_active_button_label.set_text (_("active"));
-       fade_in_length_label.set_text (_("msecs"));
-
-       fade_in_active_button.add (fade_in_active_button_label);
-
-       fade_in_length_spinner.set_name("GenericSpinner");
-
-       fade_in_length_spinner.set_digits (3);
-
-       // fade_in_length_spinner.signal_activate().connect (mem_fun(*this, &AudioRegionEditor::activation));
-
-       Gtkmm2ext::set_size_request_to_display_given_text (fade_in_length_spinner, "500g", 20, -1);
-
-       fade_in_label_align.add (fade_in_label);
-       fade_in_label_align.set (0.5);
-
-
-       fade_in_table.attach (fade_in_label_align,   0, 2, 0, 1, Gtk::FILL|Gtk::EXPAND, Gtk::FILL);
-
-       fade_in_table.attach (fade_in_length_label,   0, 1, 1, 2, Gtk::EXPAND, Gtk::FILL);
-       fade_in_table.attach (fade_in_length_spinner, 0, 1, 2, 3, Gtk::FILL|Gtk::EXPAND, Gtk::FILL);
-
-       fade_in_table.attach (fade_in_active_button,        0, 2, 3, 5, Gtk::FILL|Gtk::EXPAND, Gtk::FILL);
-
-       /* fade out */
-
-       fade_out_table.set_border_width (5);
-       fade_out_table.set_homogeneous (false);
-
-       fade_out_label.set_name ("AudioRegionEditorLabel");
-       fade_out_active_button_label.set_name ("AudioRegionEditorSmallLabel");
-       fade_out_length_label.set_name ("AudioRegionEditorSmallLabel");
-
-       fade_out_label.set_text (_("FADE OUT"));
-       fade_out_active_button_label.set_text (_("active"));
-       fade_out_length_label.set_text (_("msecs"));
-
-       fade_out_active_button.add (fade_out_active_button_label);
-
-       fade_out_length_spinner.set_name("GenericSpinner");
-       
-       fade_out_length_spinner.set_digits (3);
-
-       fade_out_length_spinner.signal_activate().connect (mem_fun(*this, &AudioRegionEditor::activation));
-
-       Gtkmm2ext::set_size_request_to_display_given_text (fade_out_length_spinner, "500g", 20, -1);
-
-       fade_out_label_align.add (fade_out_label);
-       fade_out_label_align.set (0.5);
-
-       fade_out_table.attach (fade_out_label_align,   0, 2, 0, 1, Gtk::FILL|Gtk::EXPAND, Gtk::FILL);
-
-       fade_out_table.attach (fade_out_length_label,   0, 1, 1, 2, Gtk::EXPAND, Gtk::FILL);
-       fade_out_table.attach (fade_out_length_spinner, 0, 1, 2, 3, Gtk::FILL|Gtk::EXPAND, Gtk::FILL);
-
-       fade_out_table.attach (fade_out_active_button,        0, 2, 3, 5, Gtk::FILL|Gtk::EXPAND, Gtk::FILL);
-
        lower_hbox.pack_start (time_table, true, true);
        lower_hbox.pack_start (sep1, false, false);
-       lower_hbox.pack_start (envelope_loop_table, true, true);
        lower_hbox.pack_start (sep2, false, false);
-       lower_hbox.pack_start (fade_in_table, true, true);
-       lower_hbox.pack_start (fade_out_table, true, true);
 
        get_vbox()->pack_start (top_row_hbox, true, true);
        get_vbox()->pack_start (sep3, false, false);
@@ -269,29 +127,8 @@ AudioRegionEditor::AudioRegionEditor (Session& s, boost::shared_ptr<AudioRegion>
 
        name_changed ();
        bounds_changed (Change (StartChanged|LengthChanged|PositionChanged));
-       envelope_active_changed ();
-       mute_changed ();
-       opacity_changed ();
-       lock_changed ();
-       layer_changed ();
-       fade_in_changed ();
-       fade_out_changed ();
-
-       XMLNode *node  = _region->extra_xml ("GUI");
-       XMLProperty *prop = 0;
-       bool showing_envelope = false;
-
-       if (node && (prop = node->property ("envelope-visible")) != 0) {
-               if (prop->value() == "yes") {
-                       showing_envelope = true;
-               } 
-       } 
 
-       if (showing_envelope) {
-               envelope_view_button.set_active (true);
-       } else {
-               envelope_view_button.set_active (false);
-       }
+       //XMLNode *node  = _region->extra_xml ("GUI");
 
        _region->StateChanged.connect (mem_fun(*this, &AudioRegionEditor::region_changed));
        
@@ -313,47 +150,6 @@ AudioRegionEditor::region_changed (Change what_changed)
        if (what_changed & BoundsChanged) {
                bounds_changed (what_changed);
        }
-
-       if (what_changed & Region::OpacityChanged) {
-               opacity_changed ();
-       }
-       if (what_changed & Region::MuteChanged) {
-               mute_changed ();
-       }
-       if (what_changed & Region::LockChanged) {
-               lock_changed ();
-       }
-       if (what_changed & Region::LayerChanged) {
-               layer_changed ();
-       }
-
-       if (what_changed & AudioRegion::EnvelopeActiveChanged) {
-               envelope_active_changed ();
-       }
-       if (what_changed & AudioRegion::FadeInChanged) {
-               fade_in_changed ();
-       }
-       if (what_changed & AudioRegion::FadeOutChanged) {
-               fade_out_changed ();
-       }
-       if (what_changed & AudioRegion::FadeInActiveChanged) {
-               fade_in_active_changed ();
-       }
-       if (what_changed & AudioRegion::FadeOutActiveChanged) {
-               fade_out_active_changed ();
-       }
-}
-
-void
-AudioRegionEditor::fade_in_realized ()
-{
-       fade_in_changed ();
-}
-
-void
-AudioRegionEditor::fade_out_realized ()
-{
-       fade_out_changed ();
 }
 
 gint 
@@ -389,77 +185,51 @@ AudioRegionEditor::breleased (GdkEventButton* ev, Gtk::SpinButton* but, void (Au
        return FALSE;
 }
 
-void
-AudioRegionEditor::start_editing_fade_in ()
-{
-       _region->freeze ();
-}
-
-void
-AudioRegionEditor::stop_editing_fade_in ()
-{
-       _region->thaw (_("fade in edit"));
-}
-
-void
-AudioRegionEditor::start_editing_fade_out ()
-{
-       _region->freeze ();
-}
-
-void
-AudioRegionEditor::stop_editing_fade_out ()
-{
-       _region->thaw (_("fade out edit"));
-}
-
 void
 AudioRegionEditor::connect_editor_events ()
 {
-  name_entry.signal_changed().connect (mem_fun(*this, &AudioRegionEditor::name_entry_changed));
+       name_entry.signal_changed().connect (mem_fun(*this, &AudioRegionEditor::name_entry_changed));
 
        start_clock.ValueChanged.connect (mem_fun(*this, &AudioRegionEditor::start_clock_changed));
        end_clock.ValueChanged.connect (mem_fun(*this, &AudioRegionEditor::end_clock_changed));
        length_clock.ValueChanged.connect (mem_fun(*this, &AudioRegionEditor::length_clock_changed));
 
-       fade_in_length_spinner.signal_button_press_event().connect (bind (mem_fun(*this, &AudioRegionEditor::bpressed), &fade_in_length_spinner, 
-                                                                &AudioRegionEditor::start_editing_fade_in));
-       fade_in_length_spinner.signal_button_release_event().connect (bind (mem_fun (*this, &AudioRegionEditor::breleased), &fade_in_length_spinner, 
-                                                                  &AudioRegionEditor::stop_editing_fade_in));
-
-       fade_out_length_spinner.signal_button_press_event().connect (bind (mem_fun(*this, &AudioRegionEditor::bpressed), &fade_out_length_spinner, 
-                                                                &AudioRegionEditor::start_editing_fade_out));
-       fade_out_length_spinner.signal_button_release_event().connect (bind (mem_fun (*this, &AudioRegionEditor::breleased), &fade_out_length_spinner, 
-                                                                  &AudioRegionEditor::stop_editing_fade_out));
-
-       fade_in_length_adjustment.signal_value_changed().connect (mem_fun(*this, &AudioRegionEditor::fade_in_length_adjustment_changed));
-       fade_out_length_adjustment.signal_value_changed().connect (mem_fun(*this, &AudioRegionEditor::fade_out_length_adjustment_changed));
-
-       fade_in_active_button.signal_toggled().connect (mem_fun(*this, &AudioRegionEditor::fade_in_active_toggled));
-       fade_out_active_button.signal_toggled().connect (mem_fun(*this, &AudioRegionEditor::fade_out_active_toggled));
-
-       envelope_active_button.signal_button_press_event().connect (mem_fun(*this, &AudioRegionEditor::envelope_active_button_press));
-       envelope_active_button.signal_button_release_event().connect (mem_fun(*this, &AudioRegionEditor::envelope_active_button_release));
        audition_button.signal_toggled().connect (mem_fun(*this, &AudioRegionEditor::audition_button_toggled));
-       envelope_view_button.signal_toggled().connect (mem_fun(*this, &AudioRegionEditor::envelope_view_button_toggled));
-       lock_button.signal_clicked().connect (mem_fun(*this, &AudioRegionEditor::lock_button_clicked));
-       mute_button.signal_clicked().connect (mem_fun(*this, &AudioRegionEditor::mute_button_clicked));
-       opaque_button.signal_clicked().connect (mem_fun(*this, &AudioRegionEditor::opaque_button_clicked));
-       raise_button.signal_clicked().connect (mem_fun(*this, &AudioRegionEditor::raise_button_clicked));
-       lower_button.signal_clicked().connect (mem_fun(*this, &AudioRegionEditor::lower_button_clicked));
        _session.AuditionActive.connect (mem_fun(*this, &AudioRegionEditor::audition_state_changed));
 }
 
 void
 AudioRegionEditor::start_clock_changed ()
 {
-       _region->set_position (start_clock.current_time(), this);
+       _session.begin_reversible_command (_("change region start position"));
+
+       Playlist* const pl = _region->playlist();
+
+       if (pl) {
+               XMLNode &before = pl->get_state();
+               _region->set_position (start_clock.current_time(), this);
+               XMLNode &after = pl->get_state();
+               _session.add_command(new MementoCommand<Playlist>(*pl, &before, &after));
+       }
+
+       _session.commit_reversible_command ();
 }
 
 void
 AudioRegionEditor::end_clock_changed ()
 {
-       _region->trim_end (end_clock.current_time(), this);
+       _session.begin_reversible_command (_("change region end position"));
+
+       Playlist* const pl = _region->playlist();
+
+       if (pl) {
+               XMLNode &before = pl->get_state();
+               _region->trim_end (end_clock.current_time(), this);
+               XMLNode &after = pl->get_state();
+               _session.add_command(new MementoCommand<Playlist>(*pl, &before, &after));
+       }
+
+       _session.commit_reversible_command ();
 
        end_clock.set (_region->position() + _region->length(), true);
 }
@@ -468,30 +238,21 @@ void
 AudioRegionEditor::length_clock_changed ()
 {
        nframes_t frames = length_clock.current_time();
-       _region->trim_end (_region->position() + frames, this);
-
-       length_clock.set (_region->length());
-}
-
-gint
-AudioRegionEditor::envelope_active_button_press(GdkEventButton *ev)
-{
-       return stop_signal (envelope_active_button, "button_press_event");
-}
+       
+       _session.begin_reversible_command (_("change region length"));
+       
+       Playlist* const pl = _region->playlist();
 
-gint
-AudioRegionEditor::envelope_active_button_release (GdkEventButton *ev)
-{
-       _region->set_envelope_active (!_region->envelope_active());
-       return stop_signal (envelope_active_button, "button_release_event");
-}
+       if (pl) {
+               XMLNode &before = pl->get_state();
+               _region->trim_end (_region->position() + frames, this);
+               XMLNode &after = pl->get_state();
+               _session.add_command(new MementoCommand<Playlist>(*pl, &before, &after));
+       }
 
-void
-AudioRegionEditor::envelope_view_button_toggled ()
-{
-       bool visible = envelope_view_button.get_active ();
+       _session.commit_reversible_command ();
 
-       _region_view.set_envelope_visible (visible);
+       length_clock.set (_region->length());
 }
 
 void
@@ -504,56 +265,6 @@ AudioRegionEditor::audition_button_toggled ()
        }
 }
 
-void
-AudioRegionEditor::raise_button_clicked ()
-{
-       _region->raise ();
-}
-
-void
-AudioRegionEditor::lower_button_clicked ()
-{
-       _region->lower ();
-}
-
-void
-AudioRegionEditor::opaque_button_clicked ()
-{
-       bool ractive = _region->opaque();
-
-       if (opaque_button.get_active() != ractive) {
-               _region->set_opaque (!ractive);
-       }
-}
-
-void
-AudioRegionEditor::mute_button_clicked ()
-{
-       bool ractive = _region->muted();
-
-       if (mute_button.get_active() != ractive) {
-               _region->set_muted (!ractive);
-       }
-}
-
-void
-AudioRegionEditor::lock_button_clicked ()
-{
-       bool ractive = _region->locked();
-
-       if (lock_button.get_active() != ractive) {
-               _region->set_locked (!ractive);
-       }
-}
-
-void
-AudioRegionEditor::layer_changed ()
-{
-       char buf[8];
-       snprintf (buf, sizeof(buf), "%d", (int) _region->layer() + 1);
-       layer_value_label.set_text (buf);
-}
-
 void
 AudioRegionEditor::name_changed ()
 {
@@ -562,48 +273,6 @@ AudioRegionEditor::name_changed ()
        }
 }
 
-void
-AudioRegionEditor::lock_changed ()
-{
-       bool yn;
-
-       if ((yn = _region->locked()) != lock_button.get_active()) {
-               lock_button.set_active (yn);
-       }
-
-       start_clock.set_sensitive (!yn);
-       end_clock.set_sensitive (!yn);
-       length_clock.set_sensitive (!yn);
-}
-
-void
-AudioRegionEditor::envelope_active_changed ()
-{
-       bool yn;
-
-       if ((yn = _region->envelope_active()) != envelope_active_button.get_active()) {
-               envelope_active_button.set_active (yn);
-       }
-}
-
-void
-AudioRegionEditor::opacity_changed ()
-{
-       bool yn;
-       if ((yn = _region->opaque()) != opaque_button.get_active()) {
-               opaque_button.set_active (yn);
-       }
-}
-
-void
-AudioRegionEditor::mute_changed ()
-{
-       bool yn;
-       if ((yn = _region->muted()) != mute_button.get_active()) {
-               mute_button.set_active (yn);
-       }
-}
-
 void
 AudioRegionEditor::bounds_changed (Change what_changed)
 {
@@ -628,97 +297,6 @@ AudioRegionEditor::name_entry_changed ()
        }
 }
 
-void
-AudioRegionEditor::fade_in_changed ()
-{
-       float msecs = fade_in_length_adjustment.get_value();
-       nframes_t sr = _session.frame_rate();
-       nframes_t adj_frames = (nframes_t) floor (msecs * (sr/1000.0f));
-       nframes_t frames;
-       bool x;
-
-       if (adj_frames != (frames = (nframes_t) _region->fade_in().back()->when)) {
-               fade_in_length_adjustment.set_value ((frames * 1000.0f) / sr);
-       }
-
-       if ((x = _region->fade_in_active()) != fade_in_active_button.get_active()) {
-               fade_in_active_button.set_active (x);
-       }
-}
-
-void
-AudioRegionEditor::fade_out_changed ()
-{
-       float msecs = fade_out_length_adjustment.get_value();
-       nframes_t sr = _session.frame_rate();
-       nframes_t adj_frames = (nframes_t) floor (msecs * (sr/1000.0f));
-       nframes_t frames;
-       bool x;
-       if (adj_frames != (frames = (nframes_t) _region->fade_out().back()->when)) {
-               fade_out_length_adjustment.set_value ((frames * 1000.0f) / sr);
-       }
-
-       if ((x = _region->fade_out_active()) != fade_out_active_button.get_active()) {
-               fade_out_active_button.set_active (x);
-       }
-}
-
-void
-AudioRegionEditor::fade_in_length_adjustment_changed ()
-{
-       nframes_t fade_length = (nframes_t) floor (fade_in_length_adjustment.get_value() * _session.frame_rate() * 0.001); 
-       fade_length = max (fade_length, (nframes_t) 64);
-       fade_length = min (fade_length, _region->length());
-       
-       _region->set_fade_in_length (fade_length);
-       /* region is frozen, no worries */
-       fade_in_changed();
-}
-
-void
-AudioRegionEditor::fade_out_length_adjustment_changed ()
-{
-       nframes_t fade_length = (nframes_t) floor (fade_out_length_adjustment.get_value() * _session.frame_rate() * 0.001); 
-       fade_length = max (fade_length, (nframes_t) 64);
-       fade_length = min (fade_length, _region->length());
-       
-       _region->set_fade_out_length (fade_length);     
-       /* region is frozen, no worries */
-       fade_out_changed();
-}
-
-void
-AudioRegionEditor::fade_in_active_toggled ()
-{
-       _region->set_fade_in_active (fade_in_active_button.get_active());
-}
-
-void
-AudioRegionEditor::fade_out_active_toggled ()
-{
-       _region->set_fade_out_active (fade_out_active_button.get_active());
-}
-
-void
-AudioRegionEditor::fade_out_active_changed ()
-{
-       bool x;
-
-       if ((x = _region->fade_out_active()) != fade_out_active_button.get_active()) {
-               fade_out_active_button.set_active (x);
-       }
-}
-
-void
-AudioRegionEditor::fade_in_active_changed ()
-{
-       bool x;
-
-       if ((x = _region->fade_in_active()) != fade_in_active_button.get_active()) {
-               fade_in_active_button.set_active (x);
-       }
-}
-
 void
 AudioRegionEditor::audition_state_changed (bool yn)
 {
index dbbc40f9ba2a066f046b086b7b34e8947b1fe210..a84aec27c0f8136a87a9a764a9e0852fe86e34ad 100644 (file)
@@ -69,21 +69,6 @@ class AudioRegionEditor : public RegionEditor
        Gtk::HBox  top_row_hbox;
        Gtk::HBox  top_row_button_hbox;
 
-       Gtk::ToggleButton lock_button;
-       Gtk::ToggleButton mute_button;
-       Gtk::ToggleButton opaque_button;
-       Gtk::ToggleButton envelope_active_button;
-       Gtk::ToggleButton envelope_view_button;
-
-       Gtk::Button       raise_button;
-       Gtk::Arrow        raise_arrow;
-       Gtk::Button       lower_button;
-       Gtk::Arrow        lower_arrow;
-       Gtk::Frame        layer_frame;
-       Gtk::Label        layer_value_label;
-       Gtk::Label        layer_label;
-       Gtk::HBox         layer_hbox;
-
        Gtk::ToggleButton  audition_button;
 
        Gtk::HBox  lower_hbox;
@@ -102,31 +87,6 @@ class AudioRegionEditor : public RegionEditor
        AudioClock length_clock;
        AudioClock sync_offset_clock;
 
-       Gtk::Table  envelope_loop_table;
-       Gtk::Button loop_button;
-       Gtk::Label  loop_label;
-       Gtk::Label  envelope_label;
-
-       Gtk::Table fade_in_table;
-       Gtk::Label fade_in_label;
-       Gtk::Alignment fade_in_label_align;
-       Gtk::Label fade_in_active_button_label;
-       Gtk::ToggleButton fade_in_active_button;
-       Gtk::Label fade_in_length_label;
-
-       Gtk::Adjustment fade_in_length_adjustment;
-       Gtk::SpinButton fade_in_length_spinner;
-
-       Gtk::Table fade_out_table;
-       Gtk::Label fade_out_label;
-       Gtk::Alignment fade_out_label_align;
-       Gtk::Label fade_out_active_button_label;
-       Gtk::ToggleButton fade_out_active_button;
-       Gtk::Label fade_out_length_label;
-
-       Gtk::Adjustment fade_out_length_adjustment;
-       Gtk::SpinButton fade_out_length_spinner;
-
        Gtk::HSeparator sep3;
        Gtk::VSeparator sep1;
        Gtk::VSeparator sep2;
@@ -134,16 +94,7 @@ class AudioRegionEditor : public RegionEditor
        void region_changed (ARDOUR::Change);
        void bounds_changed (ARDOUR::Change);
        void name_changed ();
-       void opacity_changed ();
-       void mute_changed ();
-       void envelope_active_changed ();
-       void lock_changed ();
-       void layer_changed ();
-
-       void fade_in_length_adjustment_changed ();
-       void fade_out_length_adjustment_changed ();
-       void fade_in_changed ();
-       void fade_out_changed ();
+
        void audition_state_changed (bool);
 
        void activation ();
@@ -153,29 +104,7 @@ class AudioRegionEditor : public RegionEditor
        void end_clock_changed ();
        void length_clock_changed ();
 
-       gint envelope_active_button_press (GdkEventButton *);
-       gint envelope_active_button_release (GdkEventButton *);
-
        void audition_button_toggled ();
-       void envelope_view_button_toggled ();
-       void lock_button_clicked ();
-       void mute_button_clicked ();
-       void opaque_button_clicked ();
-       void raise_button_clicked ();
-       void lower_button_clicked ();
-
-       void fade_in_active_toggled ();
-       void fade_out_active_toggled ();
-       void fade_in_active_changed ();
-       void fade_out_active_changed ();
-
-       void fade_in_realized ();
-       void fade_out_realized ();
-
-       void start_editing_fade_in ();
-       void start_editing_fade_out ();
-       void stop_editing_fade_in ();
-       void stop_editing_fade_out ();
 
        gint bpressed (GdkEventButton* ev, Gtk::SpinButton* but, void (AudioRegionEditor::*pmf)());
        gint breleased (GdkEventButton* ev, Gtk::SpinButton* but, void (AudioRegionEditor::*pmf)());
index 73ac0c341da1f6a48cca511319c7eea4ce838b1a..6543907bc8eb4b771d190ad8577ddccb57f88c29 100644 (file)
@@ -29,6 +29,7 @@
 #include <ardour/audiosource.h>
 #include <ardour/audio_diskstream.h>
 #include <pbd/memento_command.h>
+#include <pbd/stacktrace.h>
 
 #include "streamview.h"
 #include "audio_region_view.h"
@@ -247,16 +248,52 @@ AudioRegionView::fade_out_changed ()
        reset_fade_out_shape ();
 }
 
+void
+AudioRegionView::set_fade_in_shape (AudioRegion::FadeShape shape)
+{
+       AutomationList& alist = audio_region()->fade_in();
+       XMLNode& before (alist.get_state());
+       trackview.session().begin_reversible_command ("fade in shape");
+       audio_region()->set_fade_in_shape (shape);
+       XMLNode& after (alist.get_state());
+       trackview.session().add_command (new MementoCommand<AutomationList>(alist, &before, &after));
+       trackview.session().commit_reversible_command ();
+}
+
+void
+AudioRegionView::set_fade_out_shape (AudioRegion::FadeShape shape)
+{
+       AutomationList& alist = audio_region()->fade_out();
+       XMLNode& before (alist.get_state());
+       trackview.session().begin_reversible_command ("fade out shape");
+       audio_region()->set_fade_out_shape (shape);
+       XMLNode& after (alist.get_state());
+       trackview.session().add_command (new MementoCommand<AutomationList>(alist, &before, &after));
+       trackview.session().commit_reversible_command ();
+}
+
 void
 AudioRegionView::set_fade_in_active (bool yn)
 {
+       AutomationList& alist = audio_region()->fade_in();
+       XMLNode& before (alist.get_state());
+       trackview.session().begin_reversible_command ("fade in shape");
        audio_region()->set_fade_in_active (yn);
+       XMLNode& after (alist.get_state());
+       trackview.session().add_command (new MementoCommand<AutomationList>(alist, &before, &after));
+       trackview.session().commit_reversible_command ();
 }
 
 void
 AudioRegionView::set_fade_out_active (bool yn)
 {
+       AutomationList& alist = audio_region()->fade_out();
+       XMLNode& before (alist.get_state());
+       trackview.session().begin_reversible_command ("fade out shape");
        audio_region()->set_fade_out_active (yn);
+       XMLNode& after (alist.get_state());
+       trackview.session().add_command (new MementoCommand<AutomationList>(alist, &before, &after));
+       trackview.session().commit_reversible_command ();
 }
 
 void
@@ -868,6 +905,9 @@ AudioRegionView::create_one_wave (uint32_t which, bool direct)
                waves = tmp_waves;
                tmp_waves.clear ();
 
+               /* all waves created, don't hook into peaks ready anymore */
+               data_ready_connection.disconnect ();            
+
                if (!zero_line) {
                        zero_line = new ArdourCanvas::SimpleLine (*group);
                        zero_line->property_x1() = (gdouble) 1.0;
@@ -882,11 +922,6 @@ void
 AudioRegionView::peaks_ready_handler (uint32_t which)
 {
        Gtkmm2ext::UI::instance()->call_slot (bind (mem_fun(*this, &AudioRegionView::create_one_wave), which, false));
-
-       if (!waves.empty()) {
-               /* all waves created, don't hook into peaks ready anymore */
-               data_ready_connection.disconnect ();            
-       }
 }
 
 void
@@ -924,12 +959,11 @@ AudioRegionView::add_gain_point_event (ArdourCanvas::Item *item, GdkEvent *ev)
        trackview.session().begin_reversible_command (_("add gain control point"));
        XMLNode &before = audio_region()->envelope().get_state();
 
-
        if (!audio_region()->envelope_active()) {
-               XMLNode &before = audio_region()->get_state();
+               XMLNode &region_before = audio_region()->get_state();
                audio_region()->set_envelope_active(true);
-               XMLNode &after = audio_region()->get_state();
-               trackview.session().add_command (new MementoCommand<AudioRegion>(*(audio_region().get()), &before, &after));
+               XMLNode &region_after = audio_region()->get_state();
+               trackview.session().add_command (new MementoCommand<AudioRegion>(*(audio_region().get()), &region_before, &region_after));
        }
 
        audio_region()->envelope().add (fx, y);
index 7d26f254d25cbc56760bcf1ef9017bd9074409d5..977c0e3aae61311a097a1b312647706968980f6a 100644 (file)
@@ -24,7 +24,7 @@
 #include <libgnomecanvasmm.h>
 #include <libgnomecanvasmm/polygon.h>
 #include <sigc++/signal.h>
-#include <ardour/region.h>
+#include <ardour/audioregion.h>
 
 #include "region_view.h"
 #include "route_time_axis.h"
@@ -93,7 +93,9 @@ class AudioRegionView : public RegionView
        void reset_fade_out_shape_width (nframes_t);
        void set_fade_in_active (bool);
        void set_fade_out_active (bool);
-       
+       void set_fade_in_shape (ARDOUR::AudioRegion::FadeShape);
+       void set_fade_out_shape (ARDOUR::AudioRegion::FadeShape);
+
        virtual void entered ();
        virtual void exited ();
        
index ee74fabfa4418d21068ee399eda8e267bff91a82..44c100fd3760aac4c0eb7c37f341f8bc3105b45e 100644 (file)
@@ -245,7 +245,7 @@ AutomationLine::AutomationLine (const string & name, TimeAxisView& tv, ArdourCan
 
        alist.StateChanged.connect (mem_fun(*this, &AutomationLine::list_changed));
 
-        trackview.session().register_with_memento_command_factory(_id, this);
+        trackview.session().register_with_memento_command_factory(alist.id(), this);
 
 }
 
@@ -270,14 +270,6 @@ AutomationLine::queue_reset ()
        }
 }
 
-void
-AutomationLine::set_point_size (double sz)
-{
-       for (vector<ControlPoint*>::iterator i = control_points.begin(); i != control_points.end(); ++i) {
-               (*i)->set_size (sz);
-       }
-}      
-
 void
 AutomationLine::show () 
 {
@@ -302,18 +294,27 @@ AutomationLine::hide ()
        _visible = false;
 }
 
+double
+AutomationLine::control_point_box_size ()
+{
+       if (_height > TimeAxisView::hLarger) {
+               return 8.0;
+       } else if (_height > (guint32) TimeAxisView::hNormal) {
+               return 6.0;
+       } 
+       return 4.0;
+}
+
 void
 AutomationLine::set_height (guint32 h)
 {
        if (h != _height) {
                _height = h;
 
-               if (_height > (guint32) TimeAxisView::Larger) {
-                       set_point_size (8.0);
-               } else if (_height > (guint32) TimeAxisView::Normal) {
-                       set_point_size (6.0);
-               } else {
-                       set_point_size (4.0);
+               double bsz = control_point_box_size();
+
+               for (vector<ControlPoint*>::iterator i = control_points.begin(); i != control_points.end(); ++i) {
+                       (*i)->set_size (bsz);
                }
 
                reset ();
@@ -670,11 +671,16 @@ AutomationLine::determine_visible_control_points (ALPoints& points)
        uint32_t this_ry = 0;
        uint32_t prev_ry = 0;   
        double* slope;
+       uint32_t box_size;
+       uint32_t cpsize;
 
        /* hide all existing points, and the line */
+
+       cpsize = 0;
        
        for (vector<ControlPoint*>::iterator i = control_points.begin(); i != control_points.end(); ++i) {
                (*i)->hide();
+               ++cpsize;
        }
 
        line->hide ();
@@ -695,6 +701,8 @@ AutomationLine::determine_visible_control_points (ALPoints& points)
                slope[n] = ydelta/xdelta;
        }
 
+       box_size = (uint32_t) control_point_box_size ();
+
        /* read all points and decide which ones to show as control points */
 
        view_index = 0;
@@ -736,29 +744,27 @@ AutomationLine::determine_visible_control_points (ALPoints& points)
                */
 
                this_rx = (uint32_t) rint (tx);
-               this_ry = (unsigned long) rint (ty); 
-               if (view_index && pi != npoints && (this_rx == prev_rx) && (this_ry == prev_ry)) {
+               this_ry = (uint32_t) rint (ty); 
  
+               if (view_index && pi != npoints && /* not the first, not the last */
+                   (((this_rx == prev_rx) && (this_ry == prev_ry)) || /* same point */
+                    (((this_rx - prev_rx) < (box_size + 2)) &&  /* too close horizontally */
+                     ((abs ((int)(this_ry - prev_ry)) < (int) (box_size + 2)))))) { /* too close vertically */
                        continue;
-               } 
+               }
 
                /* ok, we should display this point */
 
-               if (view_index >= control_points.size()) {
+               if (view_index >= cpsize) {
+
                        /* make sure we have enough control points */
 
                        ControlPoint* ncp = new ControlPoint (*this);
-
-                       if (_height > (guint32) TimeAxisView::Larger) {
-                               ncp->set_size (8.0);
-                       } else if (_height > (guint32) TimeAxisView::Normal) {
-                               ncp->set_size (6.0); 
-                       } else {
-                               ncp->set_size (4.0);
-                       }
+                       
+                       ncp->set_size (box_size); 
 
                        control_points.push_back (ncp);
+                       ++cpsize;
                }
 
                ControlPoint::ShapeType shape;
@@ -829,6 +835,10 @@ AutomationLine::determine_visible_control_points (ALPoints& points)
                        line_points.push_back (Art::Point (0,0));
                }
 
+               while (line_points.size() > npoints) {
+                       line_points.pop_back ();
+               }
+
                for (view_index = 0; view_index < npoints; ++view_index) {
                        line_points[view_index].set_x (control_points[view_index]->get_x());
                        line_points[view_index].set_y (control_points[view_index]->get_y());
@@ -1168,16 +1178,8 @@ AutomationLine::hide_selection ()
 //     show_selection ();
 }
 
-
-// This is copied into AudioRegionGainLine
-UndoAction
-AutomationLine::get_memento ()
-{
-       return alist.get_memento();
-}
-
 void
-AutomationLine::list_changed (Change ignored)
+AutomationLine::list_changed ()
 {
        queue_reset ();
 }
@@ -1201,9 +1203,7 @@ AutomationLine::reset_callback (const AutomationList& events)
 
        for (ai = events.const_begin(); ai != events.const_end(); ++ai) {
 
-               double translated_y;
-               
-               translated_y = (*ai)->value;
+               double translated_y = (*ai)->value;
                model_to_view_y (translated_y);
 
                tmp_points.push_back (ALPoint (trackview.editor.frame_to_unit ((*ai)->when),
@@ -1271,16 +1271,16 @@ AutomationLine::hide_all_but_selected_control_points ()
        }
 }
 
-XMLNode &AutomationLine::get_state(void)
+XMLNode &
+AutomationLine::get_state (void)
 {
-    XMLNode *node = new XMLNode("AutomationLine");
-    node->add_child_nocopy(alist.get_state());
-    return *node;
+       /* function as a proxy for the model */
+       return alist.get_state();
 }
 
-int AutomationLine::set_state(const XMLNode &node)
+int 
+AutomationLine::set_state (const XMLNode &node)
 {
-    // TODO
-    //alist.set_state(node);
-    return 0;
+       /* function as a proxy for the model */
+       return alist.set_state (node);
 }
index eb2d2045134ac9fb4c17aaa553b380dccdaf35ce..b73a1c548ab840f3787a5080cb62a1e052fd80ef 100644 (file)
@@ -96,7 +96,7 @@ class ControlPoint
        ShapeType _shape;
 };
 
-class AutomationLine : public PBD::StatefulDestructible
+class AutomationLine : public sigc::trackable, public PBD::StatefulThingWithGoingAway
 {
   public:
         AutomationLine (const string & name, TimeAxisView&, ArdourCanvas::Group&, ARDOUR::AutomationList&);
@@ -146,8 +146,6 @@ class AutomationLine : public PBD::StatefulDestructible
        void show_selection();
        void hide_selection ();
 
-       void set_point_size (double size);
-
        virtual string  get_verbose_cursor_string (float);
        virtual void view_to_model_y (double&) = 0;
        virtual void model_to_view_y (double&) = 0;
@@ -204,9 +202,7 @@ class AutomationLine : public PBD::StatefulDestructible
        virtual void change_model_range (ARDOUR::AutomationList::iterator,ARDOUR::AutomationList::iterator, double delta, float ydelta);
 
        void reset_callback (const ARDOUR::AutomationList&);
-       void list_changed (ARDOUR::Change);
-
-       UndoAction get_memento();
+       void list_changed ();
 
        virtual bool event_handler (GdkEvent*);
        
@@ -221,6 +217,8 @@ class AutomationLine : public PBD::StatefulDestructible
        void reset_line_coords (ControlPoint&);
        void update_line ();
 
+       double control_point_box_size ();
+
        struct ModelRepresentation {
            ARDOUR::AutomationList::iterator start;
            ARDOUR::AutomationList::iterator end;
index 22b6e10ac8037a310186b5b53839cee15ce4f74a..2efb621b37c9e8c53ac5617938439e4d4d206a81 100644 (file)
@@ -43,31 +43,22 @@ AutomationTimeAxisView::AutomationTimeAxisView (Session& s, boost::shared_ptr<Ro
        ignore_state_request = false;
        first_call_to_set_height = true;
 
-       //      base_rect = gnome_canvas_item_new (GNOME_CANVAS_GROUP(canvas_display),
-       //                       gnome_canvas_simplerect_get_type(),
-       //                       "x1", 0.0,
-       //                       "y1", 0.0,
-       //                       "x2", 1000000.0,
-       //                       "outline_color_rgba", color_map[cAutomationTrackOutline],
-       //                       /* outline ends and bottom */
-       //                       "outline_what", (guint32) (0x1|0x2|0x8),
-       //                       "fill_color_rgba", color_map[cAutomationTrackFill],
-       //                       NULL);
        base_rect = new SimpleRect(*canvas_display);
        base_rect->property_x1() = 0.0;
        base_rect->property_y1() = 0.0;
-       base_rect->property_x2() = 1000000.0;
+       base_rect->property_x2() = max_frames;
        base_rect->property_outline_color_rgba() = color_map[cAutomationTrackOutline];
        /* outline ends and bottom */
        base_rect->property_outline_what() = (guint32) (0x1|0x2|0x8);
        base_rect->property_fill_color_rgba() = color_map[cAutomationTrackFill];
+       //base_rect->property_fill_color_rgba() = color_map[cEnteredControlPoint];
        
        base_rect->set_data ("trackview", this);
 
        base_rect->signal_event().connect (bind (mem_fun (editor, &PublicEditor::canvas_automation_track_event),
                                                 base_rect, this));
 
-       hide_button.add (*(manage (new Gtk::Image (get_xpm("small_x.xpm")))));
+       hide_button.add (*(manage (new Gtk::Image (::get_icon("hide")))));
 
        height_button.set_name ("TrackSizeButton");
        auto_button.set_name ("TrackVisualButton");
@@ -402,8 +393,13 @@ AutomationTimeAxisView::set_samples_per_unit (double spu)
 void
 AutomationTimeAxisView::hide_clicked ()
 {
+       // LAME fix for refreshing the hide button
+       hide_button.set_sensitive(false);
+       
        set_marked_for_display (false);
        hide ();
+       
+       hide_button.set_sensitive(true);
 }
 
 void
index 89f5da7bf628d197170c5bb6cd10f4c55f91d345..080f6871fa1705bb6f1d9231a17fb8881365400c 100644 (file)
@@ -1,4 +1,4 @@
- /*
+/*
      Copyright (C) 2000-2002 Paul Davis 
 
      This program is free software; you can redistribute it and/or modify
      Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 
      $Id$
- */
+*/
+
+#include <stdio.h>
+#include <math.h>
+#include <libgnomecanvas/libgnomecanvas.h>
+#include <string.h>
+#include <limits.h>
 
- #include <stdio.h>
- #include <math.h>
- #include <libgnomecanvas/libgnomecanvas.h>
- #include <string.h>
- #include <limits.h>
+#include <ardour/dB.h>
 
- #include <ardour/dB.h>
+#include "canvas-waveview.h"
+#include "rgb_macros.h"
 
- #include "canvas-waveview.h"
- #include "rgb_macros.h"
+extern void c_stacktrace();
 
- enum {
+enum {
         PROP_0,
         PROP_DATA_SRC,
         PROP_CHANNEL,
         PROP_WAVE_COLOR,
         PROP_RECTIFIED,
         PROP_REGION_START
- };
+};
 
- static void gnome_canvas_waveview_class_init     (GnomeCanvasWaveViewClass *class);
+static void gnome_canvas_waveview_class_init     (GnomeCanvasWaveViewClass *class);
 
- static void gnome_canvas_waveview_init           (GnomeCanvasWaveView      *waveview);
+static void gnome_canvas_waveview_init           (GnomeCanvasWaveView      *waveview);
 
- static void gnome_canvas_waveview_destroy        (GtkObject            *object);
+static void gnome_canvas_waveview_destroy        (GtkObject            *object);
 
- static void gnome_canvas_waveview_set_property   (GObject        *object,
+static void gnome_canvas_waveview_set_property   (GObject        *object,
                                                   guint           prop_id,
                                                   const GValue   *value,
                                                   GParamSpec     *pspec);
- static void gnome_canvas_waveview_get_property   (GObject        *object,
+static void gnome_canvas_waveview_get_property   (GObject        *object,
                                                   guint           prop_id,
                                                   GValue         *value,
                                                   GParamSpec     *pspec);
 
- static void   gnome_canvas_waveview_update       (GnomeCanvasItem *item,
+static void   gnome_canvas_waveview_update       (GnomeCanvasItem *item,
                                                   double          *affine,
                                                   ArtSVP          *clip_path,
                                                   int              flags);
 
- static void   gnome_canvas_waveview_bounds       (GnomeCanvasItem *item,
+static void   gnome_canvas_waveview_bounds       (GnomeCanvasItem *item,
                                                   double          *x1,
                                                   double          *y1,
                                                   double          *x2,
                                                   double          *y2);
 
- static double gnome_canvas_waveview_point        (GnomeCanvasItem  *item,
+static double gnome_canvas_waveview_point        (GnomeCanvasItem  *item,
                                                   double            x,
                                                   double            y,
                                                   int               cx,
                                                   int               cy,
                                                   GnomeCanvasItem **actual_item);
 
- static void gnome_canvas_waveview_render         (GnomeCanvasItem *item,
+static void gnome_canvas_waveview_render         (GnomeCanvasItem *item,
                                                   GnomeCanvasBuf  *buf);
 
- static void gnome_canvas_waveview_draw           (GnomeCanvasItem *item,
+static void gnome_canvas_waveview_draw           (GnomeCanvasItem *item,
                                                   GdkDrawable     *drawable,
                                                   int              x,
                                                   int              y,
                                                   int              w,
                                                   int              h);
 
- static void gnome_canvas_waveview_set_data_src   (GnomeCanvasWaveView *,
+static void gnome_canvas_waveview_set_data_src   (GnomeCanvasWaveView *,
                                                   void *);
 
- static void gnome_canvas_waveview_set_channel    (GnomeCanvasWaveView *,
+static void gnome_canvas_waveview_set_channel    (GnomeCanvasWaveView *,
                                                   guint32);
 
- static gint32 gnome_canvas_waveview_ensure_cache (GnomeCanvasWaveView *waveview,
+static gint32 gnome_canvas_waveview_ensure_cache (GnomeCanvasWaveView *waveview,
                                                   gulong               start_sample,
                                                   gulong               end_sample);
 
- static GnomeCanvasItemClass *parent_class;
+static GnomeCanvasItemClass *parent_class;
 
- GType
- gnome_canvas_waveview_get_type (void)
- {
+GType
+gnome_canvas_waveview_get_type (void)
+{
         static GType waveview_type;
 
         if (!waveview_type) {
         return waveview_type;
  }
 
- static void
- gnome_canvas_waveview_class_init (GnomeCanvasWaveViewClass *class)
- {
+static void
+gnome_canvas_waveview_class_init (GnomeCanvasWaveViewClass *class)
+{
         GObjectClass *gobject_class;
         GtkObjectClass *object_class;
         GnomeCanvasItemClass *item_class;
         item_class->point = gnome_canvas_waveview_point;
         item_class->render = gnome_canvas_waveview_render;
         item_class->draw = gnome_canvas_waveview_draw;
- }
+}
 
 GnomeCanvasWaveViewCache*
 gnome_canvas_waveview_cache_new ()
@@ -331,6 +333,7 @@ gnome_canvas_waveview_destroy (GtkObject *object)
 }
 
 #define DEBUG_CACHE 0
+#undef CACHE_MEMMOVE_OPTIMIZATION
 
 static gint32
 gnome_canvas_waveview_ensure_cache (GnomeCanvasWaveView *waveview, gulong start_sample, gulong end_sample)
@@ -345,6 +348,10 @@ gnome_canvas_waveview_ensure_cache (GnomeCanvasWaveView *waveview, gulong start_
        gulong copied;
        GnomeCanvasWaveViewCache *cache;
        float* gain;
+#ifdef CACHE_MEMMOVE_OPTIMIZATION
+       gulong present_frames;
+       gulong present_entries;
+#endif
 
        cache = waveview->cache;
 
@@ -422,7 +429,6 @@ gnome_canvas_waveview_ensure_cache (GnomeCanvasWaveView *waveview, gulong start_
 
        ostart = new_cache_start;
 
-#undef CACHE_MEMMOVE_OPTIMIZATION
 #ifdef CACHE_MEMMOVE_OPTIMIZATION
        
        /* data is not entirely in the cache, so go fetch it, making sure to fill the cache */
@@ -971,7 +977,7 @@ gnome_canvas_waveview_render (GnomeCanvasItem *item,
 
 #if 0
        printf ("0x%x r (%d..%d)(%d..%d) bbox (%d..%d)(%d..%d)"
-               " b/e %d..%d s= %lu..%lu\n",
+               " b/e %d..%d s= %lu..%lu @ %f\n",
                waveview,
                buf->rect.x0,
                buf->rect.x1,
@@ -981,7 +987,8 @@ gnome_canvas_waveview_render (GnomeCanvasItem *item,
                waveview->bbox_lrx,
                waveview->bbox_uly,
                waveview->bbox_lry,
-               begin, end, s1, s2);
+               begin, end, s1, s2,
+               waveview->samples_per_unit);
 #endif
 
        /* now ensure that the cache is full and properly
index 1513856ea6df4709c0885225337765323b4b7be9..34378a332d03cee5e43d2ec948b424a7e2c20e44 100644 (file)
@@ -2,6 +2,8 @@
 
 #include "editing.h"
 
+#include "i18n.h"
+
 using namespace std;
 
 // This involves some cpp magic. --taybin
@@ -24,6 +26,13 @@ str2snaptype (const string & str) {
        #include "editing_syms.h"
        return SnapToBar;
 }
+
+#undef SNAPTYPE
+#define SNAPTYPE(s) N_(#s),
+const char *snaptypestrs[] = {
+       #include "editing_syms.h"
+       0
+};
 #undef SNAPTYPE
 #define SNAPTYPE(a) /*empty*/
 
@@ -36,9 +45,17 @@ str2snapmode (const string & str) {
        #include "editing_syms.h"
        return SnapNormal;
 }
+
+#undef SNAPMODE
+#define SNAPMODE(s) N_(#s),
+const char *snapmodestrs[] = {
+       #include "editing_syms.h"
+       0
+};
 #undef SNAPMODE
 #define SNAPMODE(a) /*empty*/
 
+
 // REGIONLISTSORTTYPE
 #undef REGIONLISTSORTTYPE
 #define REGIONLISTSORTTYPE(s) if (!strcmp(type, #s)) {return s;}
@@ -48,6 +65,13 @@ str2regionlistsorttype (const string & str) {
        #include "editing_syms.h"
        return ByName;
 }
+
+#undef REGIONLISTSORTTYPE
+#define REGIONLISTSORTTYPE(s) N_(#s),
+const char *regionlistsorttypestrs[] = {
+       #include "editing_syms.h"
+       0
+};
 #undef REGIONLISTSORTTYPE
 #define REGIONLISTSORTTYPE(a) /*empty*/
 
@@ -60,6 +84,13 @@ str2mousemode (const string & str) {
        #include "editing_syms.h"
        return MouseObject;
 }
+
+#undef MOUSEMODE
+#define MOUSEMODE(s) N_(#s),
+const char *mousemodestrs[] = {
+       #include "editing_syms.h"
+       0
+};
 #undef MOUSEMODE
 #define MOUSEMODE(a) /*empty*/
 
@@ -72,6 +103,13 @@ str2zoomfocus (const string & str) {
        #include "editing_syms.h"
        return ZoomFocusPlayhead;
 }
+
+#undef ZOOMFOCUS
+#define ZOOMFOCUS(s) N_(#s),
+const char *zoomfocusstrs[] = {
+       #include "editing_syms.h"
+       0
+};
 #undef ZOOMFOCUS
 #define ZOOMFOCUS(a) /*empty*/
 
@@ -84,7 +122,25 @@ str2displaycontrol (const string & str) {
        #include "editing_syms.h"
        return FollowPlayhead;
 }
+
+#undef DISPLAYCONTROL
+#define DISPLAYCONTROL(s) N_(#s),
+const char *displaycontrolstrs[] = {
+       #include "editing_syms.h"
+       0
+};
 #undef DISPLAYCONTROL
 #define DISPLAYCONTROL(a) /*empty*/
 
+//IMPORTMODE
+#undef IMPORTMODE
+#define IMPORTMODE(s) N_(#s),
+const char *importmodestrs[] = {
+       #include "editing_syms.h"
+       0
+};
+#undef IMPORTMODE
+#define IMPORTMODE(a) /*empty*/
+
 } // namespace Editing
+
index b25b935ee03fbe3ac11d1a4dce3340728d622c63..05aab747503df7c90ab33aeaa0b081301d2bece4 100644 (file)
@@ -24,11 +24,7 @@ enum SnapType {
        #include "editing_syms.h"
 };
 
-#undef SNAPTYPE
-#define SNAPTYPE(s) #s,
-static const char *snaptypestrs[] = {
-       #include "editing_syms.h"
-};
+extern const char *snaptypestrs[];
 inline const char* enum2str(SnapType m) {return snaptypestrs[m];}
 SnapType str2snaptype(const std::string &);
 
@@ -42,11 +38,7 @@ enum SnapMode {
        #include "editing_syms.h"
 };
 
-#undef SNAPMODE
-#define SNAPMODE(s) #s,
-static const char *snapmodestrs[] = {
-       #include "editing_syms.h"
-};
+extern const char *snapmodestrs[];
 inline const char* enum2str(SnapMode m) {return snapmodestrs[m];}
 SnapMode str2snapmode(const std::string &);
 
@@ -60,11 +52,7 @@ enum RegionListSortType {
        #include "editing_syms.h"
 };
 
-#undef REGIONLISTSORTTYPE
-#define REGIONLISTSORTTYPE(s) #s,
-static const char *regionlistsorttypestrs[] = {
-       #include "editing_syms.h"
-};
+extern const char *regionlistsorttypestrs[];
 inline const char* enum2str(RegionListSortType m) {return regionlistsorttypestrs[m];}
 RegionListSortType str2regionlistsorttype(const std::string &);
 
@@ -78,11 +66,7 @@ enum MouseMode {
        #include "editing_syms.h"
 };
 
-#undef MOUSEMODE
-#define MOUSEMODE(s) #s,
-static const char *mousemodestrs[] = {
-       #include "editing_syms.h"
-};
+extern const char *mousemodestrs[];
 inline const char* enum2str(MouseMode m) {return mousemodestrs[m];}
 MouseMode str2mousemode(const std::string &);
 
@@ -96,11 +80,7 @@ enum ZoomFocus {
        #include "editing_syms.h"
 };
 
-#undef ZOOMFOCUS
-#define ZOOMFOCUS(s) #s,
-static const char *zoomfocusstrs[] = {
-       #include "editing_syms.h"
-};
+extern const char *zoomfocusstrs[];
 inline const char* enum2str(ZoomFocus m) {return zoomfocusstrs[m];}
 ZoomFocus str2zoomfocus(const std::string &);
 
@@ -114,11 +94,7 @@ enum DisplayControl {
        #include "editing_syms.h"
 };
 
-#undef DISPLAYCONTROL
-#define DISPLAYCONTROL(s) #s,
-static const char *displaycontrolstrs[] = {
-       #include "editing_syms.h"
-};
+extern const char *displaycontrolstrs[];
 inline const char* enum2str(DisplayControl m) {return displaycontrolstrs[m];}
 DisplayControl str2displaycontrol (const std::string &);
 
@@ -132,11 +108,7 @@ enum ImportMode {
        #include "editing_syms.h"
 };
 
-#undef IMPORTMODE
-#define IMPORTMODE(s) #s,
-static const char *importmodestrs[] = {
-       #include "editing_syms.h"
-};
+extern const char *importmodestrs[];
 inline const char* enum2str(ImportMode m) {return importmodestrs[m];}
 ImportMode str2importmode (const std::string &);
 
index b3e228571473cc34c96ba3db87e50294a8ccb8b9..bb872049163cc6d4dedb62cbbca51f5c069306bf 100644 (file)
@@ -62,6 +62,7 @@
 #include "selection.h"
 #include "audio_streamview.h"
 #include "time_axis_view.h"
+#include "audio_time_axis.h"
 #include "utils.h"
 #include "crossfade_view.h"
 #include "editing.h"
@@ -98,7 +99,7 @@ const double Editor::timebar_height = 15.0;
 
 #include "editor_xpms"
 
-static const gchar *snap_type_strings[] = {
+static const gchar *_snap_type_strings[] = {
        N_("None"),
        N_("CD Frames"),
        N_("SMPTE Frames"),
@@ -122,13 +123,13 @@ static const gchar *snap_type_strings[] = {
        0
 };
 
-static const gchar *snap_mode_strings[] = {
-       N_("Normal Snap"),
-       N_("Magnetic Snap"),
+static const gchar *_snap_mode_strings[] = {
+       N_("Normal"),
+       N_("Magnetic"),
        0
 };
 
-static const gchar *zoom_focus_strings[] = {
+static const gchar *_zoom_focus_strings[] = {
        N_("Left"),
        N_("Right"),
        N_("Center"),
@@ -177,7 +178,7 @@ Editor::Editor (AudioEngine& eng)
 
          minsec_label (_("Mins:Secs")),
          bbt_label (_("Bars:Beats")),
-         smpte_label (_("SMPTE")),
+         smpte_label (_("Timecode")),
          frame_label (_("Frames")),
          tempo_label (_("Tempo")),
          meter_label (_("Meter")),
@@ -240,6 +241,10 @@ Editor::Editor (AudioEngine& eng)
        current_mixer_strip = 0;
        current_bbt_points = 0;
 
+       snap_type_strings = I18N (_snap_type_strings);
+       snap_mode_strings = I18N (_snap_mode_strings);
+       zoom_focus_strings = I18N(_zoom_focus_strings);
+
        snap_type = SnapToFrame;
        set_snap_to (snap_type);
        snap_mode = SnapNormal;
@@ -285,6 +290,7 @@ Editor::Editor (AudioEngine& eng)
        transport_marker_menu = 0;
        new_transport_marker_menu = 0;
        editor_mixer_strip_width = Wide;
+       show_editor_mixer_when_tracks_arrive = false;
        repos_zoom_queued = false;
        region_edit_menu_split_item = 0;
        temp_location = 0;
@@ -302,6 +308,7 @@ Editor::Editor (AudioEngine& eng)
        edit_cursor = 0;
        playhead_cursor = 0;
        button_release_can_deselect = true;
+       canvas_idle_queued = false;
 
        location_marker_color = color_map[cLocationMarker];
        location_range_color = color_map[cLocationRange];
@@ -511,7 +518,7 @@ Editor::Editor (AudioEngine& eng)
        edit_group_display.signal_button_press_event().connect (mem_fun(*this, &Editor::edit_group_list_button_press_event), false);
 
        VBox* edit_group_display_packer = manage (new VBox());
-       HButtonBox* edit_group_display_button_box = manage (new HButtonBox());
+       HBox* edit_group_display_button_box = manage (new HBox());
        edit_group_display_button_box->set_homogeneous (true);
 
        Button* edit_group_add_button = manage (new Button ());
@@ -546,7 +553,6 @@ Editor::Editor (AudioEngine& eng)
        region_list_display.set_model (region_list_model);
        region_list_display.append_column (_("Regions"), region_list_columns.name);
        region_list_display.set_headers_visible (false);
-       region_list_display.set_hover_expand (true);
 
        region_list_display.get_selection()->set_select_function (mem_fun (*this, &Editor::region_list_selection_filter));
        
@@ -632,6 +638,8 @@ Editor::Editor (AudioEngine& eng)
        the_notebook.popup_enable ();
        the_notebook.set_tab_pos (Gtk::POS_RIGHT);
 
+       post_maximal_editor_width = 0;
+       post_maximal_pane_position = 0;
        edit_pane.pack1 (edit_packer, true, true);
        edit_pane.pack2 (the_notebook, false, true);
        
@@ -1116,6 +1124,7 @@ Editor::connect_to_session (Session *t)
        update_title ();
 
        session->GoingAway.connect (mem_fun(*this, &Editor::session_going_away));
+       session->history().Changed.connect (mem_fun (*this, &Editor::history_changed));
 
        /* These signals can all be emitted by a non-GUI thread. Therefore the
           handlers for them must not attempt to directly interact with the GUI,
@@ -1308,7 +1317,6 @@ Editor::popup_fade_context_menu (int button, int32_t time, ArdourCanvas::Item* i
        }
 
        MenuList& items (fade_context_menu.items());
-       AudioRegion& ar (*arv->audio_region().get()); // FIXME
 
        items.clear ();
 
@@ -1323,11 +1331,11 @@ 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 (ar, &AudioRegion::set_fade_in_shape), AudioRegion::Linear)));
-               items.push_back (MenuElem (_("Slowest"), bind (mem_fun (ar, &AudioRegion::set_fade_in_shape), AudioRegion::LogB)));
-               items.push_back (MenuElem (_("Slow"), bind (mem_fun (ar, &AudioRegion::set_fade_in_shape), AudioRegion::Fast)));
-               items.push_back (MenuElem (_("Fast"), bind (mem_fun (ar, &AudioRegion::set_fade_in_shape), AudioRegion::LogA)));
-               items.push_back (MenuElem (_("Fastest"), bind (mem_fun (ar, &AudioRegion::set_fade_in_shape), AudioRegion::Slow)));
+               items.push_back (MenuElem (_("Linear"), bind (mem_fun (*arv, &AudioRegionView::set_fade_in_shape), AudioRegion::Linear)));
+               items.push_back (MenuElem (_("Slowest"), bind (mem_fun (*arv, &AudioRegionView::set_fade_in_shape), AudioRegion::LogB)));
+               items.push_back (MenuElem (_("Slow"), bind (mem_fun (*arv, &AudioRegionView::set_fade_in_shape), AudioRegion::Fast)));
+               items.push_back (MenuElem (_("Fast"), bind (mem_fun (*arv, &AudioRegionView::set_fade_in_shape), AudioRegion::LogA)));
+               items.push_back (MenuElem (_("Fastest"), bind (mem_fun (*arv, &AudioRegionView::set_fade_in_shape), AudioRegion::Slow)));
                break;
 
        case FadeOutItem:
@@ -1340,13 +1348,14 @@ 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 (ar, &AudioRegion::set_fade_out_shape), AudioRegion::Linear)));
-               items.push_back (MenuElem (_("Slowest"), bind (mem_fun (ar, &AudioRegion::set_fade_out_shape), AudioRegion::Fast)));
-               items.push_back (MenuElem (_("Slow"), bind (mem_fun (ar, &AudioRegion::set_fade_out_shape), AudioRegion::LogB)));
-               items.push_back (MenuElem (_("Fast"), bind (mem_fun (ar, &AudioRegion::set_fade_out_shape), AudioRegion::LogA)));
-               items.push_back (MenuElem (_("Fastest"), bind (mem_fun (ar, &AudioRegion::set_fade_out_shape), AudioRegion::Slow)));
+               items.push_back (MenuElem (_("Linear"), bind (mem_fun (*arv, &AudioRegionView::set_fade_out_shape), AudioRegion::Linear)));
+               items.push_back (MenuElem (_("Slowest"), bind (mem_fun (*arv, &AudioRegionView::set_fade_out_shape), AudioRegion::Fast)));
+               items.push_back (MenuElem (_("Slow"), bind (mem_fun (*arv, &AudioRegionView::set_fade_out_shape), AudioRegion::LogB)));
+               items.push_back (MenuElem (_("Fast"), bind (mem_fun (*arv, &AudioRegionView::set_fade_out_shape), AudioRegion::LogA)));
+               items.push_back (MenuElem (_("Fastest"), bind (mem_fun (*arv, &AudioRegionView::set_fade_out_shape), AudioRegion::Slow)));
 
                break;
+
        default:
                fatal << _("programming error: ")
                      << X_("non-fade canvas item passed to popup_fade_context_menu()")
@@ -1691,7 +1700,7 @@ Editor::add_region_context_items (AudioStreamView* sv, boost::shared_ptr<Region>
           become selected.
        */
 
-       region_menu->signal_map_event().connect (bind (mem_fun(*this, &Editor::set_selected_regionview_from_map_event), sv, boost::weak_ptr<Region>(region)));
+       // region_menu->signal_map_event().connect (bind (mem_fun(*this, &Editor::set_selected_regionview_from_map_event), sv, boost::weak_ptr<Region>(region)));
 
        items.push_back (MenuElem (_("Popup region editor"), mem_fun(*this, &Editor::edit_region)));
        items.push_back (MenuElem (_("Raise to top layer"), mem_fun(*this, &Editor::raise_region_to_top)));
@@ -1711,32 +1720,50 @@ Editor::add_region_context_items (AudioStreamView* sv, boost::shared_ptr<Region>
 
        items.push_back (SeparatorElem());
 
-       /* XXX hopefully this nonsense will go away with SigC++ 2.X, where the compiler
-          might be able to figure out which overloaded member function to use in
-          a bind() call ...
-       */
+       items.push_back (CheckMenuElem (_("Lock"), mem_fun(*this, &Editor::toggle_region_lock)));
+       region_lock_item = static_cast<CheckMenuItem*>(&items.back());
+       if (region->locked()) {
+               region_lock_item->set_active();
+       }
+       items.push_back (CheckMenuElem (_("Mute"), mem_fun(*this, &Editor::toggle_region_mute)));
+       region_mute_item = static_cast<CheckMenuItem*>(&items.back());
+       if (region->muted()) {
+               region_mute_item->set_active();
+       }
+       items.push_back (CheckMenuElem (_("Opaque"), mem_fun(*this, &Editor::toggle_region_opaque)));
+       region_opaque_item = static_cast<CheckMenuItem*>(&items.back());
+       if (region->opaque()) {
+               region_opaque_item->set_active();
+       }
 
-       void (Editor::*type_A_pmf)(void (Region::*pmf)(bool), bool) = &Editor::region_selection_op;
+       items.push_back (CheckMenuElem (_("Original position"), mem_fun(*this, &Editor::naturalize)));
+       if (region->at_natural_position()) {
+               items.back().set_sensitive (false);
+       }
 
-       items.push_back (MenuElem (_("Lock"), bind (mem_fun(*this, type_A_pmf), &Region::set_locked, true)));
-       items.push_back (MenuElem (_("Unlock"), bind (mem_fun(*this, type_A_pmf), &Region::set_locked, false)));
        items.push_back (SeparatorElem());
 
-       if (region->muted()) {
-               items.push_back (MenuElem (_("Unmute"), bind (mem_fun(*this, type_A_pmf), &Region::set_muted, false)));
-       } else {
-               items.push_back (MenuElem (_("Mute"), bind (mem_fun(*this, type_A_pmf), &Region::set_muted, true)));
-       }
-       items.push_back (SeparatorElem());
+       if (ar) {
+               
+               RegionView* rv = sv->find_view (ar);
+               AudioRegionView* arv = dynamic_cast<AudioRegionView*>(rv);
 
-       items.push_back (MenuElem (_("Original position"), mem_fun(*this, &Editor::naturalize)));
-       items.push_back (SeparatorElem());
+               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)));
+               region_envelope_visible_item = static_cast<CheckMenuItem*> (&items.back());
 
+               if (arv->envelope_visible()) {
+                       region_envelope_visible_item->set_active (true);
+               }
 
-       if (ar) {
+               items.push_back (CheckMenuElem (_("Envelope Active"), mem_fun(*this, &Editor::toggle_gain_envelope_active)));
+               region_envelope_active_item = static_cast<CheckMenuItem*> (&items.back());
+
+               if (ar->envelope_active()) {
+                       region_envelope_active_item->set_active (true);
+               }
 
-               items.push_back (MenuElem (_("Toggle envelope visibility"), mem_fun(*this, &Editor::toggle_gain_envelope_visibility)));
-               items.push_back (MenuElem (_("Toggle envelope active"), mem_fun(*this, &Editor::toggle_gain_envelope_active)));
                items.push_back (SeparatorElem());
 
                if (ar->scale_amplitude() != 1.0f) {
@@ -1752,7 +1779,7 @@ Editor::add_region_context_items (AudioStreamView* sv, boost::shared_ptr<Region>
        /* range related stuff */
 
        items.push_back (MenuElem (_("Add Range Markers"), mem_fun (*this, &Editor::add_location_from_audio_region)));
-       items.push_back (MenuElem (_("Set Range"), mem_fun (*this, &Editor::set_selection_from_audio_region)));
+       items.push_back (MenuElem (_("Set Range Selection"), mem_fun (*this, &Editor::set_selection_from_audio_region)));
        items.push_back (SeparatorElem());
                         
        /* Nudge region */
@@ -1789,8 +1816,6 @@ Editor::add_region_context_items (AudioStreamView* sv, boost::shared_ptr<Region>
        items.push_back (MenuElem (_("Fill Track"), (mem_fun(*this, &Editor::region_fill_track))));
        items.push_back (SeparatorElem());
        items.push_back (MenuElem (_("Remove"), mem_fun(*this, &Editor::remove_clicked_region)));
-       items.push_back (SeparatorElem());
-       items.push_back (MenuElem (_("Destroy"), mem_fun(*this, &Editor::destroy_clicked_region)));
 
        /* OK, stick the region submenu at the top of the list, and then add
           the standard items.
@@ -1861,7 +1886,7 @@ Editor::add_dstream_context_items (Menu_Helpers::MenuList& edit_items)
        MenuList& play_items = play_menu->items();
        play_menu->set_name ("ArdourContextMenu");
        
-       play_items.push_back (MenuElem (_("Play from edit cursor")));
+       play_items.push_back (MenuElem (_("Play from edit cursor"), mem_fun(*this, &Editor::play_from_edit_cursor)));
        play_items.push_back (MenuElem (_("Play from start"), mem_fun(*this, &Editor::play_from_start)));
        play_items.push_back (MenuElem (_("Play region"), mem_fun(*this, &Editor::play_selected_region)));
        play_items.push_back (SeparatorElem());
@@ -1946,7 +1971,7 @@ Editor::add_bus_context_items (Menu_Helpers::MenuList& edit_items)
        MenuList& play_items = play_menu->items();
        play_menu->set_name ("ArdourContextMenu");
        
-       play_items.push_back (MenuElem (_("Play from edit cursor")));
+       play_items.push_back (MenuElem (_("Play from edit cursor"), mem_fun(*this, &Editor::play_from_edit_cursor)));
        play_items.push_back (MenuElem (_("Play from start"), mem_fun(*this, &Editor::play_from_start)));
        edit_items.push_back (MenuElem (_("Play"), *play_menu));
 
@@ -1995,10 +2020,13 @@ Editor::add_bus_context_items (Menu_Helpers::MenuList& edit_items)
 
 void
 Editor::set_snap_to (SnapType st)
-{
+{      
        snap_type = st;
-       vector<string> txt = internationalize (snap_type_strings);
-       snap_type_selector.set_active_text (txt[(int)st]);
+       string str = snap_type_strings[(int) st];
+
+       if (str != snap_type_selector.get_active_text()) {
+               snap_type_selector.set_active_text (str);
+       }
 
        instant_save ();
 
@@ -2019,8 +2047,11 @@ void
 Editor::set_snap_mode (SnapMode mode)
 {
        snap_mode = mode;
-       vector<string> txt = internationalize (snap_mode_strings);
-       snap_mode_selector.set_active_text (txt[(int)mode]);
+       string str = snap_mode_strings[(int)mode];
+
+       if (str != snap_mode_selector.get_active_text ()) {
+               snap_mode_selector.set_active_text (str);
+       }
 
        instant_save ();
 }
@@ -2147,6 +2178,7 @@ Editor::set_state (const XMLNode& node)
 
                Glib::RefPtr<Action> act = ActionManager::get_action (X_("Editor"), X_("show-editor-mixer"));
                if (act) {
+
                        Glib::RefPtr<ToggleAction> tact = Glib::RefPtr<ToggleAction>::cast_dynamic(act);
                        bool yn = (prop->value() == X_("yes"));
 
@@ -2584,10 +2616,10 @@ Editor::setup_toolbar ()
        zoom_box.pack_start (zoom_out_full_button, false, false);
        
        ARDOUR_UI::instance()->tooltips().set_tip (zoom_range_clock, _("Current Zoom Range\n(Width of visible area)"));
-       
+
        zoom_focus_selector.set_name ("ZoomFocusSelector");
        Gtkmm2ext::set_size_request_to_display_given_text (zoom_focus_selector, "Focus Center", 2+FUDGE, 0);
-       set_popdown_strings (zoom_focus_selector, internationalize (zoom_focus_strings));
+       set_popdown_strings (zoom_focus_selector, zoom_focus_strings);
        zoom_focus_selector.signal_changed().connect (mem_fun(*this, &Editor::zoom_focus_selection_done));
        ARDOUR_UI::instance()->tooltips().set_tip (zoom_focus_selector, _("Zoom focus"));
 
@@ -2601,13 +2633,13 @@ Editor::setup_toolbar ()
 
        snap_type_selector.set_name ("SnapTypeSelector");
        Gtkmm2ext::set_size_request_to_display_given_text (snap_type_selector, "SMPTE Seconds", 2+FUDGE, 10);
-       set_popdown_strings (snap_type_selector, internationalize (snap_type_strings));
+       set_popdown_strings (snap_type_selector, snap_type_strings);
        snap_type_selector.signal_changed().connect (mem_fun(*this, &Editor::snap_type_selection_done));
        ARDOUR_UI::instance()->tooltips().set_tip (snap_type_selector, _("Unit to snap cursors and ranges to"));
 
        snap_mode_selector.set_name ("SnapModeSelector");
        Gtkmm2ext::set_size_request_to_display_given_text (snap_mode_selector, "Magnetic Snap", 2+FUDGE, 10);
-       set_popdown_strings (snap_mode_selector, internationalize (snap_mode_strings));
+       set_popdown_strings (snap_mode_selector, snap_mode_strings);
        snap_mode_selector.signal_changed().connect (mem_fun(*this, &Editor::snap_mode_selection_done));
 
        snap_box.pack_start (edit_cursor_clock, false, false);
@@ -2819,33 +2851,36 @@ Editor::commit_reversible_command ()
 }
 
 bool
-Editor::set_selected_track_from_click (bool press, Selection::Operation op, bool with_undo, bool no_remove)
+Editor::set_selected_track (TimeAxisView& view, Selection::Operation op, bool no_remove)
 {
        bool commit = false;
 
-       if (!clicked_axisview) {
-               return false;
-       }
-
        switch (op) {
        case Selection::Toggle:
-               if (selection->selected (clicked_axisview)) {
+               if (selection->selected (&view)) {
                        if (!no_remove) {
-                               selection->remove (clicked_axisview);
+                               selection->remove (&view);
                                commit = true;
                        }
                } else {
-                       selection->add (clicked_axisview);
+                       selection->add (&view);
                        commit = false;
                }
                break;
 
+       case Selection::Add:
+               if (!selection->selected (&view)) {
+                       selection->add (&view);
+                       commit = true;
+               }
+               break;
+
        case Selection::Set:
-               if (selection->selected (clicked_axisview) && selection->tracks.size() == 1) {
+               if (selection->selected (&view) && selection->tracks.size() == 1) {
                        /* no commit necessary */
                } 
 
-               selection->set (clicked_axisview);
+               selection->set (&view);
                break;
                
        case Selection::Extend:
@@ -2857,7 +2892,17 @@ Editor::set_selected_track_from_click (bool press, Selection::Operation op, bool
 }
 
 bool
-Editor::set_selected_control_point_from_click (bool press, Selection::Operation op, bool with_undo, bool no_remove)
+Editor::set_selected_track_from_click (Selection::Operation op, bool no_remove)
+{
+       if (!clicked_routeview) {
+               return false;
+       }
+       
+       return set_selected_track (*clicked_routeview, op, no_remove);
+}
+
+bool
+Editor::set_selected_control_point_from_click (Selection::Operation op, bool no_remove)
 {
        if (!clicked_control_point) {
                return false;
@@ -2877,7 +2922,7 @@ Editor::set_selected_control_point_from_click (bool press, Selection::Operation
 }
 
 void
-Editor::get_relevant_tracks (RouteTimeAxisView& base, set<RouteTimeAxisView*>& relevant_tracks)
+Editor::get_relevant_tracks (set<RouteTimeAxisView*>& relevant_tracks)
 {
        /* step one: get all selected tracks and all tracks in the relevant edit groups */
 
@@ -2906,14 +2951,9 @@ Editor::get_relevant_tracks (RouteTimeAxisView& base, set<RouteTimeAxisView*>& r
                                        }
                                }
                        }
-
                } else {
-
-                       /* no active group, or no group */
-
-                       relevant_tracks.insert (&base);
+                       relevant_tracks.insert (atv);
                }
-
        }
 }
 
@@ -2922,14 +2962,10 @@ Editor::mapover_tracks (slot<void,RouteTimeAxisView&,uint32_t> sl)
 {
        set<RouteTimeAxisView*> relevant_tracks;
 
-       if (!clicked_routeview) {
-               return;
-       }
-
-       get_relevant_tracks (*clicked_routeview, relevant_tracks);
+       get_relevant_tracks (relevant_tracks);
 
        uint32_t sz = relevant_tracks.size();
-       
+
        for (set<RouteTimeAxisView*>::iterator ati = relevant_tracks.begin(); ati != relevant_tracks.end(); ++ati) {
                sl (**ati, sz);
        }
@@ -3117,7 +3153,7 @@ Editor::set_selected_regionview_from_click (bool press, Selection::Operation op,
 
                set<RouteTimeAxisView*> relevant_tracks;
                
-               get_relevant_tracks (*clicked_routeview, relevant_tracks);
+               get_relevant_tracks (relevant_tracks);
                
                for (set<RouteTimeAxisView*>::iterator t = relevant_tracks.begin(); t != relevant_tracks.end(); ++t) {
                        (*t)->get_selectables (first_frame, last_frame, -1.0, -1.0, results);
@@ -3192,6 +3228,9 @@ Editor::set_selected_regionview_from_region_list (boost::shared_ptr<Region> regi
        case Selection::Extend:
                selection->add (all_equivalent_regions);
                break;
+       case Selection::Add:
+               selection->add (all_equivalent_regions);
+               break;
        }
 
        commit_reversible_command () ;
@@ -3259,89 +3298,27 @@ Editor::set_edit_group_mute (Route& route, bool yn)
 }
                
 void
-Editor::set_edit_menu (Menu& menu)
-{
-       edit_menu = &menu;
-       edit_menu->signal_map_event().connect (mem_fun(*this, &Editor::edit_menu_map_handler));
-}
-
-bool
-Editor::edit_menu_map_handler (GdkEventAny* ev)
+Editor::history_changed ()
 {
-       using namespace Menu_Helpers;
-       MenuList& edit_items = edit_menu->items();
        string label;
 
-       /* Nuke all the old items */
-               
-       edit_items.clear ();
-
-       if (session == 0) {
-               return false;
-       }
-
-       if (session->undo_depth() == 0) {
-               label = _("Undo");
-       } else {
-               label = string_compose(_("Undo (%1)"), session->next_undo());
-       }
-       
-       edit_items.push_back (MenuElem (label, bind (mem_fun(*this, &Editor::undo), 1U)));
-       
-       if (session->undo_depth() == 0) {
-               edit_items.back().set_sensitive (false);
-       }
-       
-       if (session->redo_depth() == 0) {
-               label = _("Redo");
-       } else {
-               label = string_compose(_("Redo (%1)"), session->next_redo());
-       }
-       
-       edit_items.push_back (MenuElem (label, bind (mem_fun(*this, &Editor::redo), 1U)));
-       if (session->redo_depth() == 0) {
-               edit_items.back().set_sensitive (false);
-       }
-
-       vector<MenuItem*> mitems;
-
-       edit_items.push_back (SeparatorElem());
-       edit_items.push_back (MenuElem (_("Cut"), mem_fun(*this, &Editor::cut)));
-       mitems.push_back (&edit_items.back());
-       edit_items.push_back (MenuElem (_("Copy"), mem_fun(*this, &Editor::copy)));
-       mitems.push_back (&edit_items.back());
-       edit_items.push_back (MenuElem (_("Paste"), bind (mem_fun(*this, &Editor::paste), 1.0f)));
-       mitems.push_back (&edit_items.back());
-       edit_items.push_back (SeparatorElem());
-       edit_items.push_back (MenuElem (_("Align"), bind (mem_fun(*this, &Editor::align), ARDOUR::SyncPoint)));
-       mitems.push_back (&edit_items.back());
-       edit_items.push_back (MenuElem (_("Align Relative"), bind (mem_fun(*this, &Editor::align_relative), ARDOUR::SyncPoint)));
-       mitems.push_back (&edit_items.back());
-       edit_items.push_back (SeparatorElem());
-
-       if (selection->empty()) {
-               for (vector<MenuItem*>::iterator i = mitems.begin(); i != mitems.end(); ++i) {
-                       (*i)->set_sensitive (false);
+       if (undo_action && session) {
+               if (session->undo_depth() == 0) {
+                       label = _("Undo");
+               } else {
+                       label = string_compose(_("Undo (%1)"), session->next_undo());
                }
+               undo_action->property_label() = label;
        }
 
-       Menu* import_menu = manage (new Menu());
-       import_menu->set_name ("ArdourContextMenu");
-       MenuList& import_items = import_menu->items();
-       
-       import_items.push_back (MenuElem (_("... as new track"), bind (mem_fun(*this, &Editor::add_external_audio_action), ImportAsTrack)));
-       import_items.push_back (MenuElem (_("... as new region"), bind (mem_fun(*this, &Editor::add_external_audio_action), ImportAsRegion)));
-
-       edit_items.push_back (MenuElem (_("Import audio (copy)"), *import_menu));
-       edit_items.push_back (SeparatorElem());
-
-       edit_items.push_back (MenuElem (_("Remove last capture"), mem_fun(*this, &Editor::remove_last_capture)));
-
-       if (!session->have_captured()) {
-               edit_items.back().set_sensitive (false);
+       if (redo_action && session) {
+               if (session->redo_depth() == 0) {
+                       label = _("Redo");
+               } else {
+                       label = string_compose(_("Redo (%1)"), session->next_redo());
+               }
+               redo_action->property_label() = label;
        }
-
-       return false;
 }
 
 void
@@ -3449,10 +3426,6 @@ Editor::edit_mode_selection_done ()
 void
 Editor::snap_type_selection_done ()
 {
-       if (session == 0) {
-               return;
-       }
-
        string choice = snap_type_selector.get_active_text();
        SnapType snaptype = SnapToFrame;
 
@@ -3498,35 +3471,34 @@ Editor::snap_type_selection_done ()
                snaptype = SnapToFrame;
        }
 
-       set_snap_to (snaptype);
+       RefPtr<RadioAction> ract = snap_type_action (snaptype);
+       if (ract) {
+               ract->set_active ();
+       }
 }      
 
 void
 Editor::snap_mode_selection_done ()
 {
-       if(session == 0) {
-               return;
-       }
-
        string choice = snap_mode_selector.get_active_text();
        SnapMode mode = SnapNormal;
 
-       if (choice == _("Normal Snap")) {
+       if (choice == _("Normal")) {
                mode = SnapNormal;
-       } else if (choice == _("Magnetic Snap")) {
+       } else if (choice == _("Magnetic")) {
                mode = SnapMagnetic;
        }
 
-       set_snap_mode (mode);
+       RefPtr<RadioAction> ract = snap_mode_action (mode);
+
+       if (ract) {
+               ract->set_active (true);
+       }
 }
 
 void
 Editor::zoom_focus_selection_done ()
 {
-       if (session == 0) {
-               return;
-       }
-
        string choice = zoom_focus_selector.get_active_text();
        ZoomFocus focus_type = ZoomFocusLeft;
 
@@ -3541,8 +3513,12 @@ Editor::zoom_focus_selection_done ()
        } else if (choice == _("Edit Cursor")) {
                focus_type = ZoomFocusEdit;
        } 
+       
+       RefPtr<RadioAction> ract = zoom_focus_action (focus_type);
 
-       set_zoom_focus (focus_type);
+       if (ract) {
+               ract->set_active ();
+       }
 }      
 
 gint
@@ -3673,8 +3649,11 @@ Editor::get_valid_views (TimeAxisView* track, RouteGroup* group)
 void
 Editor::set_zoom_focus (ZoomFocus f)
 {
-       vector<string> txt = internationalize (zoom_focus_strings);
-       zoom_focus_selector.set_active_text (txt[(int)f]);
+       string str = zoom_focus_strings[(int)f];
+
+       if (str != zoom_focus_selector.get_active_text()) {
+               zoom_focus_selector.set_active_text (str);
+       }
        
        if (zoom_focus != f) {
                zoom_focus = f;
@@ -3985,7 +3964,18 @@ Editor::redisplay_snapshots ()
        for (vector<string*>::iterator i = states->begin(); i != states->end(); ++i) {
                string statename = *(*i);
                TreeModel::Row row = *(snapshot_display_model->append());
-               row[snapshot_display_columns.visible_name] = statename;
+               
+               // we don't have a way of changing the rendering in just one TreeView 
+               // cell so just put an asterisk on each side of the name for now.
+               string display_name;
+               if (statename == session->snap_name()) {
+                       display_name = "*"+statename+"*";
+                       snapshot_display.get_selection()->select(row);
+               } else {
+                       display_name = statename;
+               }
+               
+               row[snapshot_display_columns.visible_name] = display_name;
                row[snapshot_display_columns.real_name] = statename;
        }
 
@@ -4002,24 +3992,48 @@ Editor::session_state_saved (string snap_name)
 void
 Editor::maximise_editing_space ()
 {
+       initial_ruler_update_required = true;
+
        mouse_mode_tearoff->set_visible (false);
        tools_tearoff->set_visible (false);
 
        pre_maximal_pane_position = edit_pane.get_position();
-       edit_pane.set_position (edit_pane.get_width());
+       pre_maximal_editor_width = this->get_width();
+
+       if(post_maximal_pane_position == 0) {
+               post_maximal_pane_position = edit_pane.get_width();
+       }
+
 
        fullscreen();
+       if(post_maximal_editor_width) {
+               edit_pane.set_position (post_maximal_pane_position - 
+                       abs(post_maximal_editor_width - pre_maximal_editor_width));
+       } else {
+               edit_pane.set_position (post_maximal_pane_position);
+       }
 }
 
 void
 Editor::restore_editing_space ()
 {
+       initial_ruler_update_required = true;
+
+       // user changed width of pane during fullscreen
+       if(post_maximal_pane_position != edit_pane.get_position()) {
+               post_maximal_pane_position = edit_pane.get_position();
+       }
+
+       unfullscreen();
+
        mouse_mode_tearoff->set_visible (true);
        tools_tearoff->set_visible (true);
+       post_maximal_editor_width = this->get_width();
 
-       edit_pane.set_position (pre_maximal_pane_position);
 
-       unfullscreen();
+       edit_pane.set_position (
+               pre_maximal_pane_position + abs(this->get_width() - pre_maximal_editor_width)
+       );
 }
 
 void 
index e604053254fb027feccca60029dfda6ddec1f19c..9a18516588d32f29661dc628df2b3ab76770be20 100644 (file)
@@ -174,8 +174,6 @@ class Editor : public PublicEditor
 
        /* undo related */
 
-       void set_edit_menu (Gtk::Menu&);
-
        nframes_t unit_to_frame (double unit) {
                return (nframes_t) rint (unit * frames_per_unit);
        }
@@ -244,11 +242,6 @@ class Editor : public PublicEditor
        void export_session();
        void export_selection();
 
-       /* this is what actually does it */
-       
-       void export_audiofile (ARDOUR::AudioExportSpecification&);
-
-       /* */
 
        void add_toplevel_controls (Gtk::Container&);
 
@@ -355,12 +348,13 @@ class Editor : public PublicEditor
        PlaylistSelector* _playlist_selector;
 
        void          set_frames_per_unit (double);
-       void          frames_per_unit_modified ();
 
        Editing::MouseMode mouse_mode;
-       void      mouse_insert (GdkEventButton *);
 
+       int  post_maximal_editor_width;
+       int  post_maximal_pane_position;
        int  pre_maximal_pane_position;
+       int  pre_maximal_editor_width;
        void pane_allocation_handler (Gtk::Allocation&, Gtk::Paned*);
 
        Gtk::Notebook the_notebook;
@@ -419,7 +413,7 @@ class Editor : public PublicEditor
        CrossfadeView*     clicked_crossfadeview;
        ControlPoint*      clicked_control_point;
 
-       void get_relevant_tracks (RouteTimeAxisView& base, std::set<RouteTimeAxisView*>& relevant_tracks);
+       void get_relevant_tracks (std::set<RouteTimeAxisView*>& relevant_tracks);
        void mapover_tracks (sigc::slot<void,RouteTimeAxisView&,uint32_t> sl);
 
        /* functions to be passed to mapover_tracks(), possibly with sigc::bind()-supplied arguments */
@@ -436,8 +430,10 @@ class Editor : public PublicEditor
 
        void catch_vanishing_regionview (RegionView *);
 
-       bool set_selected_control_point_from_click (bool press, Selection::Operation op = Selection::Set, bool with_undo = true, bool no_remove=false);
-       bool set_selected_track_from_click (bool press, Selection::Operation op = Selection::Set, bool with_undo = true, bool no_remove=false);
+       bool set_selected_track (TimeAxisView&, Selection::Operation op = Selection::Set, bool no_remove=false);
+
+       bool set_selected_control_point_from_click (Selection::Operation op = Selection::Set, bool no_remove=false);
+       bool set_selected_track_from_click (Selection::Operation op = Selection::Set, bool no_remove=false);
        bool set_selected_regionview_from_click (bool press, Selection::Operation op = Selection::Set, bool no_track_remove=false);
 
        void set_selected_regionview_from_region_list (boost::shared_ptr<ARDOUR::Region> region, Selection::Operation op = Selection::Set);
@@ -495,9 +491,6 @@ class Editor : public PublicEditor
 
        bool verbose_cursor_on; // so far unused
 
-       void flush_track_canvas ();
-       void flush_time_canvas ();
-
        Gtk::EventBox      time_canvas_event_box;
        Gtk::EventBox      track_canvas_event_box;
        Gtk::EventBox      time_button_event_box;
@@ -668,9 +661,6 @@ class Editor : public PublicEditor
        Gtk::Menu *edit_controls_left_menu;
        Gtk::Menu *edit_controls_right_menu;
 
-       void track_canvas_scroller_realized ();
-       void time_canvas_scroller_realized ();
-
        Gtk::VBox           track_canvas_vbox;
        Gtk::VBox           time_canvas_vbox;
        Gtk::VBox           edit_controls_vbox;
@@ -807,9 +797,6 @@ class Editor : public PublicEditor
        
        void update_current_screen ();
        
-       gint show_track_context_menu (GdkEventButton *);
-       void hide_track_context_menu ();
-
        void session_going_away ();
 
        nframes_t cut_buffer_start;
@@ -828,8 +815,8 @@ class Editor : public PublicEditor
 
        int ensure_cursor (nframes_t* pos);
 
-       void handle_new_region (boost::shared_ptr<ARDOUR::Region>);
-       void handle_region_removed (boost::shared_ptr<ARDOUR::Region>);
+       void handle_new_region (boost::weak_ptr<ARDOUR::Region>);
+       void handle_region_removed (boost::weak_ptr<ARDOUR::Region>);
        void add_region_to_region_display (boost::shared_ptr<ARDOUR::Region>);
        void region_hidden (boost::shared_ptr<ARDOUR::Region>);
        void redisplay_regions ();
@@ -849,6 +836,7 @@ class Editor : public PublicEditor
        
        void reset_point_selection ();
        void toggle_region_mute ();
+       void toggle_region_lock ();
        void toggle_region_opaque ();
        void raise_region ();
        void raise_region_to_top ();
@@ -865,7 +853,6 @@ class Editor : public PublicEditor
        void align_selection_relative (ARDOUR::RegionPoint point, nframes_t position);
        void align_region (boost::shared_ptr<ARDOUR::Region>, ARDOUR::RegionPoint point, nframes_t position);
        void align_region_internal (boost::shared_ptr<ARDOUR::Region>, ARDOUR::RegionPoint point, nframes_t position);
-       void remove_some_regions ();
        void remove_clicked_region ();
        void destroy_clicked_region ();
        void edit_region ();
@@ -898,7 +885,6 @@ class Editor : public PublicEditor
        void keyboard_paste ();
        void keyboard_duplicate_region ();
        void keyboard_duplicate_selection ();
-       void keyboard_nudge ();
        void keyboard_insert_region_list_selection ();
 
        void region_from_selection ();
@@ -912,7 +898,6 @@ class Editor : public PublicEditor
        void play_from_edit_cursor ();
        void play_selected_region ();
        void audition_selected_region ();
-       void toggle_loop_playback ();
        void loop_selected_region ();
        void play_location (ARDOUR::Location&);
        void loop_location (ARDOUR::Location&);
@@ -1030,10 +1015,6 @@ class Editor : public PublicEditor
        Editing::SnapMode snap_mode;
        double snap_threshold;
 
-       void soundfile_chosen_for_insert (const string & selection, bool split_channels);
-       void soundfile_chosen_for_embed (const string & selection, bool split_channels);
-       void soundfile_chosen_for_import (const string & selection, bool split_channels);
-
        void handle_gui_changes (const string &, void *);
 
        void    hide_all_tracks (bool with_select);
@@ -1058,7 +1039,6 @@ class Editor : public PublicEditor
        std::set<ARDOUR::Playlist*> motion_frozen_playlists;
        void region_drag_motion_callback (ArdourCanvas::Item*, GdkEvent*);
        void region_drag_finished_callback (ArdourCanvas::Item*, GdkEvent*);
-       void region_copy_drag_finished_callback (ArdourCanvas::Item*, GdkEvent*);
 
        void cursor_drag_motion_callback (ArdourCanvas::Item*, GdkEvent*);
        void cursor_drag_finished_callback (ArdourCanvas::Item*, GdkEvent*);
@@ -1146,11 +1126,10 @@ class Editor : public PublicEditor
        bool track_canvas_event (GdkEvent* event, ArdourCanvas::Item*);
        bool track_canvas_scroll (GdkEventScroll* event);
 
-       bool track_canvas_button_press_event (GdkEventButton *);
-       bool track_canvas_button_release_event (GdkEventButton *);
-       
+       Gtk::Allocation canvas_allocation;
+       bool canvas_idle_queued;
        void track_canvas_allocate (Gtk::Allocation alloc);
-       void time_canvas_allocate (Gtk::Allocation alloc);
+       bool track_canvas_idle ();
 
        void set_edit_cursor (GdkEvent* event);
        void set_playhead_cursor (GdkEvent* event);
@@ -1176,7 +1155,6 @@ class Editor : public PublicEditor
        void handle_new_duration ();
        void initialize_canvas ();
        void reset_scrolling_region (Gtk::Allocation* alloc = 0);
-       void scroll_canvas ();
 
        /* display control */
        
@@ -1302,17 +1280,29 @@ class Editor : public PublicEditor
        Gtk::ComboBoxText snap_mode_selector;
        Gtk::HBox         snap_box;
 
+       std::vector<std::string> snap_type_strings;
+       std::vector<std::string> snap_mode_strings;
+
        void snap_type_selection_done ();
        void snap_mode_selection_done ();
-       
+       void snap_mode_chosen (Editing::SnapMode);
+       void snap_type_chosen (Editing::SnapType);
+
+       Glib::RefPtr<Gtk::RadioAction> snap_type_action (Editing::SnapType);
+       Glib::RefPtr<Gtk::RadioAction> snap_mode_action (Editing::SnapMode);
+
        Gtk::ComboBoxText zoom_focus_selector;
-       Gtk::VBox                zoom_focus_box;
+       Gtk::VBox         zoom_focus_box;
+
+       std::vector<std::string> zoom_focus_strings;
        
        void zoom_focus_selection_done ();
+       void zoom_focus_chosen (Editing::ZoomFocus);
+
+       Glib::RefPtr<Gtk::RadioAction> zoom_focus_action (Editing::ZoomFocus);
 
        Gtk::HBox           zoom_box;
 
-       void                update_zoom_indicator ();
        void                zoom_adjustment_changed();
 
        void                edit_cursor_clock_changed();
@@ -1333,8 +1323,6 @@ class Editor : public PublicEditor
        void track_selection_changed ();
        void region_selection_changed ();
        void point_selection_changed ();
-       void audio_track_selection_changed ();
-       void line_selection_changed ();
 
        enum SelectionOp {
                CreateSelection,
@@ -1423,7 +1411,6 @@ class Editor : public PublicEditor
        Glib::RefPtr<Gtk::ListStore>     route_display_model;
        Glib::RefPtr<Gtk::TreeSelection> route_display_selection;
 
-       gint route_list_compare_func (Gtk::TreeModel::iterator, Gtk::TreeModel::iterator);
        Gtkmm2ext::DnDTreeView<boost::shared_ptr<ARDOUR::Route> > route_list_display; 
        Gtk::ScrolledWindow                   route_list_scroller;
        Gtk::Menu*                            route_list_menu;
@@ -1438,7 +1425,6 @@ class Editor : public PublicEditor
        void route_list_reordered (const Gtk::TreeModel::Path& path, const Gtk::TreeModel::iterator& iter, int* what);
        bool ignore_route_list_reorder;
        bool no_route_list_redisplay;
-       void queue_route_list_reordered ();
 
        void build_route_list_menu ();
        void show_route_list_menu ();
@@ -1486,9 +1472,6 @@ class Editor : public PublicEditor
        void new_edit_group ();
        void edit_group_list_button_clicked ();
        gint edit_group_list_button_press_event (GdkEventButton* ev);
-       void edit_group_selection_changed ();
-       void fake_add_edit_group (ARDOUR::RouteGroup* group);
-       void fake_remove_edit_group (ARDOUR::RouteGroup* group);
        void add_edit_group (ARDOUR::RouteGroup* group);
        void remove_selected_edit_group ();
        void edit_groups_changed ();
@@ -1605,8 +1588,6 @@ class Editor : public PublicEditor
        UndoHistory visual_history;
        UndoTransaction current_visual_command;
 
-       void begin_reversible_visual_command (const string & cmd_name);
-       void commit_reversible_visual_command ();
 
        void update_title ();   
        void update_title_s (const string & snapshot_name);
@@ -1645,11 +1626,6 @@ class Editor : public PublicEditor
 
        void duplicate_dialog (bool for_region);
        
-       /* edit menu */
-
-       Gtk::Menu* edit_menu;
-       bool edit_menu_map_handler (GdkEventAny*);
-
        nframes_t event_frame (GdkEvent*, double* px = 0, double* py = 0);
 
        void time_fx_motion (ArdourCanvas::Item*, GdkEvent*);
@@ -1691,6 +1667,7 @@ class Editor : public PublicEditor
        /* editor-mixer strip */
 
        MixerStrip *current_mixer_strip;
+       bool show_editor_mixer_when_tracks_arrive;
        Gtk::VBox current_mixer_strip_vbox;
        void cms_deleted ();
        void current_mixer_strip_hidden ();
@@ -1751,7 +1728,6 @@ class Editor : public PublicEditor
        void toggle_xfade_active (ARDOUR::Crossfade*);
        void toggle_xfade_length (ARDOUR::Crossfade*);
        void edit_xfade (ARDOUR::Crossfade*);
-       void remove_xfade ();
        void xfade_edit_left_region ();
        void xfade_edit_right_region ();
 
@@ -1797,10 +1773,23 @@ class Editor : public PublicEditor
 
        void toggle_gain_envelope_visibility ();
        void toggle_gain_envelope_active ();
+       void reset_region_gain_envelopes ();
+
+       Gtk::CheckMenuItem* region_envelope_visible_item;
+       Gtk::CheckMenuItem* region_envelope_active_item;
+       Gtk::CheckMenuItem* region_mute_item;
+       Gtk::CheckMenuItem* region_lock_item;
+       Gtk::CheckMenuItem* region_opaque_item;
        
        bool on_key_press_event (GdkEventKey*);
 
        void session_state_saved (string);
+
+       Glib::RefPtr<Gtk::Action>              undo_action;
+       Glib::RefPtr<Gtk::Action>              redo_action;
+
+       void history_changed ();
+
 };
 
 #endif /* __ardour_editor_h__ */
index 0485f4cc8a5b79022ad57045e409d383c2e4b3bd..a55aee62327b11442d130837454291cb84ab28bb 100644 (file)
@@ -40,7 +40,7 @@ Editor::register_actions ()
        ActionManager::register_action (editor_actions, X_("Monitoring"), _("Monitoring"));
        ActionManager::register_action (editor_actions, X_("Autoconnect"), _("Autoconnect"));
        ActionManager::register_action (editor_actions, X_("Layering"), _("Layering"));
-       ActionManager::register_action (editor_actions, X_("SMPTE"), _("SMPTE fps"));
+       ActionManager::register_action (editor_actions, X_("Timecode"), _("Timecode fps"));
        ActionManager::register_action (editor_actions, X_("Pullup"), _("Pullup / Pulldown"));
        ActionManager::register_action (editor_actions, X_("addExistingAudioFiles"), _("Add Existing Audio"));
 
@@ -201,9 +201,9 @@ Editor::register_actions ()
        act = ActionManager::register_action (editor_actions, "set-region-sync-position", _("Set Region Sync Position"), mem_fun(*this, &Editor::kbd_set_sync_position));
         ActionManager::session_sensitive_actions.push_back (act);
 
-       act = ActionManager::register_action (editor_actions, "undo", _("Undo"), bind (mem_fun(*this, &Editor::undo), 1U));
+       undo_action = act = ActionManager::register_action (editor_actions, "undo", _("Undo"), bind (mem_fun(*this, &Editor::undo), 1U));
        ActionManager::session_sensitive_actions.push_back (act);
-       act = ActionManager::register_action (editor_actions, "redo", _("Redo"), bind (mem_fun(*this, &Editor::redo), 1U));
+       redo_action = act = ActionManager::register_action (editor_actions, "redo", _("Redo"), bind (mem_fun(*this, &Editor::redo), 1U));
        ActionManager::session_sensitive_actions.push_back (act);
 
        act = ActionManager::register_action (editor_actions, "export-session", _("Export Session"), mem_fun(*this, &Editor::export_session));
@@ -258,15 +258,15 @@ Editor::register_actions ()
        Glib::RefPtr<ActionGroup> zoom_actions = ActionGroup::create (X_("Zoom"));
        RadioAction::Group zoom_group;
 
-       ActionManager::register_radio_action (zoom_actions, zoom_group, "zoom-focus-left", _("Zoom Focus Left"), bind (mem_fun(*this, &Editor::set_zoom_focus), Editing::ZoomFocusLeft));
+       ActionManager::register_radio_action (zoom_actions, zoom_group, "zoom-focus-left", _("Zoom Focus Left"), bind (mem_fun(*this, &Editor::zoom_focus_chosen), Editing::ZoomFocusLeft));
        ActionManager::session_sensitive_actions.push_back (act);
-       ActionManager::register_radio_action (zoom_actions, zoom_group, "zoom-focus-right", _("Zoom Focus Right"), bind (mem_fun(*this, &Editor::set_zoom_focus), Editing::ZoomFocusRight));
+       ActionManager::register_radio_action (zoom_actions, zoom_group, "zoom-focus-right", _("Zoom Focus Right"), bind (mem_fun(*this, &Editor::zoom_focus_chosen), Editing::ZoomFocusRight));
        ActionManager::session_sensitive_actions.push_back (act);
-       ActionManager::register_radio_action (zoom_actions, zoom_group, "zoom-focus-center", _("Zoom Focus Center"), bind (mem_fun(*this, &Editor::set_zoom_focus), Editing::ZoomFocusCenter));
+       ActionManager::register_radio_action (zoom_actions, zoom_group, "zoom-focus-center", _("Zoom Focus Center"), bind (mem_fun(*this, &Editor::zoom_focus_chosen), Editing::ZoomFocusCenter));
        ActionManager::session_sensitive_actions.push_back (act);
-       ActionManager::register_radio_action (zoom_actions, zoom_group, "zoom-focus-playhead", _("Zoom Focus Playhead"), bind (mem_fun(*this, &Editor::set_zoom_focus), Editing::ZoomFocusPlayhead));
+       ActionManager::register_radio_action (zoom_actions, zoom_group, "zoom-focus-playhead", _("Zoom Focus Playhead"), bind (mem_fun(*this, &Editor::zoom_focus_chosen), Editing::ZoomFocusPlayhead));
        ActionManager::session_sensitive_actions.push_back (act);
-       ActionManager::register_radio_action (zoom_actions, zoom_group, "zoom-focus-edit", _("Zoom Focus Edit"), bind (mem_fun(*this, &Editor::set_zoom_focus), Editing::ZoomFocusEdit));
+       ActionManager::register_radio_action (zoom_actions, zoom_group, "zoom-focus-edit", _("Zoom Focus Edit"), bind (mem_fun(*this, &Editor::zoom_focus_chosen), Editing::ZoomFocusEdit));
        ActionManager::session_sensitive_actions.push_back (act);
 
        Glib::RefPtr<ActionGroup> mouse_mode_actions = ActionGroup::create (X_("MouseMode"));
@@ -278,31 +278,36 @@ Editor::register_actions ()
        ActionManager::register_radio_action (mouse_mode_actions, mouse_mode_group, "set-mouse-mode-zoom", _("Zoom Tool"), bind (mem_fun(*this, &Editor::set_mouse_mode), Editing::MouseZoom, false));
        ActionManager::register_radio_action (mouse_mode_actions, mouse_mode_group, "set-mouse-mode-timefx", _("Timefx Tool"), bind (mem_fun(*this, &Editor::set_mouse_mode), Editing::MouseTimeFX, false));
 
+       ActionManager::register_action (editor_actions, X_("SnapTo"), _("Snap To"));
+       ActionManager::register_action (editor_actions, X_("SnapMode"), _("Snap Mode"));
+
+       RadioAction::Group snap_mode_group;
+       ActionManager::register_radio_action (editor_actions, snap_mode_group, X_("snap-normal"), _("Normal"), (bind (mem_fun(*this, &Editor::snap_mode_chosen), Editing::SnapNormal)));
+       ActionManager::register_radio_action (editor_actions, snap_mode_group, X_("snap-magnetic"), _("Magnetic"), (bind (mem_fun(*this, &Editor::snap_mode_chosen), Editing::SnapMagnetic)));
+
        Glib::RefPtr<ActionGroup> snap_actions = ActionGroup::create (X_("Snap"));
        RadioAction::Group snap_choice_group;
 
-       ActionManager::register_action (editor_actions, X_("SnapTo"), _("Snap To"));
-
-       ActionManager::register_radio_action (snap_actions, snap_choice_group, X_("snap-to-frame"), _("Snap to frame"), (bind (mem_fun(*this, &Editor::set_snap_to), Editing::SnapToFrame)));
-       ActionManager::register_radio_action (snap_actions, snap_choice_group, X_("snap-to-cd-frame"), _("Snap to cd frame"), (bind (mem_fun(*this, &Editor::set_snap_to), Editing::SnapToCDFrame)));
-       ActionManager::register_radio_action (snap_actions, snap_choice_group, X_("snap-to-smpte-frame"), _("Snap to SMPTE frame"), (bind (mem_fun(*this, &Editor::set_snap_to), Editing::SnapToSMPTEFrame)));
-       ActionManager::register_radio_action (snap_actions, snap_choice_group, X_("snap-to-smpte-seconds"), _("Snap to SMPTE seconds"), (bind (mem_fun(*this, &Editor::set_snap_to), Editing::SnapToSMPTESeconds)));
-       ActionManager::register_radio_action (snap_actions, snap_choice_group, X_("snap-to-smpte-minutes"), _("Snap to SMPTE minutes"), (bind (mem_fun(*this, &Editor::set_snap_to), Editing::SnapToSMPTEMinutes)));
-       ActionManager::register_radio_action (snap_actions, snap_choice_group, X_("snap-to-seconds"), _("Snap to seconds"), (bind (mem_fun(*this, &Editor::set_snap_to), Editing::SnapToSeconds)));
-       ActionManager::register_radio_action (snap_actions, snap_choice_group, X_("snap-to-minutes"), _("Snap to minutes"), (bind (mem_fun(*this, &Editor::set_snap_to), Editing::SnapToMinutes)));
-       ActionManager::register_radio_action (snap_actions, snap_choice_group, X_("snap-to-thirtyseconds"), _("Snap to thirtyseconds"), (bind (mem_fun(*this, &Editor::set_snap_to), Editing::SnapToAThirtysecondBeat)));
-       ActionManager::register_radio_action (snap_actions, snap_choice_group, X_("snap-to-asixteenthbeat"), _("Snap to asixteenthbeat"), (bind (mem_fun(*this, &Editor::set_snap_to), Editing::SnapToASixteenthBeat)));
-       ActionManager::register_radio_action (snap_actions, snap_choice_group, X_("snap-to-eighths"), _("Snap to eighths"), (bind (mem_fun(*this, &Editor::set_snap_to), Editing::SnapToAEighthBeat)));
-       ActionManager::register_radio_action (snap_actions, snap_choice_group, X_("snap-to-quarters"), _("Snap to quarters"), (bind (mem_fun(*this, &Editor::set_snap_to), Editing::SnapToAQuarterBeat)));
-       ActionManager::register_radio_action (snap_actions, snap_choice_group, X_("snap-to-thirds"), _("Snap to thirds"), (bind (mem_fun(*this, &Editor::set_snap_to), Editing::SnapToAThirdBeat)));
-       ActionManager::register_radio_action (snap_actions, snap_choice_group, X_("snap-to-beat"), _("Snap to beat"), (bind (mem_fun(*this, &Editor::set_snap_to), Editing::SnapToBeat)));
-       ActionManager::register_radio_action (snap_actions, snap_choice_group, X_("snap-to-bar"), _("Snap to bar"), (bind (mem_fun(*this, &Editor::set_snap_to), Editing::SnapToBar)));
-       ActionManager::register_radio_action (snap_actions, snap_choice_group, X_("snap-to-mark"), _("Snap to mark"), (bind (mem_fun(*this, &Editor::set_snap_to), Editing::SnapToMark)));
-       ActionManager::register_radio_action (snap_actions, snap_choice_group, X_("snap-to-edit-cursor"), _("Snap to edit cursor"), (bind (mem_fun(*this, &Editor::set_snap_to), Editing::SnapToEditCursor)));
-       ActionManager::register_radio_action (snap_actions, snap_choice_group, X_("snap-to-region-start"), _("Snap to region start"), (bind (mem_fun(*this, &Editor::set_snap_to), Editing::SnapToRegionStart)));
-       ActionManager::register_radio_action (snap_actions, snap_choice_group, X_("snap-to-region-end"), _("Snap to region end"), (bind (mem_fun(*this, &Editor::set_snap_to), Editing::SnapToRegionEnd)));
-       ActionManager::register_radio_action (snap_actions, snap_choice_group, X_("snap-to-region-sync"), _("Snap to region sync"), (bind (mem_fun(*this, &Editor::set_snap_to), Editing::SnapToRegionSync)));
-       ActionManager::register_radio_action (snap_actions, snap_choice_group, X_("snap-to-region-boundary"), _("Snap to region boundary"), (bind (mem_fun(*this, &Editor::set_snap_to), Editing::SnapToRegionBoundary)));
+       ActionManager::register_radio_action (snap_actions, snap_choice_group, X_("snap-to-frame"), _("Snap to frame"), (bind (mem_fun(*this, &Editor::snap_type_chosen), Editing::SnapToFrame)));
+       ActionManager::register_radio_action (snap_actions, snap_choice_group, X_("snap-to-cd-frame"), _("Snap to cd frame"), (bind (mem_fun(*this, &Editor::snap_type_chosen), Editing::SnapToCDFrame)));
+       ActionManager::register_radio_action (snap_actions, snap_choice_group, X_("snap-to-smpte-frame"), _("Snap to SMPTE frame"), (bind (mem_fun(*this, &Editor::snap_type_chosen), Editing::SnapToSMPTEFrame)));
+       ActionManager::register_radio_action (snap_actions, snap_choice_group, X_("snap-to-smpte-seconds"), _("Snap to SMPTE seconds"), (bind (mem_fun(*this, &Editor::snap_type_chosen), Editing::SnapToSMPTESeconds)));
+       ActionManager::register_radio_action (snap_actions, snap_choice_group, X_("snap-to-smpte-minutes"), _("Snap to SMPTE minutes"), (bind (mem_fun(*this, &Editor::snap_type_chosen), Editing::SnapToSMPTEMinutes)));
+       ActionManager::register_radio_action (snap_actions, snap_choice_group, X_("snap-to-seconds"), _("Snap to seconds"), (bind (mem_fun(*this, &Editor::snap_type_chosen), Editing::SnapToSeconds)));
+       ActionManager::register_radio_action (snap_actions, snap_choice_group, X_("snap-to-minutes"), _("Snap to minutes"), (bind (mem_fun(*this, &Editor::snap_type_chosen), Editing::SnapToMinutes)));
+       ActionManager::register_radio_action (snap_actions, snap_choice_group, X_("snap-to-thirtyseconds"), _("Snap to thirtyseconds"), (bind (mem_fun(*this, &Editor::snap_type_chosen), Editing::SnapToAThirtysecondBeat)));
+       ActionManager::register_radio_action (snap_actions, snap_choice_group, X_("snap-to-asixteenthbeat"), _("Snap to asixteenthbeat"), (bind (mem_fun(*this, &Editor::snap_type_chosen), Editing::SnapToASixteenthBeat)));
+       ActionManager::register_radio_action (snap_actions, snap_choice_group, X_("snap-to-eighths"), _("Snap to eighths"), (bind (mem_fun(*this, &Editor::snap_type_chosen), Editing::SnapToAEighthBeat)));
+       ActionManager::register_radio_action (snap_actions, snap_choice_group, X_("snap-to-quarters"), _("Snap to quarters"), (bind (mem_fun(*this, &Editor::snap_type_chosen), Editing::SnapToAQuarterBeat)));
+       ActionManager::register_radio_action (snap_actions, snap_choice_group, X_("snap-to-thirds"), _("Snap to thirds"), (bind (mem_fun(*this, &Editor::snap_type_chosen), Editing::SnapToAThirdBeat)));
+       ActionManager::register_radio_action (snap_actions, snap_choice_group, X_("snap-to-beat"), _("Snap to beat"), (bind (mem_fun(*this, &Editor::snap_type_chosen), Editing::SnapToBeat)));
+       ActionManager::register_radio_action (snap_actions, snap_choice_group, X_("snap-to-bar"), _("Snap to bar"), (bind (mem_fun(*this, &Editor::snap_type_chosen), Editing::SnapToBar)));
+       ActionManager::register_radio_action (snap_actions, snap_choice_group, X_("snap-to-mark"), _("Snap to mark"), (bind (mem_fun(*this, &Editor::snap_type_chosen), Editing::SnapToMark)));
+       ActionManager::register_radio_action (snap_actions, snap_choice_group, X_("snap-to-edit-cursor"), _("Snap to edit cursor"), (bind (mem_fun(*this, &Editor::snap_type_chosen), Editing::SnapToEditCursor)));
+       ActionManager::register_radio_action (snap_actions, snap_choice_group, X_("snap-to-region-start"), _("Snap to region start"), (bind (mem_fun(*this, &Editor::snap_type_chosen), Editing::SnapToRegionStart)));
+       ActionManager::register_radio_action (snap_actions, snap_choice_group, X_("snap-to-region-end"), _("Snap to region end"), (bind (mem_fun(*this, &Editor::snap_type_chosen), Editing::SnapToRegionEnd)));
+       ActionManager::register_radio_action (snap_actions, snap_choice_group, X_("snap-to-region-sync"), _("Snap to region sync"), (bind (mem_fun(*this, &Editor::snap_type_chosen), Editing::SnapToRegionSync)));
+       ActionManager::register_radio_action (snap_actions, snap_choice_group, X_("snap-to-region-boundary"), _("Snap to region boundary"), (bind (mem_fun(*this, &Editor::snap_type_chosen), Editing::SnapToRegionBoundary)));
 
        /* REGION LIST */
 
@@ -625,6 +630,206 @@ Editor::set_layer_model (LayerModel model)
        }
 }
 
+RefPtr<RadioAction>
+Editor::snap_type_action (SnapType type)
+{
+
+       const char* action = 0;
+       RefPtr<Action> act;
+       
+       switch (type) {
+       case Editing::SnapToFrame:
+               action = "snap-to-frame";
+               break;
+       case Editing::SnapToCDFrame:
+               action = "snap-to-cd-frame";
+               break;
+       case Editing::SnapToSMPTEFrame:
+               action = "snap-to-smpte-frame";
+               break;
+       case Editing::SnapToSMPTESeconds:
+               action = "snap-to-smpte-seconds";
+               break;
+       case Editing::SnapToSMPTEMinutes:
+               action = "snap-to-smpte-minutes";
+               break;
+       case Editing::SnapToSeconds:
+               action = "snap-to-seconds";
+               break;
+       case Editing::SnapToMinutes:
+               action = "snap-to-minutes";
+               break;
+       case Editing::SnapToAThirtysecondBeat:
+               action = "snap-to-thirtyseconds";
+               break;
+       case Editing::SnapToASixteenthBeat:
+               action = "snap-to-asixteenthbeat";
+               break;
+       case Editing::SnapToAEighthBeat:
+               action = "snap-to-eighths";
+               break;
+       case Editing::SnapToAQuarterBeat:
+               action = "snap-to-quarters";
+               break;
+       case Editing::SnapToAThirdBeat:
+               action = "snap-to-thirds";
+               break;
+       case Editing::SnapToBeat:
+               action = "snap-to-beat";
+               break;
+       case Editing::SnapToBar:
+               action = "snap-to-bar";
+               break;
+       case Editing::SnapToMark:
+               action = "snap-to-mark";
+               break;
+       case Editing::SnapToEditCursor:
+               action = "snap-to-edit-cursor";
+               break;
+       case Editing::SnapToRegionStart:
+               action = "snap-to-region-start";
+               break;
+       case Editing::SnapToRegionEnd:
+               action = "snap-to-region-end";
+               break;
+       case Editing::SnapToRegionSync:
+               action = "snap-to-region-sync";
+               break;
+       case Editing::SnapToRegionBoundary:
+               action = "snap-to-region-boundary";
+               break;
+       default:
+               fatal << string_compose (_("programming error: %1: %2"), "Editor: impossible snap-to type", (int) type) << endmsg;
+               /*NOTREACHED*/
+       }
+
+       act = ActionManager::get_action (X_("Snap"), action);
+
+       if (act) {
+               RefPtr<RadioAction> ract = RefPtr<RadioAction>::cast_dynamic(act);
+               return ract;
+
+       } else  {
+               error << string_compose (_("programming error: %1"), "Editor::snap_type_chosen could not find action to match type.") << endmsg;
+               return RefPtr<RadioAction>();
+       }
+}
+
+void
+Editor::snap_type_chosen (SnapType type)
+{
+       /* this is driven by a toggle on a radio group, and so is invoked twice,
+          once for the item that became inactive and once for the one that became
+          active.
+       */
+
+       RefPtr<RadioAction> ract = snap_type_action (type);
+
+       if (ract && ract->get_active()) {
+               set_snap_to (type);
+       }
+}
+
+RefPtr<RadioAction>
+Editor::snap_mode_action (SnapMode mode)
+{
+       const char* action = 0;
+       RefPtr<Action> act;
+       
+       switch (mode) {
+       case Editing::SnapNormal:
+               action = X_("snap-normal");
+               break;
+       case Editing::SnapMagnetic:
+               action = X_("snap-magnetic");
+               break;
+       default:
+               fatal << string_compose (_("programming error: %1: %2"), "Editor: impossible snap mode type", (int) mode) << endmsg;
+               /*NOTREACHED*/
+       }
+       
+       act = ActionManager::get_action (X_("Editor"), action);
+       
+       if (act) {
+               RefPtr<RadioAction> ract = RefPtr<RadioAction>::cast_dynamic(act);
+               return ract;
+               
+       } else  {
+               error << string_compose (_("programming error: %1: %2"), "Editor::snap_mode_chosen could not find action to match mode.", action) << endmsg;
+               return RefPtr<RadioAction> ();
+       }
+}
+
+void
+Editor::snap_mode_chosen (SnapMode mode)
+{
+       /* this is driven by a toggle on a radio group, and so is invoked twice,
+          once for the item that became inactive and once for the one that became
+          active.
+       */
+
+       RefPtr<RadioAction> ract = snap_mode_action (mode);
+
+       if (ract && ract->get_active()) {
+               set_snap_mode (mode);
+       }
+}
+
+
+RefPtr<RadioAction>
+Editor::zoom_focus_action (ZoomFocus focus)
+{
+       const char* action = 0;
+       RefPtr<Action> act;
+       
+       switch (focus) {
+       case ZoomFocusLeft:
+               action = X_("zoom-focus-left");
+               break;
+       case ZoomFocusRight:
+               action = X_("zoom-focus-right");
+               break;
+       case ZoomFocusCenter:
+               action = X_("zoom-focus-center");
+               break;
+       case ZoomFocusPlayhead:
+               action = X_("zoom-focus-playhead");
+               break;
+       case ZoomFocusEdit:
+               action = X_("zoom-focus-edit");
+               break;
+       default:
+               fatal << string_compose (_("programming error: %1: %2"), "Editor: impossible focus type", (int) focus) << endmsg;
+               /*NOTREACHED*/
+       }
+       
+       act = ActionManager::get_action (X_("Zoom"), action);
+       
+       if (act) {
+               RefPtr<RadioAction> ract = RefPtr<RadioAction>::cast_dynamic(act);
+               return ract;
+       } else {
+               error << string_compose (_("programming error: %1: %2"), "Editor::zoom_focus_action could not find action to match focus.", action) << endmsg;
+       }
+
+       return RefPtr<RadioAction> ();
+}
+
+void
+Editor::zoom_focus_chosen (ZoomFocus focus)
+{
+       /* this is driven by a toggle on a radio group, and so is invoked twice,
+          once for the item that became inactive and once for the one that became
+          active.
+       */
+
+       RefPtr<RadioAction> ract = zoom_focus_action (focus);
+
+       if (ract && ract->get_active()) {
+               set_zoom_focus (focus);
+       }
+}
+
 void
 Editor::smpte_fps_chosen (Session::SmpteFormat format)
 {
index eb232ff8022bdaa5ca5dbadfa4eaddaa34e7a43e..426ff57a2a42d15d6977631ff428500c4e4d00aa 100644 (file)
@@ -270,7 +270,11 @@ Editor::embed_sndfile (Glib::ustring path, bool split, bool multiple_files, bool
                idspec += string_compose(":%1", n);
                
                try {
-                       source = boost::dynamic_pointer_cast<AudioFileSource> (SourceFactory::createReadable (DataType::AUDIO, *session, idspec, (mode == ImportAsTrack ? AudioFileSource::Destructive : AudioFileSource::Flag (0))));
+                       source = boost::dynamic_pointer_cast<AudioFileSource> (SourceFactory::createReadable 
+                                                                              (DataType::AUDIO, *session, idspec, 
+                                                                               (mode == ImportAsTapeTrack ? 
+                                                                                AudioFileSource::Destructive : 
+                                                                                AudioFileSource::Flag (0))));
                        sources.push_back(source);
                } 
                
@@ -285,7 +289,11 @@ Editor::embed_sndfile (Glib::ustring path, bool split, bool multiple_files, bool
        if (sources.empty()) {
                goto out;
        }
-       
+
+       if (sources[0]->natural_position() != 0) {
+               pos = sources[0]->natural_position();
+       } 
+
        region_name = PBD::basename_nosuffix (path);
        region_name += "-0";
        
index 2d854a384b67afb18e3e90ecfaad8729100822b4..07fe56573d149a59d9ed3637bc4d659d06e0d05b 100644 (file)
@@ -275,9 +275,32 @@ Editor::initialize_canvas ()
 void
 Editor::track_canvas_allocate (Gtk::Allocation alloc)
 {
+       canvas_allocation = alloc;
 
-       canvas_width = alloc.get_width();
-       canvas_height = alloc.get_height();
+       if (!initial_ruler_update_required) {
+               if (!canvas_idle_queued) {
+                       /* call this first so that we do stuff before any pending redraw */
+                       Glib::signal_idle().connect (mem_fun (*this, &Editor::track_canvas_idle), false);
+                       canvas_idle_queued = true;
+               }
+               return;
+       } 
+
+       initial_ruler_update_required = false;
+       
+       track_canvas_idle ();
+}
+
+bool
+Editor::track_canvas_idle ()
+{
+
+       if (canvas_idle_queued) {
+               canvas_idle_queued = false;
+       }
+
+       canvas_width = canvas_allocation.get_width();
+       canvas_height = canvas_allocation.get_height();
 
        zoom_range_clock.set ((nframes_t) floor ((canvas_width * frames_per_unit)));
        edit_cursor->set_position (edit_cursor->current_frame);
@@ -319,18 +342,12 @@ Editor::track_canvas_allocate (Gtk::Allocation alloc)
                transport_punchout_line->property_y2() = canvas_height;
        }
                
-               if (is_visible() && initial_ruler_update_required) {
-         /*
-           this is really dumb, but signal_size_allocate() gets emitted intermittently 
-            depending on whether the canvas contents are visible or not. 
-            we only want to do this once 
-         */
-               update_fixed_rulers();
-               tempo_map_changed (Change (0));
-               initial_ruler_update_required = false;
-       } 
+       update_fixed_rulers();
+       tempo_map_changed (Change (0));
        
        Resized (); /* EMIT_SIGNAL */
+
+       return false;
 }
 
 void
index 46383149a3fc7363ef240b7ffcd611e7b6ef9e75..6da479bafef17cfba34a9766ed3404bba3d2167f 100644 (file)
@@ -925,7 +925,7 @@ Editor::update_loop_range_view (bool visibility)
 
        Location* tll;
 
-       if (Config->get_auto_loop() && ((tll = transport_loop_location()) != 0)) {
+       if (session->get_play_loop() && ((tll = transport_loop_location()) != 0)) {
 
                double x1 = frame_to_pixel (tll->start());
                double x2 = frame_to_pixel (tll->end());
index da09a956880c7a13095e51df9c137d8f02615c6c..8b100afae59988a6a6b3b2bf6ab29d84fadb4fd3 100644 (file)
@@ -49,15 +49,18 @@ Editor::cms_deleted ()
 void
 Editor::show_editor_mixer (bool yn)
 {
+       show_editor_mixer_when_tracks_arrive = false;
+
        if (yn) {
 
                if (current_mixer_strip == 0) {
 
                        if (selection->tracks.empty()) {
                                
-                               if (track_views.empty()) {
+                               if (track_views.empty()) {      
+                                       show_editor_mixer_when_tracks_arrive = true;
                                        return;
-                               }
+                               } 
                                
                                for (TrackViewList::iterator i = track_views.begin(); i != track_views.end(); ++i) {
                                        AudioTimeAxisView* atv;
index e3954f00dee99b5ca1a9d8fe329b0aea28ee0d79..76357070a747df08f66b63404f6329f0944322ab 100644 (file)
@@ -317,14 +317,14 @@ Editor::button_selection (ArdourCanvas::Item* item, GdkEvent* event, ItemType it
 
        switch (item_type) {
        case RegionItem:
-               c1 = set_selected_track_from_click (press, op, true, true);
+               c1 = set_selected_track_from_click (op, true);
                c2 = set_selected_regionview_from_click (press, op, true);
                commit = (c1 || c2);
                break;
                
        case RegionViewNameHighlight:
        case RegionViewName:
-               c1 = set_selected_track_from_click (press, op, true, true);
+               c1 = set_selected_track_from_click (op, true);
                c2 = set_selected_regionview_from_click (press, op, true);
                commit = (c1 || c2);
                break;
@@ -332,17 +332,17 @@ Editor::button_selection (ArdourCanvas::Item* item, GdkEvent* event, ItemType it
        case GainAutomationControlPointItem:
        case PanAutomationControlPointItem:
        case RedirectAutomationControlPointItem:
-               c1 = set_selected_track_from_click (press, op, true, true);
-               c2 = set_selected_control_point_from_click (press, op, false);
+               c1 = set_selected_track_from_click (op, true);
+               c2 = set_selected_control_point_from_click (op, false);
                commit = (c1 || c2);
                break;
                
        case StreamItem:
-               commit = set_selected_track_from_click (press, op, true, true);
+               commit = set_selected_track_from_click (op, true);
                break;
                    
        case AutomationTrackItem:
-               commit = set_selected_track_from_click (press, op, true, true);
+               commit = set_selected_track_from_click (op, true);
                break;
                
        default:
@@ -361,7 +361,7 @@ Editor::button_selection (ArdourCanvas::Item* item, GdkEvent* event, ItemType it
                case StreamItem:
                case RegionItem:
                case AutomationTrackItem:
-                       commit = set_selected_track_from_click (press, op, true, true);
+                       commit = set_selected_track_from_click (op, true);
                        break;
 
                default:
@@ -1819,12 +1819,13 @@ Editor::fade_in_drag_finished_callback (ArdourCanvas::Item* item, GdkEvent* even
        }
 
        begin_reversible_command (_("change fade in length"));
-        XMLNode &before = arv->audio_region()->get_state();
+       AutomationList& alist = arv->audio_region()->fade_in();
+        XMLNode &before = alist.get_state();
 
        arv->audio_region()->set_fade_in_length (fade_length);
 
-        XMLNode &after = arv->audio_region()->get_state();
-        session->add_command(new MementoCommand<ARDOUR::AudioRegion>(*arv->audio_region().get(), &before, &after));
+        XMLNode &after = alist.get_state();
+        session->add_command(new MementoCommand<AutomationList>(alist, &before, &after));
        commit_reversible_command ();
        fade_in_drag_motion_callback (item, event);
 }
@@ -1914,12 +1915,13 @@ Editor::fade_out_drag_finished_callback (ArdourCanvas::Item* item, GdkEvent* eve
        }
 
        begin_reversible_command (_("change fade out length"));
-        XMLNode &before = arv->region()->get_state();
+       AutomationList& alist = arv->audio_region()->fade_out();
+        XMLNode &before = alist.get_state();
 
        arv->audio_region()->set_fade_out_length (fade_length);
 
-        XMLNode &after = arv->region()->get_state();
-        session->add_command(new MementoCommand<ARDOUR::Region>(*arv->region().get(), &before, &after));
+        XMLNode &after = alist.get_state();
+        session->add_command(new MementoCommand<AutomationList>(alist, &before, &after));
        commit_reversible_command ();
 
        fade_out_drag_motion_callback (item, event);
index 7122d4663cb9610f3b5131640de8550bdc7ea712..93e90f4c2cf5beda99c91bb6aa603987e886512c 100644 (file)
@@ -162,9 +162,9 @@ Editor::remove_clicked_region ()
 void
 Editor::destroy_clicked_region ()
 {
-       int32_t selected = selection->regions.size();
+       uint32_t selected = selection->regions.size();
 
-       if (!session || clicked_regionview == 0 && selected == 0) {
+       if (!session || !selected) {
                return;
        }
 
@@ -191,7 +191,7 @@ Do you really want to destroy %1 ?"),
                return;
        }
 
-       if (selected > 0) {
+       if (selected) {
                list<boost::shared_ptr<Region> > r;
 
                for (RegionSelection::iterator i = selection->regions.begin(); i != selection->regions.end(); ++i) {
@@ -199,9 +199,6 @@ Do you really want to destroy %1 ?"),
                }
 
                session->destroy_regions (r);
-
-       } else if (clicked_regionview) {
-               session->destroy_region (clicked_regionview->region());
        } 
 }
 
@@ -1088,7 +1085,7 @@ Editor::temporal_zoom (gdouble fpu)
 
        case ZoomFocusEdit:
                /* try to keep the edit cursor in the center */
-               if (edit_cursor->current_frame > leftmost_frame + (new_page/2)) {
+               if (edit_cursor->current_frame > new_page/2) {
                        leftmost_after_zoom = edit_cursor->current_frame - (new_page/2);
                } else {
                        leftmost_after_zoom = 0;
@@ -1275,6 +1272,9 @@ Editor::select_all_in_track (Selection::Operation op)
        case Selection::Extend:
                /* not defined yet */
                break;
+       case Selection::Add:
+               selection->add (touched);
+               break;
        }
 }
 
@@ -1291,6 +1291,7 @@ Editor::select_all (Selection::Operation op)
        }
        begin_reversible_command (_("select all"));
        switch (op) {
+       case Selection::Add:
        case Selection::Toggle:
                selection->add (touched);
                break;
@@ -1348,6 +1349,7 @@ Editor::select_all_within (nframes_t start, nframes_t end, double top, double bo
 
        begin_reversible_command (_("select all within"));
        switch (op) {
+       case Selection::Add:
        case Selection::Toggle:
                cerr << "toggle\n";
                selection->add (touched);
@@ -1840,7 +1842,7 @@ Editor::toggle_playback (bool with_abort)
        
        if (session->transport_rolling()) {
                session->request_stop (with_abort);
-               if (Config->get_auto_loop()) {
+               if (session->get_play_loop()) {
                        session->request_play_loop (false);
                }
        } else {
@@ -1854,6 +1856,12 @@ Editor::play_from_start ()
        session->request_locate (session->current_start_frame(), true);
 }
 
+void
+Editor::play_from_edit_cursor ()
+{
+       session->request_locate (edit_cursor->current_frame, true);
+}
+
 void
 Editor::play_selection ()
 {
@@ -1922,28 +1930,6 @@ Editor::loop_location (Location& location)
        }
 }
 
-void 
-Editor::toggle_region_mute ()
-{
-       if (clicked_regionview) {
-               clicked_regionview->region()->set_muted (!clicked_regionview->region()->muted());
-       } else if (!selection->regions.empty()) {
-               bool yn = ! (*selection->regions.begin())->region()->muted();
-               selection->foreach_region (&Region::set_muted, yn);
-       }
-}
-
-void
-Editor::toggle_region_opaque ()
-{
-       if (clicked_regionview) {
-               clicked_regionview->region()->set_opaque (!clicked_regionview->region()->opaque());
-       } else if (!selection->regions.empty()) {
-               bool yn = ! (*selection->regions.begin())->region()->opaque();
-               selection->foreach_region (&Region::set_opaque, yn);
-       }
-}
-
 void
 Editor::raise_region ()
 {
@@ -3340,7 +3326,7 @@ Editor::normalize_region ()
                        continue;
                XMLNode &before = arv->region()->get_state();
                arv->audio_region()->normalize_to (0.0f);
-               // session->add_command (new MementoCommand<Region>(*(arv->region().get()), &before, &arv->region()->get_state()));
+               session->add_command (new MementoCommand<Region>(*(arv->region().get()), &before, &arv->region()->get_state()));
        }
 
        commit_reversible_command ();
@@ -3488,13 +3474,40 @@ Editor::brush (nframes_t pos)
        }
 }
 
+void
+Editor::reset_region_gain_envelopes ()
+{
+       if (!session || selection->regions.empty()) {
+               return;
+       }
+
+       session->begin_reversible_command (_("reset region gain"));
+
+       for (RegionSelection::iterator i = selection->regions.begin(); i != selection->regions.end(); ++i) {
+               AudioRegionView* const arv = dynamic_cast<AudioRegionView*>(*i);
+               if (arv) {
+                       AutomationList& alist (arv->audio_region()->envelope());
+                       XMLNode& before (alist.get_state());
+
+                       arv->audio_region()->set_default_envelope ();
+                       session->add_command (new MementoCommand<AutomationList>(arv->audio_region()->envelope(), &before, &alist.get_state()));
+               }
+       }
+
+       session->commit_reversible_command ();
+}
+
 void
 Editor::toggle_gain_envelope_visibility ()
 {
        for (RegionSelection::iterator i = selection->regions.begin(); i != selection->regions.end(); ++i) {
                AudioRegionView* const arv = dynamic_cast<AudioRegionView*>(*i);
-               if (arv)
-                       arv->set_envelope_visible (!arv->envelope_visible());
+               if (arv) {
+                       bool x = region_envelope_visible_item->get_active();
+                       if (x != arv->envelope_visible()) {
+                               arv->set_envelope_visible (x);
+                       }
+               }
        }
 }
 
@@ -3503,7 +3516,53 @@ Editor::toggle_gain_envelope_active ()
 {
        for (RegionSelection::iterator i = selection->regions.begin(); i != selection->regions.end(); ++i) {
                AudioRegionView* const arv = dynamic_cast<AudioRegionView*>(*i);
-               if (arv)
-                       arv->audio_region()->set_envelope_active (true);
+               if (arv) {
+                       bool x = region_envelope_active_item->get_active();
+                       if (x != arv->audio_region()->envelope_active()) {
+                               arv->audio_region()->set_envelope_active (x);
+                       }
+               }
+       }
+}
+
+void
+Editor::toggle_region_lock ()
+{
+       for (RegionSelection::iterator i = selection->regions.begin(); i != selection->regions.end(); ++i) {
+               AudioRegionView* const arv = dynamic_cast<AudioRegionView*>(*i);
+               if (arv) {
+                       bool x = region_lock_item->get_active();
+                       if (x != arv->audio_region()->locked()) {
+                               arv->audio_region()->set_locked (x);
+                       }
+               }
+       }
+}
+
+void
+Editor::toggle_region_mute ()
+{
+       for (RegionSelection::iterator i = selection->regions.begin(); i != selection->regions.end(); ++i) {
+               AudioRegionView* const arv = dynamic_cast<AudioRegionView*>(*i);
+               if (arv) {
+                       bool x = region_mute_item->get_active();
+                       if (x != arv->audio_region()->muted()) {
+                               arv->audio_region()->set_muted (x);
+                       }
+               }
+       }
+}
+
+void
+Editor::toggle_region_opaque ()
+{
+       for (RegionSelection::iterator i = selection->regions.begin(); i != selection->regions.end(); ++i) {
+               AudioRegionView* const arv = dynamic_cast<AudioRegionView*>(*i);
+               if (arv) {
+                       bool x = region_opaque_item->get_active();
+                       if (x != arv->audio_region()->opaque()) {
+                               arv->audio_region()->set_opaque (x);
+                       }
+               }
        }
 }
index 1e75437db26720e35ad8652e361e73362bc3bb20..b30a3092ecaf4451e4866fefdbfd332417bb3c86 100644 (file)
@@ -48,22 +48,27 @@ using namespace Glib;
 using namespace Editing;
 
 void
-Editor::handle_region_removed (boost::shared_ptr<Region> region)
+Editor::handle_region_removed (boost::weak_ptr<Region> wregion)
 {
-       ENSURE_GUI_THREAD (bind (mem_fun (*this, &Editor::handle_region_removed), region));
+       ENSURE_GUI_THREAD (bind (mem_fun (*this, &Editor::handle_region_removed), wregion));
        redisplay_regions ();
 }
 
 void
-Editor::handle_new_region (boost::shared_ptr<Region> region)
+Editor::handle_new_region (boost::weak_ptr<Region> wregion)
 {
-       ENSURE_GUI_THREAD (bind (mem_fun (*this, &Editor::handle_new_region), region));
+       ENSURE_GUI_THREAD (bind (mem_fun (*this, &Editor::handle_new_region), wregion));
 
        /* don't copy region - the one we are being notified
           about belongs to the session, and so it will
           never be edited.
        */
-       add_region_to_region_display (region);
+
+       boost::shared_ptr<Region> region (wregion.lock());
+       
+       if (region) {
+               add_region_to_region_display (region);
+       }
 }
 
 void
index 512e2ecef141f10b914d59de11bfc73f62197754..06bf7da625782f7abbe47a8d028497798c660478 100644 (file)
@@ -118,6 +118,10 @@ Editor::handle_new_route (Session::RouteList& routes)
                tv->GoingAway.connect (bind (mem_fun(*this, &Editor::remove_route), tv));
        }
 
+       if (show_editor_mixer_when_tracks_arrive) {
+               show_editor_mixer (true);
+       }
+
        editor_mixer_button.set_sensitive(true);
 }
 
index ecf7f0b2631dcfd20599cb69c4c1d26825418adb..9834ce16db401fad4d7cc330813954ec71d1fc5a 100644 (file)
@@ -138,6 +138,34 @@ Editor::ruler_button_press (GdkEventButton* ev)
                ruler_grabbed_widget = grab_widget;
        }
 
+       gint x,y;
+       Gdk::ModifierType state;
+
+       /* need to use the correct x,y, the event lies */
+       time_canvas_event_box.get_window()->get_pointer (x, y, state);
+
+       nframes_t where = leftmost_frame + pixel_to_frame (x);
+
+       switch (ev->button) {
+       case 1:
+               /* transport playhead */
+               snap_to (where);
+               session->request_locate (where);
+               break;
+
+       case 2:
+               /* edit cursor */
+               if (snap_type != Editing::SnapToEditCursor) {
+                       snap_to (where);
+               }
+               edit_cursor->set_position (where);
+               edit_cursor_clock.set (where);
+               break;
+
+       default:
+               break;
+       }
+
        return TRUE;
 }
 
@@ -150,7 +178,6 @@ Editor::ruler_button_release (GdkEventButton* ev)
        /* need to use the correct x,y, the event lies */
        time_canvas_event_box.get_window()->get_pointer (x, y, state);
 
-
        ruler_pressed_button = 0;
        
        if (session == 0) {
@@ -345,7 +372,7 @@ Editor::popup_ruler_menu (nframes_t where, ItemType t)
                mitem->set_active(true);
        }
 
-       ruler_items.push_back (CheckMenuElem (X_("SMPTE"), bind (mem_fun(*this, &Editor::ruler_toggled), (int)ruler_metric_smpte)));
+       ruler_items.push_back (CheckMenuElem (X_("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);
@@ -1043,13 +1070,12 @@ Editor::metric_get_bbt (GtkCustomRulerMark **marks, gdouble lower, gdouble upper
        uint32_t magic_accent_number = 1;
        gint nmarks;
         char buf[64];
-        gint n;
+        gint  n = 0;
        nframes_t pos;
        bool bar_helper_on = true;
        
        BBT_Time next_beat;
        nframes_t next_beat_pos;
-       nframes_t ilower = (nframes_t) floor (lower);
 
        if ((desirable_marks = maxchars / 7) == 0) {
                return 0;
@@ -1091,7 +1117,7 @@ Editor::metric_get_bbt (GtkCustomRulerMark **marks, gdouble lower, gdouble upper
        beats = current_bbt_points->size() - bars;
 
        /*Only show the bar helper if there aren't many bars on the screen */
-       if (bars > 2) {
+       if (bars > 1) {
                bar_helper_on = false;
        }
 
@@ -1108,11 +1134,12 @@ Editor::metric_get_bbt (GtkCustomRulerMark **marks, gdouble lower, gdouble upper
                double position_of_helper;
                bool i_am_accented = false;
                bool we_need_ticks = false;
+               bool helper_active = false;
        
-               position_of_helper = ilower + (30 * Editor::get_current_zoom ());
+               position_of_helper = lower + (30 * Editor::get_current_zoom ());
 
                if (desirable_marks >= (beats)) {
-                       nmarks = ((beats + 1) * bbt_beat_subdivision) + 1;
+                       nmarks = (beats * bbt_beat_subdivision) + 1;
                        we_need_ticks = true;
                } else {
                        nmarks = beats + 1;
@@ -1121,19 +1148,23 @@ Editor::metric_get_bbt (GtkCustomRulerMark **marks, gdouble lower, gdouble upper
                *marks = (GtkCustomRulerMark *) g_malloc (sizeof(GtkCustomRulerMark) * nmarks);
 
                (*marks)[0].label = g_strdup(" ");
-               (*marks)[0].position = ilower;
+               (*marks)[0].position = lower;
                (*marks)[0].style = GtkCustomRulerMarkMicro;
                
-               for (n = 1,   i = current_bbt_points->begin(); n < nmarks && i != current_bbt_points->end(); i++) {
+               for (n = 1,   i = current_bbt_points->begin(); n < nmarks && i != current_bbt_points->end(); ++i) {
 
-                       if ((*i).frame < ilower && (bar_helper_on)) {
+                       if ((*i).frame < lower && (bar_helper_on)) {
                                        snprintf (buf, sizeof(buf), "<%" PRIu32 "|%" PRIu32, (*i).bar, (*i).beat);
                                        (*marks)[0].label = g_strdup (buf); 
+                                       helper_active = true;
                        } else {
 
                          if ((*i).type == TempoMap::Bar)  {
-                           (((*i).frame < position_of_helper) && bar_helper_on) ?
-                             snprintf (buf, sizeof(buf), " ") : snprintf (buf, sizeof(buf), "%" PRIu32, (*i).bar);
+                           if (((*i).frame < position_of_helper) && helper_active) {
+                             snprintf (buf, sizeof(buf), " ");
+                           } else {
+                             snprintf (buf, sizeof(buf), "%" PRIu32, (*i).bar);
+                           }
                            (*marks)[n].label = g_strdup (buf);
                            (*marks)[n].position = (*i).frame;
                            (*marks)[n].style = GtkCustomRulerMarkMajor;
@@ -1157,7 +1188,7 @@ Editor::metric_get_bbt (GtkCustomRulerMark **marks, gdouble lower, gdouble upper
 
                        /* Add the tick marks */
 
-                       if (we_need_ticks && (*i).type != TempoMap::Bar) {
+                       if (we_need_ticks && (*i).type == TempoMap::Beat) {
 
                                /* Find the next beat */
 
@@ -1225,14 +1256,14 @@ Editor::metric_get_bbt (GtkCustomRulerMark **marks, gdouble lower, gdouble upper
 
                /* we're in bar land */
 
-               if (desirable_marks < (uint32_t) (bars / 256)) {
+               if (desirable_marks < (bars / 256)) {
                        nmarks = 1;
                        *marks = (GtkCustomRulerMark *) g_malloc (sizeof(GtkCustomRulerMark) * nmarks);
                        snprintf (buf, sizeof(buf), "too many bars... (currently %" PRIu32 ")", bars );
                        (*marks)[0].style = GtkCustomRulerMarkMajor;
                        (*marks)[0].label = g_strdup (buf);
-                       (*marks)[0].position = ilower;
-               } else if (desirable_marks < (uint32_t) (nmarks = (gint) (bars / 64))) {
+                       (*marks)[0].position = lower;
+               } else if (desirable_marks < (uint32_t)(nmarks = (gint) (bars / 64) + 1)) {
                        *marks = (GtkCustomRulerMark *) g_malloc (sizeof(GtkCustomRulerMark) * nmarks);
                        for (n = 0,   i = current_bbt_points->begin(); i != current_bbt_points->end() && n < nmarks; i++) {
                                if ((*i).type == TempoMap::Bar)  {
@@ -1254,7 +1285,7 @@ Editor::metric_get_bbt (GtkCustomRulerMark **marks, gdouble lower, gdouble upper
                                        }
                                }
                        }
-               } else if (desirable_marks < (uint32_t) (nmarks = (gint)(bars / 16))) {
+               } else if (desirable_marks < (uint32_t)(nmarks = (bars / 16) + 1)) {
                        *marks = (GtkCustomRulerMark *) g_malloc (sizeof(GtkCustomRulerMark) * nmarks);
                        for (n = 0,  i = current_bbt_points->begin(); i != current_bbt_points->end() && n < nmarks; i++) {
                                if ((*i).type == TempoMap::Bar)  {
@@ -1276,7 +1307,7 @@ Editor::metric_get_bbt (GtkCustomRulerMark **marks, gdouble lower, gdouble upper
                                        }
                                }
                        }
-               } else if (desirable_marks < (uint32_t) (nmarks = (gint)(bars / 4))){
+               } else if (desirable_marks < (uint32_t)(nmarks = (bars / 4) + 1)){
                        *marks = (GtkCustomRulerMark *) g_malloc (sizeof(GtkCustomRulerMark) * nmarks);
                        for (n = 0,   i = current_bbt_points->begin(); i != current_bbt_points->end() && n < nmarks; ++i) {
                                if ((*i).type == TempoMap::Bar)  {
@@ -1299,8 +1330,8 @@ Editor::metric_get_bbt (GtkCustomRulerMark **marks, gdouble lower, gdouble upper
                                }
                        }
                } else {
-                       nmarks = bars;
-                       *marks = (GtkCustomRulerMark *) g_malloc (sizeof(GtkCustomRulerMark) * nmarks);
+                       nmarks = bars + 1;
+                       *marks = (GtkCustomRulerMark *) g_malloc (sizeof(GtkCustomRulerMark) * nmarks );
                        for (n = 0,  i = current_bbt_points->begin(); i != current_bbt_points->end() && n < nmarks; i++) {
                                if ((*i).type == TempoMap::Bar)  {
                                        if ((*i).bar % 4 == 1) {
@@ -1320,7 +1351,7 @@ Editor::metric_get_bbt (GtkCustomRulerMark **marks, gdouble lower, gdouble upper
                                }
                        }
                }
-               return nmarks;
+               return n;
        }
 }
 
index c905e696cca1222157ac7c5a70046c8b56d2afd7..8aa978a79c65f83a7ef135b6689981573d587570 100644 (file)
@@ -96,6 +96,10 @@ Editor::draw_metric_marks (const Metrics& metrics)
 void
 Editor::tempo_map_changed (Change ignored)
 {
+       if (!session) {
+               return;
+       }
+
         ENSURE_GUI_THREAD(bind (mem_fun(*this, &Editor::tempo_map_changed), ignored));
 
        BBT_Time previous_beat, next_beat; // the beats previous to the leftmost frame and after the rightmost frame
@@ -112,13 +116,13 @@ Editor::tempo_map_changed (Change ignored)
        previous_beat.ticks = 0;
 
        if (session->tempo_map().meter_at(leftmost_frame + current_page_frames()).beats_per_bar () > next_beat.beats + 1) {
-         next_beat.beats += 1;
+               next_beat.beats += 1;
        } else {
-         next_beat.bars += 1;
-         next_beat.beats = 1;
+               next_beat.bars += 1;
+               next_beat.beats = 1;
        }
        next_beat.ticks = 0;
-
+       
        if (current_bbt_points) {
                delete current_bbt_points;
                current_bbt_points = 0;
@@ -227,9 +231,9 @@ Editor::draw_measures ()
                case TempoMap::Beat:
                        
                        if ((*i).beat == 1) {
-                               color = color_map[cMeasureLineBeat];
-                       } else {
                                color = color_map[cMeasureLineBar];
+                       } else {
+                               color = color_map[cMeasureLineBeat];
 
                                if (beat_density > 2.0) {
                                        /* only draw beat lines if the gaps between beats are large.
index e38f0ba946e59c408dcf08348c73235c67179e81..5a269ffbefe9c7ef1aa09ac600e628b2ff7c7a64 100644 (file)
@@ -212,28 +212,28 @@ ExportDialog::ExportDialog(PublicEditor& e)
           takes a reference. 
        */
 
-       vector<string> pop_strings = internationalize(sample_rates);
+       vector<string> pop_strings = I18N(sample_rates);
        Gtkmm2ext::set_popdown_strings (sample_rate_combo, pop_strings);
        sample_rate_combo.set_active_text (pop_strings.front());
-       pop_strings = internationalize(src_quality);
+       pop_strings = I18N(src_quality);
        Gtkmm2ext::set_popdown_strings (src_quality_combo, pop_strings);
        src_quality_combo.set_active_text (pop_strings.front());
-       pop_strings = internationalize(dither_types);
+       pop_strings = I18N(dither_types);
        Gtkmm2ext::set_popdown_strings (dither_type_combo, pop_strings);
        dither_type_combo.set_active_text (pop_strings.front());
-       pop_strings = internationalize(channel_strings);
+       pop_strings = I18N(channel_strings);
        Gtkmm2ext::set_popdown_strings (channel_count_combo, pop_strings);
        channel_count_combo.set_active_text (pop_strings.front());
-       pop_strings = internationalize((const char **) sndfile_header_formats_strings);
+       pop_strings = I18N((const char **) sndfile_header_formats_strings);
        Gtkmm2ext::set_popdown_strings (header_format_combo, pop_strings);
        header_format_combo.set_active_text (pop_strings.front());
-       pop_strings = internationalize((const char **) sndfile_bitdepth_formats_strings);
+       pop_strings = I18N((const char **) sndfile_bitdepth_formats_strings);
        Gtkmm2ext::set_popdown_strings (bitdepth_format_combo, pop_strings);
        bitdepth_format_combo.set_active_text (pop_strings.front());
-       pop_strings = internationalize((const char **) sndfile_endian_formats_strings);
+       pop_strings = I18N((const char **) sndfile_endian_formats_strings);
        Gtkmm2ext::set_popdown_strings (endian_format_combo, pop_strings);
        endian_format_combo.set_active_text (pop_strings.front());
-       pop_strings = internationalize(cue_file_types);
+       pop_strings = I18N(cue_file_types);
        Gtkmm2ext::set_popdown_strings (cue_file_combo, pop_strings);
        cue_file_combo.set_active_text (pop_strings.front());
 
index 3ed282761d2aa4e4652901240f5d98e440365917..30ff05dc5ccfc0897e4fd3364009aa6c2432e0b5 100644 (file)
@@ -31,7 +31,7 @@
 ExportRegionDialog::ExportRegionDialog (PublicEditor& editor, boost::shared_ptr<ARDOUR::Region> region) 
        : ExportDialog(editor)
 {
-       boost::shared_ptr<ARDOUR::AudioRegion> audio_region = boost::dynamic_pointer_cast<ARDOUR::AudioRegion>(region);
+       audio_region = boost::dynamic_pointer_cast<ARDOUR::AudioRegion>(region);
        assert(audio_region);
 
        do_not_allow_track_and_master_selection();
index 367dc54b7c11acb55234194dbd4140fdb64c6a23..5d2f383a806d733154030c844b1a09b961c8a796 100644 (file)
@@ -123,8 +123,9 @@ FFTGraph::setWindowSize_internal(int windowSize)
        }
        
        _logScale = (int *) malloc(sizeof(int) * _dataSize);
+       float count = 0;
        for (int i = 0; i < _dataSize; i++) {
-               _logScale[i] = (int)floor(log10( 1.0 + i * 9.0 / (double)_dataSize) * (double)scaleWidth);
+               _logScale[i] = 0;
        }
        _plan = fftwf_plan_r2r_1d(_windowSize, _in, _out, FFTW_R2HC, FFTW_ESTIMATE);
 }
@@ -241,8 +242,11 @@ FFTGraph::draw_scales(Glib::RefPtr<Gdk::Window> window)
                int rate_at_pos = (int)((double)(SR/2) * (double)logscale_pos / (double)_dataSize);
                
                char buf[32];
-               snprintf(buf,32,"%dhz",rate_at_pos);
-               
+               if (rate_at_pos < 1000)
+                       snprintf(buf,32,"%dHz",rate_at_pos);
+               else
+                       snprintf(buf,32,"%dk",(int)floor( (float)rate_at_pos/(float)1000) );
+
                std::string label = buf;
                
                layout->set_text(label);
@@ -371,12 +375,22 @@ FFTGraph::on_size_request(Gtk::Requisition* requisition)
        if (_logScale != 0) {
                free(_logScale);
        }
-
        _logScale = (int *) malloc(sizeof(int) * _dataSize);
-       //cerr << "LogScale: " << endl;
+
+       float SR = 44100;
+       float FFT_START = SR/(double)_dataSize;
+       float FFT_END = SR/2.0;
+       float FFT_RANGE = log( FFT_END / FFT_START);
+       float pixel = 0;
        for (int i = 0; i < _dataSize; i++) {
-               _logScale[i] = (int)floor(log10( 1.0 + i * 9.0 / (double)_dataSize) * (double)scaleWidth);
-               //cerr << i << ":\t" << _logScale[i] << endl;
+               float freq_at_bin = (SR/2.0) * ((double)i / (double)_dataSize);
+               float freq_at_pixel = FFT_START * exp( FFT_RANGE * pixel / (double)scaleWidth );
+               while (freq_at_bin > freq_at_pixel) {
+                       pixel++;
+                       freq_at_pixel = FFT_START * exp( FFT_RANGE * pixel / (double)scaleWidth );
+               }
+               _logScale[i] = floor(pixel);
+//printf("logscale at %d = %3.3f, freq_at_pixel %3.3f, freq_at_bin %3.3f, scaleWidth %d\n", i, pixel, freq_at_pixel, freq_at_bin, scaleWidth);
        }
 
        requisition->width  = width;;
index 7e4a1b1fbf169eccdeb9802f7b54d499dbdf07a0..c1261fdf236c44c6722b3898841f297445cf6f90 100644 (file)
@@ -63,12 +63,10 @@ GainAutomationTimeAxisView::add_automation_event (ArdourCanvas::Item* item, GdkE
        lines.front()->view_to_model_y (y);
 
        _session.begin_reversible_command (_("add gain automation event"));
-
-        XMLNode &before = curve.get_state();
+        XMLNode& before = curve.get_state();
        curve.add (when, y);
-        XMLNode &after = curve.get_state();
-        _session.add_command(new MementoCommand<ARDOUR::Curve>(curve, &before, &after));
-       _session.commit_reversible_command ();
+        XMLNode& after = curve.get_state();
+       _session.commit_reversible_command (new MementoCommand<ARDOUR::Curve>(curve, &before, &after));
        _session.set_dirty ();
 }
 
index 22381e353625174f66260dc1cb7bed3c2eb96320..1f53f9700474257ca371b55745d751161dc8ac1f 100644 (file)
@@ -2,6 +2,7 @@
 #define __ardour_gtk_gui_thread_h__
 
 #include <gtkmm2ext/gtk_ui.h>
+#include <pbd/crossthread.h>
 
 #define ENSURE_GUI_THREAD(slot) \
      if (!Gtkmm2ext::UI::instance()->caller_is_ui_thread()) {\
@@ -9,4 +10,8 @@
         return;\
      }
 
+#define GTK_SAFE(theSlot) crossthread_safe (Gtkmm2ext::UI::instance()->thread_id(),\
+                                           *Gtkmm2ext::UI::instance(), \
+                                           (theSlot))
+
 #endif /* __ardour_gtk_gui_thread_h__ */
index 71a3dccab8784cb936ffcde33663ef8c5346e204..5d68c79edd9bab1496341771b0670877efcb2735 100644 (file)
@@ -2,6 +2,7 @@
 #define __i18n_h__
 
 #include <pbd/compose.h>
+#include <pbd/convert.h>
 #include "gettext.h"
 
 #include <vector>
@@ -10,5 +11,6 @@
 #define _(Text)  dgettext (PACKAGE,Text)
 #define N_(Text) gettext_noop (Text)
 #define X_(Text) Text
+#define I18N(Array) PBD::internationalize (PACKAGE, Array)
 
 #endif // __i18n_h__
diff --git a/gtk2_ardour/icons/hide.png b/gtk2_ardour/icons/hide.png
new file mode 100644 (file)
index 0000000..2db8173
Binary files /dev/null and b/gtk2_ardour/icons/hide.png differ
diff --git a/gtk2_ardour/icons/record_normal_red.png b/gtk2_ardour/icons/record_normal_red.png
new file mode 100644 (file)
index 0000000..c4bbaff
Binary files /dev/null and b/gtk2_ardour/icons/record_normal_red.png differ
diff --git a/gtk2_ardour/icons/record_tape_red.png b/gtk2_ardour/icons/record_tape_red.png
new file mode 100644 (file)
index 0000000..f9e2313
Binary files /dev/null and b/gtk2_ardour/icons/record_tape_red.png differ
diff --git a/gtk2_ardour/icons/strip_width.png b/gtk2_ardour/icons/strip_width.png
new file mode 100644 (file)
index 0000000..99a0e72
Binary files /dev/null and b/gtk2_ardour/icons/strip_width.png differ
index 71e0a84bfd61c98586a51b06a26f66eb9f263a3c..366e2c2769d708cc5ee882caca156e4bfd5c2873 100644 (file)
@@ -258,6 +258,46 @@ IOSelector::~IOSelector ()
 {
 }
 
+void 
+IOSelector::set_button_sensitivity ()
+{
+       DataType t = io->default_type();
+
+       if (for_input) {
+
+               if (io->input_maximum().get(t) < 0 || io->input_maximum().get(t) > io->n_inputs().get(t)) {
+                       add_port_button.set_sensitive (true);
+               } else {
+                       add_port_button.set_sensitive (false);
+               }
+
+       } else {
+
+               if (io->output_maximum().get(t) < 0 || io->output_maximum().get(t) > io->n_outputs().get(t)) {
+                       add_port_button.set_sensitive (true);
+               } else {
+                       add_port_button.set_sensitive (false);
+               }
+                       
+       }
+
+       if (for_input) {
+               if (io->n_inputs().get(t) && (io->input_minimum().get(t) < 0 || io->input_minimum().get(t) < io->n_inputs().get(t))) {
+                       remove_port_button.set_sensitive (true);
+               } else {
+                       remove_port_button.set_sensitive (false);
+               }
+                       
+       } else {
+               if (io->n_outputs().get(t) && (io->output_minimum().get(t) < 0 || io->output_minimum().get(t) < io->n_outputs().get(t))) {
+                       remove_port_button.set_sensitive (true);
+               } else {
+                       remove_port_button.set_sensitive (false);
+               }
+       }
+}
+
+
 void
 IOSelector::name_changed (void* src)
 {
@@ -288,7 +328,10 @@ IOSelector::rescan ()
        gint current_page;
        vector<string> rowdata;
 
+       page_selection_connection.disconnect ();
+
        current_page = notebook.get_current_page ();
+
        pages.clear ();
 
        /* get relevant current JACK ports */
@@ -347,7 +390,6 @@ IOSelector::rescan ()
                        row[port_display_columns.full_name] = s->second;
                }
 
-               //display->get_selection()->signal_changed().connect (bind (mem_fun(*this, &IOSelector::port_selection_changed), display));
                display->signal_button_release_event().connect (bind (mem_fun(*this, &IOSelector::port_selection_changed), display));
                Label *tab_label = manage (new Label);
 
@@ -363,7 +405,7 @@ IOSelector::rescan ()
        }
 
        notebook.set_current_page (current_page);
-       //notebook.signal_show().connect (bind (mem_fun (notebook, &Notebook::set_current_page), current_page));
+       page_selection_connection = notebook.signal_show().connect (bind (mem_fun (notebook, &Notebook::set_current_page), current_page));
        selector_box.show_all ();
 }      
 
@@ -372,12 +414,11 @@ IOSelector::display_ports ()
 {
        TreeView *firsttview = 0;
        TreeView *selected_port_tview = 0;
-
        {
                Glib::Mutex::Lock lm  (port_display_lock);
                Port *port;
                uint32_t limit;
-
+               
                // The IO selector only works for single typed IOs
                const ARDOUR::DataType t = io->default_type();
 
@@ -386,22 +427,21 @@ IOSelector::display_ports ()
                } else {
                        limit = io->n_outputs().get(t);
                }
-
-               for (slist<TreeView *>::iterator i = port_displays.begin(); i != port_displays.end(); ) {
                
+               for (slist<TreeView *>::iterator i = port_displays.begin(); i != port_displays.end(); ) {
+                       
                        slist<TreeView *>::iterator tmp;
-
+                       
                        tmp = i;
                        ++tmp;
-
+                       
                        port_box.remove (**i);
                        delete *i;
                        port_displays.erase (i);
-
+                       
                        i = tmp;
                } 
-
-
+               
                for (uint32_t n = 0; n < limit; ++n) {
                        
                        TreeView* tview;
@@ -415,13 +455,13 @@ IOSelector::display_ports ()
                        }
                        
                        /* we know there is '/' because we put it there */
-
+                       
                        really_short_name = port->short_name();
                        really_short_name = really_short_name.substr (really_short_name.find ('/') + 1);
-
+                       
                        tview = manage (new TreeView());
                        RefPtr<ListStore> port_model = ListStore::create (port_display_columns);
-
+                       
                        if (!firsttview) {
                                firsttview = tview;
                        }
@@ -429,18 +469,18 @@ IOSelector::display_ports ()
                        tview->set_model (port_model);
                        tview->append_column (really_short_name, port_display_columns.displayed_name);
                        tview->get_selection()->set_mode (SELECTION_SINGLE);
-                       tview->set_data ("port", port);
+                       tview->set_data (X_("port"), port);
                        tview->set_headers_visible (true);
-                       tview->set_name ("IOSelectorPortList");
+                       tview->set_name (X_("IOSelectorPortList"));
                        
                        port_box.pack_start (*tview);
                        port_displays.insert (port_displays.end(), tview);
                        
                        /* now fill the clist with the current connections */
                        
-
+                       
                        const char **connections = port->get_connections ();
-
+                       
                        if (connections) {
                                for (uint32_t c = 0; connections[c]; ++c) {
                                        TreeModel::Row row = *(port_model->append());
@@ -459,9 +499,9 @@ IOSelector::display_ports ()
                                                selected_port_tview = tview;
                                        }
                                }
-                       
+                               
                        } else {
-
+                               
                                if (io->output_maximum().get(t) == 1) {
                                        selected_port = port;
                                        selected_port_tview = tview;
@@ -471,39 +511,27 @@ IOSelector::display_ports ()
                                        }
                                }
                        }
-
+                       
                        TreeViewColumn* col = tview->get_column (0);
                        
                        col->set_clickable (true);
-
-                       /* handle button events on the column header and within the treeview itself */
+                       
+                       /* handle button events on the column header ... */
                        col->signal_clicked().connect (bind (mem_fun(*this, &IOSelector::select_treeview), tview));
+
+                       /* ... and within the treeview itself */
                        tview->signal_button_release_event().connect (bind (mem_fun(*this, &IOSelector::connection_button_release), tview));
                }
-
+               
                port_box.show_all ();
-
-               if (selected_port_tview) {
-                       // GTK2FIX
-                       // selected_port_tview->click_column(0);
-                       selected_port_tview->set_name ("IOSelectorPortListSelected");
-                       for (slist<TreeView *>::iterator i = port_displays.begin(); i != port_displays.end(); ++i) {
-                               if (*i != selected_port_tview) {
-                                       (*i)->set_name ("IOSelectorPortList");
-                                       (*i)->queue_draw ();
-                               }
-                       }
-               } else {
-                       selected_port = 0;
-                       selector_box.hide_all ();
-               }
        }
        
+       if (!selected_port_tview) {
+               selected_port_tview = firsttview;
+       }
+
        if (selected_port_tview) {
                select_treeview (selected_port_tview);
-       } else if (firsttview) {
-               // select first
-               select_treeview (firsttview);
        }
 }
 
@@ -569,14 +597,6 @@ IOSelector::add_port ()
                        msg.run ();
                }
 
-               if (io->input_maximum().get(t) >= 0 && io->input_maximum().get(t) <= (size_t) io->n_inputs().get(t)) {
-                       add_port_button.set_sensitive (false);
-               }
-               
-               if (io->input_minimum().get(t) < (size_t) io->n_inputs().get(t)) {
-                       remove_port_button.set_sensitive (true);
-               }
-
        } else {
 
                try {
@@ -587,11 +607,9 @@ IOSelector::add_port ()
                        MessageDialog msg (0, _("There are no more JACK ports available."));
                        msg.run ();
                }
-
-               if (io->output_maximum().get(t) >= 0 && io->output_maximum().get(t) <= (size_t) io->n_outputs().get(t)) {
-                       add_port_button.set_sensitive (false);
-               }
        }
+               
+       set_button_sensitivity ();
 }
 
 void
@@ -608,26 +626,13 @@ IOSelector::remove_port ()
                if ((nports = io->n_inputs().get(t)) > 0) {
                        io->remove_input_port (io->input(nports-1), this);
                }
-               if (io->input_minimum().get(t) == (size_t) io->n_inputs().get(t)) {
-                       remove_port_button.set_sensitive (false);
-               }
        } else {
                if ((nports = io->n_outputs().get(t)) > 0) {
                        io->remove_output_port (io->output(nports-1), this);
                }
        }
-}
-
-gint
-IOSelector::remove_port_when_idle (Port *port)
-{
-       if (for_input) {
-               io->remove_input_port (port, this);
-       } else {
-               io->remove_output_port (port, this);
-       }
-
-       return FALSE;
+       
+       set_button_sensitivity ();
 }
 
 gint
@@ -649,20 +654,15 @@ IOSelector::connection_button_release (GdkEventButton *ev, TreeView *treeview)
                return false;
        }
        
-       if (!(Keyboard::is_delete_event (ev))) {
-               //return false;
-       }
-
        if (!treeview->get_path_at_pos ((int)ev->x, (int)ev->y, path, column, cellx, celly)) {
                return false;
        }
-       cerr << "path = " << path.to_string() << endl;
-       
+
        if ((iter = treeview->get_model()->get_iter (path.to_string()))) {
 
                /* path is valid */
                ustring connected_port_name = (*iter)[port_display_columns.full_name];
-               Port *port = reinterpret_cast<Port *> (treeview->get_data (_("port")));
+               Port *port = reinterpret_cast<Port *> (treeview->get_data (X_("port")));
                
                if (for_input) {
                        Port *p = session.engine().get_port_by_name (connected_port_name);
@@ -678,46 +678,15 @@ IOSelector::connection_button_release (GdkEventButton *ev, TreeView *treeview)
        return true;
 }
 
-gint
-IOSelector::port_column_button_release (GdkEventButton* event, TreeView* treeview)
-{
-       /* this handles button release on the button at the top of a single-column
-          treeview (representing a port)
-       */
-       cerr << "IOSelector::port_column_button_release() called" << endl;
-       
-       if (Keyboard::is_delete_event (event)) {
-               Port* port;
-               {
-                       Glib::Mutex::Lock lm  (port_display_lock);
-                       
-                       port = static_cast<Port *> (treeview->get_data (_("port")));
-                       
-                       if (port == selected_port) {
-                               selected_port = 0;
-                               treeview->set_name ("IOSelectorPortList");
-                               treeview->queue_draw();
-                       }
-               }
-
-               /* remove the port when idle - if we do it here, we will destroy the widget
-                  for whom we are handling an event. not good.
-               */
-
-               signal_idle().connect (bind (mem_fun(*this, &IOSelector::remove_port_when_idle), port));
-
-       } else {
-               select_treeview (treeview);
-       }
-
-       return TRUE;
-}
-
 void
 IOSelector::select_next_treeview ()
 {
        slist<TreeView*>::iterator next;
 
+       if (port_displays.empty() || port_displays.size() == 1) {
+               return;
+       }
+
        for (slist<TreeView *>::iterator i = port_displays.begin(); i != port_displays.end(); ++i) {
 
                if ((*i)->get_name() == "IOSelectorPortListSelected") {
@@ -744,21 +713,41 @@ IOSelector::select_treeview (TreeView* tview)
        */
 
        Glib::Mutex::Lock lm  (port_display_lock);
-       Port* port = reinterpret_cast<Port *> (tview->get_data (_("port")));
+       Port* port = reinterpret_cast<Port *> (tview->get_data (X_("port")));
+
+       selected_port = port;
+
+       tview->set_name ("IOSelectorPortListSelected");
+       tview->queue_draw ();
+
+       /* ugly hack to force the column header button to change as well */
+
+       TreeViewColumn* col = tview->get_column (0);
+       GtkTreeViewColumn* ccol = col->gobj();
        
-       if (port != selected_port) {
-               selected_port = port;
+       if (ccol->button) {
+               gtk_widget_set_name (ccol->button, "IOSelectorPortListSelected");       
+               gtk_widget_queue_draw (ccol->button);
+       }
+
+       for (slist<TreeView*>::iterator i = port_displays.begin(); i != port_displays.end(); ++i) {
+               if (*i == tview) {
+                       continue;
+               }
                
-               tview->set_name ("IOSelectorPortListSelected");
+               col = (*i)->get_column (0);
+               ccol = col->gobj();
                
-               for (slist<TreeView*>::iterator i = port_displays.begin(); i != port_displays.end(); ++i) {
-                       if (*i != tview) {
-                               (*i)->set_name ("IOSelectorPortList");
-                               (*i)->queue_draw ();
-                       }
+               if (ccol->button) {
+                       gtk_widget_set_name (ccol->button, "IOSelectorPortList");
+                       gtk_widget_queue_draw (ccol->button);
                }
-               selector_box.show_all ();
+               
+               (*i)->set_name ("IOSelectorPortList");
+               (*i)->queue_draw ();
        }
+
+       selector_box.show_all ();
 }
 
 void
index b0175644a4114426f6c11692ee98868feee47806..288edd0be552f0d9d5f1aacff5202ebd8d32ab0f 100644 (file)
@@ -72,6 +72,7 @@ class IOSelector : public Gtk::VBox {
        boost::shared_ptr<ARDOUR::IO> io;
        bool for_input;
        ARDOUR::Port *selected_port;
+       sigc::connection page_selection_connection;
 
        Gtk::VBox main_box;
        Gtk::HBox port_and_selector_box;
@@ -123,9 +124,8 @@ class IOSelector : public Gtk::VBox {
 
        void add_port ();
        void remove_port ();
-       gint remove_port_when_idle (ARDOUR::Port *);
+       void set_button_sensitivity ();
 
-       gint port_column_button_release (GdkEventButton *, Gtk::TreeView*);
        gint connection_button_release (GdkEventButton *, Gtk::TreeView*);
        
        void select_treeview(Gtk::TreeView*);
index 17390b8b4db79020fb24d82c5e855a55eaa95d4d..a6a14ad55b23c80494781eacbfea6841333ee275 100644 (file)
@@ -796,6 +796,8 @@ Keyboard::modifier_state_equals (guint state, ModifierMask mask)
 Selection::Operation
 Keyboard::selection_type (guint state)
 {
+       /* note that there is no modifier for "Add" */
+
        if (modifier_state_equals (state, Shift)) {
                return Selection::Extend;
        } else if (modifier_state_equals (state, Control)) {
index 96ce92d42ddc9d51daf38d3374be6747ac706afd..13dd95b47d4a74c4195383a1db00577c7fb70090 100644 (file)
@@ -250,7 +250,7 @@ LocationEditRow::set_location (Location *loc)
                   the row spacing, so make it insensitive (paul).
                */
 
-               if (location->is_end()) {
+               if (location->is_end() || location->is_start()) {
                        remove_button.set_sensitive (false);
                }
 
index 25b6b321668bf70b60f2e43e7be9fa15b700a4fd..a1d85cdb6976ed136c6126f82ba5c35d4d759f25 100644 (file)
@@ -44,6 +44,7 @@
 #include <gtkmm2ext/popup.h>
 #include <gtkmm2ext/utils.h>
 
+#include "svn_revision.h"
 #include "version.h"
 #include "ardour_ui.h"
 #include "opts.h"
@@ -259,7 +260,6 @@ show_ui_callback (void *arg)
        ARDOUR_UI * ui = (ARDOUR_UI *) arg;
 
        ui->hide_splash();
-       ui->show ();
        
        return FALSE;
 }
@@ -286,7 +286,7 @@ Please consider the possibilities, and perhaps (re)start JACK."));
        win.set_position (Gtk::WIN_POS_CENTER);
 
        if (!no_splash) {
-         ui->hide_splash ();
+               ui->hide_splash ();
        }
 
        /* we just don't care about the result, but we want to block */
@@ -329,10 +329,12 @@ To create it from the command line, start ardour as \"ardour --new %1"), path) <
                ui->load_session (path, name);
 
        } else {
-         /*  TODO: This bit of code doesn't work properly yet
-               Glib::signal_idle().connect (bind (mem_fun (*ui, &ARDOUR_UI::cmdline_new_session), path));
-               ui->set_will_create_new_session_automatically (true); */
 
+               /*  TODO: This bit of code doesn't work properly yet
+                   Glib::signal_idle().connect (bind (mem_fun (*ui, &ARDOUR_UI::cmdline_new_session), path));
+                   ui->set_will_create_new_session_automatically (true); 
+               */
+               
                /* Show the NSD */
                ui->hide_splash ();
                if (!Config->get_no_new_session_dialog()) {
@@ -383,7 +385,7 @@ int main (int argc, char *argv[])
        cout << _("Ardour/GTK ") 
             << VERSIONSTRING
             << _("\n   (built using ")
-            << ARDOUR::get_ardour_revision ()
+            << ardour_svn_revision
 #ifdef __GNUC__
             << _(" and GCC version ") << __VERSION__ 
 #endif
index 55d5742e8ee3135204fbd6937027ff49567c7335..b6e87f871564a3cf8c0288b33ecc40e56e2a7fbf 100644 (file)
@@ -57,7 +57,7 @@ MarkerTimeAxisView::MarkerTimeAxisView(MarkerTimeAxis& tv)
        canvas_rect =  new ArdourCanvas::SimpleRect (*canvas_group);
        canvas_rect->property_x1() = 0.0;
        canvas_rect->property_y1() = 0.0;
-       canvas_rect->property_x2() = 1000000.0;
+       canvas_rect->property_x2() = max_frames;
        canvas_rect->property_y2() = (double)20;
        canvas_rect->property_outline_color_rgba() = color_map[cMarkerTrackOutline];
        canvas_rect->property_fill_color_rgba() = stream_base_color;
index 35ca99bee1079839b9a719c270b0407a6e18e5b1..289fb4553678e30f51a5575674111a6e7862a83c 100644 (file)
@@ -62,6 +62,8 @@ using namespace PBD;
 using namespace Gtk;
 using namespace Gtkmm2ext;
 
+int MixerStrip::scrollbar_height = 0;
+
 #ifdef VARISPEED_IN_MIXER_STRIP
 static void 
 speed_printer (char buf[32], Gtk::Adjustment& adj, void* arg)
@@ -108,8 +110,8 @@ MixerStrip::MixerStrip (Mixer_UI& mx, Session& sess, boost::shared_ptr<Route> rt
        comment_window = 0;
        comment_area = 0;
 
-       width_button.add (*(manage (new Gtk::Image (get_xpm("lr.xpm")))));
-       hide_button.add (*(manage (new Gtk::Image (get_xpm("small_x.xpm")))));
+       width_button.add (*(manage (new Gtk::Image (::get_icon("strip_width")))));
+       hide_button.add (*(manage (new Gtk::Image (::get_icon("hide")))));
 
        input_label.set_text (_("Input"));
        input_button.add (input_label);
@@ -122,34 +124,31 @@ MixerStrip::MixerStrip (Mixer_UI& mx, Session& sess, boost::shared_ptr<Route> rt
        output_label.set_name ("MixerIOButtonLabel");
 
        _route->meter_change.connect (mem_fun(*this, &MixerStrip::meter_changed));
-               meter_point_button.add (meter_point_label);
-               meter_point_button.set_name ("MixerStripMeterPreButton");
-               meter_point_label.set_name ("MixerStripMeterPreButton");
-               
-               switch (_route->meter_point()) {
-               case MeterInput:
-                       meter_point_label.set_text (_("input"));
-                       break;
-                       
-               case MeterPreFader:
-                       meter_point_label.set_text (_("pre"));
-                       break;
-                       
-               case MeterPostFader:
-                       meter_point_label.set_text (_("post"));
-                       break;
-               }
+       meter_point_button.add (meter_point_label);
+       meter_point_button.set_name ("MixerStripMeterPreButton");
+       meter_point_label.set_name ("MixerStripMeterPreButton");
+       
+       switch (_route->meter_point()) {
+       case MeterInput:
+               meter_point_label.set_text (_("input"));
+               break;
                
-               /* TRANSLATORS: this string should be longest of the strings
-                  used to describe meter points. In english, its "input".
-               */
+       case MeterPreFader:
+               meter_point_label.set_text (_("pre"));
+               break;
                
-               set_size_request_to_display_given_text (meter_point_button, _("tupni"), 5, 5);
-
-
-               bottom_button_table.attach (meter_point_button, 1, 2, 0, 1);
-
-
+       case MeterPostFader:
+               meter_point_label.set_text (_("post"));
+               break;
+       }
+       
+       /* TRANSLATORS: this string should be longest of the strings
+          used to describe meter points. In english, it's "input".
+       */
+       set_size_request_to_display_given_text (meter_point_button, _("tupni"), 5, 5);
+    
+       bottom_button_table.attach (meter_point_button, 1, 2, 0, 1);
+    
        meter_point_button.signal_button_press_event().connect (mem_fun (gpm, &GainMeter::meter_press), false);
        /* XXX what is this meant to do? */
        //meter_point_button.signal_button_release_event().connect (mem_fun (gpm, &GainMeter::meter_release), false);
@@ -261,6 +260,20 @@ MixerStrip::MixerStrip (Mixer_UI& mx, Session& sess, boost::shared_ptr<Route> rt
        global_vpacker.pack_start (output_button, Gtk::PACK_SHRINK);
        global_vpacker.pack_start (comment_button, Gtk::PACK_SHRINK);
 
+       if (route()->master() || route()->control()) {
+               
+               if (scrollbar_height == 0) {
+                       HScrollbar scrollbar;
+                       Gtk::Requisition requisition;
+                       scrollbar.size_request (requisition);
+                       scrollbar_height = requisition.height;
+               }
+
+               EventBox* spacer = manage (new EventBox);
+               spacer->set_size_request (-1, scrollbar_height);
+               global_vpacker.pack_start (*spacer, false, false);
+       }
+
        global_frame.add (global_vpacker);
        global_frame.set_shadow_type (Gtk::SHADOW_IN);
        global_frame.set_name ("BaseFrame");
@@ -416,8 +429,10 @@ MixerStrip::set_width (Width w)
                solo_button->set_label (_("solo"));
 
                if (_route->comment() == "") {
+                      comment_button.unset_bg (STATE_NORMAL);
                       comment_button.set_label (_("comments"));
                } else {
+                      comment_button.modify_bg (STATE_NORMAL, color());
                       comment_button.set_label (_("*comments*"));
                }
 
@@ -439,8 +454,10 @@ MixerStrip::set_width (Width w)
                solo_button->set_label (_("S"));
 
                if (_route->comment() == "") {
+                      comment_button.unset_bg (STATE_NORMAL);
                       comment_button.set_label (_("Cmt"));
                } else {
+                      comment_button.modify_bg (STATE_NORMAL, color());
                       comment_button.set_label (_("*Cmt*"));
                }
 
@@ -497,7 +514,7 @@ MixerStrip::output_press (GdkEventButton *ev)
                citems.push_back (SeparatorElem());
                
                _session.foreach_connection (this, &MixerStrip::add_connection_to_output_menu);
-               
+
                output_menu.popup (1, ev->time);
                break;
                
@@ -553,13 +570,13 @@ MixerStrip::input_press (GdkEventButton *ev)
        switch (ev->button) {
 
        case 1:
-
                citems.push_back (MenuElem (_("Edit"), mem_fun(*this, &MixerStrip::edit_input_configuration)));
                citems.push_back (SeparatorElem());
                citems.push_back (MenuElem (_("Disconnect"), mem_fun (*(static_cast<RouteUI*>(this)), &RouteUI::disconnect_input)));
                citems.push_back (SeparatorElem());
                
                _session.foreach_connection (this, &MixerStrip::add_connection_to_input_menu);
+
                input_menu.popup (1, ev->time);
                break;
                
@@ -757,6 +774,42 @@ MixerStrip::output_changed (IOChange change, void *src)
        Gtkmm2ext::UI::instance()->call_slot (mem_fun(*this, &MixerStrip::update_output_display));
 }
 
+
+void 
+MixerStrip::comment_editor_done_editing() {
+       string str =  comment_area->get_buffer()->get_text();
+       if (_route->comment() != str) {
+               _route->set_comment (str, this);
+
+               switch (_width) {
+                  
+               case Wide:
+                       if (! str.empty()) {
+                               comment_button.modify_bg (STATE_NORMAL, color());
+                               comment_button.set_label (_("*Comments*"));
+                       } else {
+                               comment_button.unset_bg (STATE_NORMAL);
+                               comment_button.set_label (_("Comments"));
+                       }
+                       break;
+                  
+               case Narrow:
+                       if (! str.empty()) {
+                               comment_button.modify_bg (STATE_NORMAL, color());
+                               comment_button.set_label (_("*Cmt*"));
+                       } else {
+                               comment_button.unset_bg (STATE_NORMAL);
+                               comment_button.set_label (_("Cmt"));
+                       } 
+                       break;
+               }
+                
+               ARDOUR_UI::instance()->tooltips().set_tip (comment_button, 
+                               str.empty() ? _("Click to Add/Edit Comments") : str);
+       }
+
+}
+
 void
 MixerStrip::comment_button_clicked ()
 {
@@ -764,38 +817,13 @@ MixerStrip::comment_button_clicked ()
                setup_comment_editor ();
        }
 
-        int x, y, cw_width, cw_height;
+    int x, y, cw_width, cw_height;
 
        if (comment_window->is_visible()) {
-              string str =  comment_area->get_buffer()->get_text();
-              if (_route->comment() != str) {
-                _route->set_comment (str, this);
+               comment_window->hide ();
+               return;
+       }
 
-                switch (_width) {
-                  
-                case Wide:
-                  if (! str.empty()) {
-                    comment_button.set_label (_("*Comments*"));
-                  } else {
-                    comment_button.set_label (_("Comments"));
-                     }
-                  break;
-                  
-                case Narrow:
-                  if (! str.empty()) {
-                    comment_button.set_label (_("*Cmt*"));
-                  } else {
-                    comment_button.set_label (_("Cmt"));
-                  } 
-                  break;
-                }
-                
-                ARDOUR_UI::instance()->tooltips().set_tip (comment_button, 
-                                                           str.empty() ? _("Click to Add/Edit Comments") : str);
-              }
-              comment_window->hide ();
-              return;
-       } 
        comment_window->get_size (cw_width, cw_height);
        comment_window->get_position(x, y);
        comment_window->move(x, y - (cw_height / 2) - 45);
@@ -806,7 +834,6 @@ MixerStrip::comment_button_clicked ()
 
        comment_window->show();
        comment_window->present();
-
 }
 
 void
@@ -819,6 +846,7 @@ MixerStrip::setup_comment_editor ()
        comment_window = new ArdourDialog (title, false);
        comment_window->set_position (Gtk::WIN_POS_MOUSE);
        comment_window->set_skip_taskbar_hint (true);
+       comment_window->signal_hide().connect (mem_fun(*this, &MixerStrip::comment_editor_done_editing));
 
        comment_area = manage (new TextView());
        comment_area->set_name ("MixerTrackCommentArea");
@@ -1075,11 +1103,17 @@ MixerStrip::width_clicked ()
 void
 MixerStrip::hide_clicked ()
 {
+    // LAME fix to reset the button status for when it is redisplayed (part 1)
+    hide_button.set_sensitive(false);
+    
        if (_embedded) {
                 Hiding(); /* EMIT_SIGNAL */
        } else {
                _mixer.hide_strip (this);
        }
+       
+    // (part 2)
+       hide_button.set_sensitive(true);
 }
 
 void
@@ -1165,21 +1199,11 @@ MixerStrip::mix_group() const
 void
 MixerStrip::engine_stopped ()
 {
-        input_button.set_sensitive (false);
-       if (rec_enable_button) {
-               rec_enable_button->set_sensitive (false);
-       }
-       output_button.set_sensitive (false);
 }
 
 void
 MixerStrip::engine_running ()
 {
-        input_button.set_sensitive (true);
-       if (rec_enable_button) {
-               rec_enable_button->set_sensitive (true);
-       }
-       output_button.set_sensitive (true);
 }
 
 void
index 21db0d14ca83b4a17dd6b8234b5046e2c674bb80..92da4c13fe74aa39054e4c0d7ea0bc91ab1865fd 100644 (file)
@@ -153,6 +153,7 @@ class MixerStrip : public RouteUI, public Gtk::EventBox
        Gtk::TextView* comment_area;
        Gtk::Button    comment_button;
 
+       void comment_editor_done_editing();
        void setup_comment_editor ();
        void comment_button_clicked ();
 
@@ -245,6 +246,7 @@ class MixerStrip : public RouteUI, public Gtk::EventBox
        void engine_running();
        void engine_stopped();
 
+       static int scrollbar_height;
 };
 
 #endif /* __ardour_mixer_strip__ */
index 1ba1be445e094d2a77416edefdd88b167f188bb1..d8e5fc6988857999661458601d282ee2e1ba48bc 100644 (file)
@@ -76,7 +76,7 @@ Mixer_UI::Mixer_UI (AudioEngine& eng)
        strip_packer.pack_end (scroller_base, true, true);
 
        scroller.add (strip_packer);
-       scroller.set_policy (Gtk::POLICY_AUTOMATIC, Gtk::POLICY_AUTOMATIC);
+       scroller.set_policy (Gtk::POLICY_ALWAYS, Gtk::POLICY_AUTOMATIC);
 
        track_model = ListStore::create (track_columns);
        track_display.set_model (track_model);
@@ -185,7 +185,7 @@ Mixer_UI::Mixer_UI (AudioEngine& eng)
        list_vpacker.pack_start (rhs_pane1, true, true);
 
        global_hpacker.pack_start (scroller, true, true);
-       global_hpacker.pack_start (out_packer, false, false);
+       global_hpacker.pack_start (out_packer, false, false, 12);
 
        list_hpane.add1(list_vpacker);
        list_hpane.add2(global_hpacker);
@@ -393,11 +393,11 @@ Mixer_UI::disconnect_from_session ()
 void
 Mixer_UI::show_strip (MixerStrip* ms)
 {
-        TreeModel::Children rows = track_model->children();
+       TreeModel::Children rows = track_model->children();
        TreeModel::Children::iterator i;
-
+       
        for (i = rows.begin(); i != rows.end(); ++i) {
-
+       
                MixerStrip* strip = (*i)[track_columns.strip];
                if (strip == ms) {
                        (*i)[track_columns.visible] = true;
@@ -409,7 +409,7 @@ Mixer_UI::show_strip (MixerStrip* ms)
 void
 Mixer_UI::hide_strip (MixerStrip* ms)
 {
-        TreeModel::Children rows = track_model->children();
+       TreeModel::Children rows = track_model->children();
        TreeModel::Children::iterator i;
        
        for (i = rows.begin(); i != rows.end(); ++i) {
@@ -419,37 +419,37 @@ Mixer_UI::hide_strip (MixerStrip* ms)
                        (*i)[track_columns.visible] = false;
                        break;
                }
-        }
- }
+       }
+}
 
- gint
- Mixer_UI::start_updating ()
- {
-        fast_screen_update_connection = ARDOUR_UI::instance()->SuperRapidScreenUpdate.connect (mem_fun(*this, &Mixer_UI::fast_update_strips));
-        return 0;
- }
+gint
+Mixer_UI::start_updating ()
+{
+    fast_screen_update_connection = ARDOUR_UI::instance()->SuperRapidScreenUpdate.connect (mem_fun(*this, &Mixer_UI::fast_update_strips));
+    return 0;
+}
 
- gint
- Mixer_UI::stop_updating ()
- {
-        fast_screen_update_connection.disconnect();
-        return 0;
- }
+gint
+Mixer_UI::stop_updating ()
+{
+    fast_screen_update_connection.disconnect();
+    return 0;
+}
 
- void
- Mixer_UI::fast_update_strips ()
- {
-        if (is_mapped () && session) {
-                for (list<MixerStrip *>::iterator i = strips.begin(); i != strips.end(); ++i) {
-                        (*i)->fast_update ();
-                }
-        }
- }
+void
+Mixer_UI::fast_update_strips ()
+{
+       if (is_mapped () && session) {
+               for (list<MixerStrip *>::iterator i = strips.begin(); i != strips.end(); ++i) {
+                       (*i)->fast_update ();
+               }
+       }
+}
 
 void
 Mixer_UI::set_all_strips_visibility (bool yn)
 {
-        TreeModel::Children rows = track_model->children();
+       TreeModel::Children rows = track_model->children();
        TreeModel::Children::iterator i;
 
        no_track_list_redisplay = true;
index 9a8bcecc42c16d20b8b8b79b32744e21c697c239..4c486eaaf818c37253f1fb35dbd469f1edceba0c 100644 (file)
@@ -313,7 +313,6 @@ NewSessionDialog::NewSessionDialog()
        m_treeview->set_enable_search(true);
        m_treeview->set_fixed_height_mode(false);
        m_treeview->set_hover_selection(false);
-       m_treeview->set_hover_expand(true);
        m_treeview->set_size_request(-1, 150);
        recent_scrolledwindow->set_flags(Gtk::CAN_FOCUS);
        recent_scrolledwindow->set_border_width(6);
index b75ef7ead8e1a99a7facc5f2bdf74e9b8887f112..3e461a85d7b475cad4ecaa169801d5c3cc8abff9 100644 (file)
@@ -318,11 +318,12 @@ OptionEditor::destructo_xfade_adjustment_changed ()
        float val = destructo_xfade_adjustment.get_value();
 
        /* val is in msecs */
+
        
        Config->set_destructive_xfade_msecs ((uint32_t) floor (val));
 
        if (session) {
-               DestructiveFileSource::setup_standard_crossfades (session->frame_rate());
+               SndFileSource::setup_standard_crossfades (session->frame_rate());
        } 
 }
 
@@ -420,19 +421,19 @@ OptionEditor::setup_midi_options ()
                }
 
                tb->set_active (!(*i).second->input()->offline());
-               tb->signal_button_press_event().connect (bind (mem_fun(*this, &OptionEditor::port_online_toggled), (*i).second, tb));
+               tb->signal_toggled().connect (bind (mem_fun(*this, &OptionEditor::port_online_toggled), (*i).second, tb));
                (*i).second->input()->OfflineStatusChanged.connect (bind (mem_fun(*this, &OptionEditor::map_port_online), (*i).second, tb));
                table->attach (*tb, 1, 2, n+2, n+3, FILL|EXPAND, FILL);
 
                tb = manage (new ToggleButton ());
                tb->set_name ("OptionEditorToggleButton");
-               tb->signal_button_press_event().connect (bind (mem_fun(*this, &OptionEditor::port_trace_in_toggled), (*i).second, tb));
+               tb->signal_toggled().connect (bind (mem_fun(*this, &OptionEditor::port_trace_in_toggled), (*i).second, tb));
                tb->set_size_request (10, 10);
                table->attach (*tb, 2, 3, n+2, n+3, FILL|EXPAND, FILL);
 
                tb = manage (new ToggleButton ());
                tb->set_name ("OptionEditorToggleButton");
-               tb->signal_button_press_event().connect (bind (mem_fun(*this, &OptionEditor::port_trace_out_toggled), (*i).second, tb));
+               tb->signal_toggled().connect (bind (mem_fun(*this, &OptionEditor::port_trace_out_toggled), (*i).second, tb));
                tb->set_size_request (10, 10);
                table->attach (*tb, 3, 4, n+2, n+3, FILL|EXPAND, FILL);
 
@@ -544,15 +545,14 @@ OptionEditor::midi_port_chosen (MIDI::Port* port, Gtk::RadioButton* rb)
        }
 }
 
-gint
-OptionEditor::port_online_toggled (GdkEventButton* ev, MIDI::Port* port, ToggleButton* tb)
+void
+OptionEditor::port_online_toggled (MIDI::Port* port, ToggleButton* tb)
 {
-       bool wanted = tb->get_active(); /* it hasn't changed at this point */
-
+       bool wanted = tb->get_active();
+       
        if (wanted != port->input()->offline()) {
                port->input()->set_offline (wanted);
        } 
-       return stop_signal (*tb, "button_press_event");
 }
 
 void
@@ -567,24 +567,24 @@ OptionEditor::map_port_online (MIDI::Port* port, ToggleButton* tb)
        }
 }
 
-gint
-OptionEditor::port_trace_in_toggled (GdkEventButton* ev, MIDI::Port* port, ToggleButton* tb)
+void
+OptionEditor::port_trace_in_toggled (MIDI::Port* port, ToggleButton* tb)
 {
-       /* XXX not very good MVC style here */
+       bool trace = tb->get_active();
 
-       port->input()->trace (!tb->get_active(), &cerr, string (port->name()) + string (" input: "));
-       tb->set_active (!tb->get_active());
-       return stop_signal (*tb, "button_press_event");
+       if (port->input()->tracing() != trace) {
+               port->output()->trace (trace, &cerr, string (port->name()) + string (" input: "));
+       }
 }
 
-gint
-OptionEditor::port_trace_out_toggled (GdkEventButton* ev,MIDI::Port* port, ToggleButton* tb)
+void
+OptionEditor::port_trace_out_toggled (MIDI::Port* port, ToggleButton* tb)
 {
-       /* XXX not very good MVC style here */
+       bool trace = tb->get_active();
 
-       port->output()->trace (!tb->get_active(), &cerr, string (port->name()) + string (" output: "));
-       tb->set_active (!tb->get_active());
-       return stop_signal (*tb, "button_press_event");
+       if (port->output()->tracing() != trace) {
+               port->output()->trace (trace, &cerr, string (port->name()) + string (" output: "));
+       }
 }
 
 void
index d3235164a69c8155520141aa8e741f668213a0c8..2076da3935b737db2e8d96b759876ddab1b84482 100644 (file)
@@ -116,9 +116,9 @@ class OptionEditor : public Gtk::Dialog
        Gtk::RadioButton::Group mmc_button_group;
        Gtk::RadioButton::Group midi_button_group;
 
-       gint port_online_toggled (GdkEventButton*,MIDI::Port*,Gtk::ToggleButton*);
-       gint port_trace_in_toggled (GdkEventButton*,MIDI::Port*,Gtk::ToggleButton*);
-       gint port_trace_out_toggled (GdkEventButton*,MIDI::Port*,Gtk::ToggleButton*);
+       void port_online_toggled (MIDI::Port*,Gtk::ToggleButton*);
+       void port_trace_in_toggled (MIDI::Port*,Gtk::ToggleButton*);
+       void port_trace_out_toggled (MIDI::Port*,Gtk::ToggleButton*);
        
        void mmc_port_chosen (MIDI::Port*,Gtk::RadioButton*);
        void mtc_port_chosen (MIDI::Port*,Gtk::RadioButton*);
index b19a9f74ebeddb6f57f62544c9ae377f828392be..56b9e34d35b5b19e48e9ecd575851369b51fb93b 100644 (file)
@@ -118,16 +118,21 @@ PluginUIWindow::PluginUIWindow (boost::shared_ptr<PluginInsert> insert, bool scr
 PluginUIWindow::~PluginUIWindow ()
 {
 }
+
 bool
 PluginUIWindow::on_key_press_event (GdkEventKey* event)
 {
-       return PublicEditor::instance().on_key_press_event(event);
+       if (!key_press_focus_accelerator_handler (*this, event)) {
+               return PublicEditor::instance().on_key_press_event(event);
+       } else {
+               return true;
+       }
 }
 
 bool
 PluginUIWindow::on_key_release_event (GdkEventKey* event)
 {
-       return PublicEditor::instance().on_key_release_event(event);
+       return true;
 }
 
 void
diff --git a/gtk2_ardour/po/SConscript b/gtk2_ardour/po/SConscript
deleted file mode 100644 (file)
index d7e957b..0000000
+++ /dev/null
@@ -1,51 +0,0 @@
-# -*- python -*-
-import os
-import os.path
-import glob
-
-Import ('env gtkardour install_prefix intl_files')
-
-potfiles_in = open('POTFILES.in', 'w')
-
-intl_files.sort()
-
-print "Generating POTFILES.in in gtk_ardour/po"
-
-potfiles_in.write("""# This file was automatically generated by a configuration script.
-# Contains a list of source files containing translatable
-# strings sorted alphabetically.
-[encoding: UTF-8]
-""")
-
-for f in intl_files[:]:
-    potfiles_in.write(f + '\n')
-
-potfiles_in.close()
-
-print "Updating pot file: "
-
-domain = gtkardour['DOMAIN']
-potfile = gtkardour['POTFILE']
-
-poaction = env.Action('intltool-update -p -g=' + domain)
-
-Execute(poaction)
-
-# this should probably be merged with the i18n builder somehow
-
-p_oze = [ os.path.basename (po) for po in glob.glob ('*.po') ]
-languages = [ po.replace ('.po', '') for po in p_oze ]
-m_oze = [ po.replace (".po", ".mo") for po in p_oze ]
-    
-for mo in m_oze[:]:
-    po = mo.replace (".mo", ".po")
-    env.Alias ('install', gtkardour.MoBuild (mo, [ po, potfile ]))
-        
-for lang in languages[:]:
-    modir = (os.path.join (install_prefix, 'share/locale/' + lang + '/LC_MESSAGES/'))
-    moname = domain + '.mo'
-    env.Alias('install', env.InstallAs (os.path.join (modir, moname), lang + '.mo'))
-
-env.Alias ('tarball', env.Distribute (env['DISTTREE'],
-                                      [ 'SConscript', 'gtk_ardour.pot' ] +
-                                      glob.glob('*.po')))
index 2a7183442f60cfe3194452576e5f74adf773e4bc..7a11f8bb1df9c6968d516c0fba12ec40c5193272 100644 (file)
+# translation of ru_RU.po to Russian
 # Copyright (C) 2004 Paul Davis
 # This file is distributed under the same license as the gtk-ardour package.
-# Igor Blinov pitstop@nm.ru, 2004.
 #
+# Igor Blinov pitstop@nm.ru, 2004.
+# Alexandre Prokoudine <alexandre.prokoudine@gmail.com>, 2006.
 msgid ""
 msgstr ""
-"Project-Id-Version: gtk-ardour 0.413.0\n"
+"Project-Id-Version: ru_RU\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2006-06-27 13:00-0400\n"
-"PO-Revision-Date: 2004-03-31 00:45+0300\n"
-"Last-Translator: Igor Blinov pitstop@nm.ru\n"
-"Language-Team: Russian\n"
+"POT-Creation-Date: 2006-09-21 04:11+0400\n"
+"PO-Revision-Date: 2006-09-21 07:53+0400\n"
+"Last-Translator: Alexandre Prokoudine <alexandre.prokoudine@gmail.com>\n"
+"Language-Team: Russian <ru@li.org>\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.11.4\n"
+"Plural-Forms:  nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
 
-#: about.cc:120
+#: gtk2_ardour/about.cc:120
 msgid "Paul Davis"
-msgstr ""
+msgstr "Paul Davis"
 
-#: about.cc:121
-#, fuzzy
+#: gtk2_ardour/about.cc:121
 msgid "Jesse Chappell"
-msgstr "Огромная"
+msgstr "Jesse Chappell"
 
-#: about.cc:122
+#: gtk2_ardour/about.cc:122
 msgid "Taybin Rutkin"
-msgstr ""
+msgstr "Taybin Rutkin"
 
-#: about.cc:123
+#: gtk2_ardour/about.cc:123
 msgid "Marcus Andersson"
-msgstr ""
+msgstr "Marcus Andersson"
 
-#: about.cc:124
+#: gtk2_ardour/about.cc:124
 msgid "Jeremy Hall"
-msgstr ""
+msgstr "Jeremy Hall"
 
-#: about.cc:125
+#: gtk2_ardour/about.cc:125
 msgid "Steve Harris"
-msgstr ""
+msgstr "Steve Harris"
 
-#: about.cc:126
+#: gtk2_ardour/about.cc:126
 msgid "Tim Mayberry"
-msgstr ""
+msgstr "Tim Mayberry"
 
-#: about.cc:127
+#: gtk2_ardour/about.cc:127
 msgid "Mark Stewart"
-msgstr ""
+msgstr "Mark Stewart"
 
-#: about.cc:128
+#: gtk2_ardour/about.cc:128
 msgid "Sam Chessman"
-msgstr ""
+msgstr "Sam Chessman"
 
-#: about.cc:129
+#: gtk2_ardour/about.cc:129
 msgid "Jack O'Quin"
-msgstr ""
+msgstr "Jack O'Quin"
 
-#: about.cc:130
+#: gtk2_ardour/about.cc:130
 msgid "Matt Krai"
-msgstr ""
+msgstr "Matt Krai"
 
-#: about.cc:131
+#: gtk2_ardour/about.cc:131
 msgid "Ben Bell"
-msgstr ""
+msgstr "Ben Bell"
 
-#: about.cc:132
+#: gtk2_ardour/about.cc:132
 msgid "Gerard van Dongen"
-msgstr ""
+msgstr "Gerard van Dongen"
 
-#: about.cc:133
+#: gtk2_ardour/about.cc:133
 msgid "Thomas Charbonnel"
-msgstr ""
+msgstr "Thomas Charbonnel"
 
-#: about.cc:134
+#: gtk2_ardour/about.cc:134
 msgid "Nick Mainsbridge"
-msgstr ""
+msgstr "Nick Mainsbridge"
 
-#: about.cc:135
+#: gtk2_ardour/about.cc:135
 msgid "Colin Law"
-msgstr ""
+msgstr "Colin Law"
 
-#: about.cc:136
+#: gtk2_ardour/about.cc:136
 msgid "Sampo Savolainen"
-msgstr ""
+msgstr "Sampo Savolainen"
 
-#: about.cc:137
+#: gtk2_ardour/about.cc:137
 msgid "Joshua Leach"
-msgstr ""
+msgstr "Joshua Leach"
 
-#: about.cc:138
+#: gtk2_ardour/about.cc:138
 msgid "Rob Holland"
-msgstr ""
+msgstr "Rob Holland"
 
-#: about.cc:139
+#: gtk2_ardour/about.cc:139
 msgid "Per Sigmond"
-msgstr ""
+msgstr "Per Sigmond"
 
-#: about.cc:140
+#: gtk2_ardour/about.cc:140
 msgid "Doug Mclain"
-msgstr ""
+msgstr "Doug Mclain"
 
-#: about.cc:141
+#: gtk2_ardour/about.cc:141
 msgid "Petter Sundlöf"
-msgstr ""
+msgstr "Petter Sundlöf"
 
-#: about.cc:146
+#: gtk2_ardour/about.cc:146
 msgid ""
 "French:\n"
 "\tAlain Fréhel <alain.frehel@free.fr>\n"
 msgstr ""
+"Французский:\n"
+"\tAlain Fréhel <alain.frehel@free.fr>\n"
 
-#: about.cc:147
+#: gtk2_ardour/about.cc:147
 msgid ""
 "German:\n"
 "\tKarsten Petersen <kapet@kapet.de>\n"
 msgstr ""
+"Немецкий:\n"
+"\tKarsten Petersen <kapet@kapet.de>\n"
 
-#: about.cc:148
+#: gtk2_ardour/about.cc:148
 msgid ""
 "Italian:\n"
 "\tFilippo Pappalardo <filippo@email.it>\n"
 msgstr ""
+"Итальянский:\n"
+"\tFilippo Pappalardo <filippo@email.it>\n"
 
-#: about.cc:149
+#: gtk2_ardour/about.cc:149
 msgid ""
 "Portuguese:\n"
 "\tRui Nuno Capela <rncbc@rncbc.org>\n"
 msgstr ""
+"Португальский:\n"
+"\tRui Nuno Capela <rncbc@rncbc.org>\n"
 
-#: about.cc:150
+#: gtk2_ardour/about.cc:150
 msgid ""
 "Brazilian Portuguese:\n"
 "\tAlexander da Franca Fernandes <alexander@nautae.eti.br>\n"
 "\tChris Ross <chris@tebibyte.org>\n"
 msgstr ""
+"Бразильский португальский:\n"
+"\tAlexander da Franca Fernandes <alexander@nautae.eti.br>\n"
+"\tChris Ross <chris@tebibyte.org>\n"
 
-#: about.cc:152
+#: gtk2_ardour/about.cc:152
 msgid ""
 "Spanish:\n"
 "\t Alex Krohn <alexkrohn@fastmail.fm>\n"
 msgstr ""
+"Испанский:\n"
+"\t Alex Krohn <alexkrohn@fastmail.fm>\n"
 
-#: about.cc:153
+#: gtk2_ardour/about.cc:153
 msgid ""
 "Russian:\n"
 "\t Igor Blinov <pitstop@nm.ru>\n"
 msgstr ""
+"Русский:\n"
+"\t Igor Blinov <pitstop@nm.ru>\n"
+"\t Alexandre Prokoudine <alexandre.prokoudine@gmail.com>\n"
 
-#: about.cc:181
-#, fuzzy
+#: gtk2_ardour/about.cc:181
 msgid "Copyright (C) 1999-2005 Paul Davis\n"
-msgstr "Авторск��е право 1999-2004 Paul Davis"
+msgstr "Авторск��е права 1999-2005 Paul Davis\n"
 
-#: about.cc:182
+#: gtk2_ardour/about.cc:182
 msgid ""
 "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"
 msgstr ""
 
-#: about.cc:188
+#: gtk2_ardour/about.cc:188
 msgid ""
 "%1\n"
 "(built with ardour/gtk %2.%3.%4 libardour: %5.%6.%7)"
 msgstr ""
 
-#: actions.cc:261
+#: gtk2_ardour/actions.cc:76
+msgid "badly formatted UI definition file"
+msgstr ""
+
+#: gtk2_ardour/actions.cc:78
+msgid "Ardour menu definition file not found"
+msgstr ""
+
+#: gtk2_ardour/actions.cc:82
+msgid "ardour will not work without a valid ardour.menus file"
+msgstr ""
+
+#: gtk2_ardour/actions.cc:261
 #, fuzzy
 msgid "programmer error: %1 %2"
 msgstr "ошибка в программе: "
 
-#: add_route_dialog.cc:62
+#: gtk2_ardour/actions.cc:280
+msgid "Unknown action name: %1"
+msgstr ""
+
+#: gtk2_ardour/add_route_dialog.cc:62
 msgid "ardour: add track/bus"
 msgstr "ardour: добавить трек/шину"
 
-#. path = "1"
-#: add_route_dialog.cc:63 editor_route_list.cc:73
+#: gtk2_ardour/add_route_dialog.cc:63 gtk2_ardour/editor_route_list.cc:71
 msgid "Tracks"
-msgstr "��реки"
+msgstr "��орожки"
 
-#. path = "0"
-#: add_route_dialog.cc:64 editor_route_list.cc:70
+#: gtk2_ardour/add_route_dialog.cc:64 gtk2_ardour/editor_route_list.cc:68
 msgid "Busses"
 msgstr "Шины"
 
-#: add_route_dialog.cc:96 plugin_ui.cc:833
+#: gtk2_ardour/add_route_dialog.cc:96 gtk2_ardour/plugin_ui.cc:145
 msgid "Add"
 msgstr "Добавить"
 
-#: add_route_dialog.cc:114
+#: gtk2_ardour/add_route_dialog.cc:114
 msgid "Name (template)"
 msgstr "Имя (шаблона)"
 
-#: add_route_dialog.cc:120
+#: gtk2_ardour/add_route_dialog.cc:120
 #, fuzzy
 msgid "Channel Configuration"
 msgstr "Отменить импорт"
 
-#: add_route_dialog.cc:177 editor.cc:134 editor.cc:3688 time_axis_view.cc:552
+#: gtk2_ardour/add_route_dialog.cc:177 gtk2_ardour/time_axis_view.cc:553
 msgid "Normal"
 msgstr "Норм."
 
-#: add_route_dialog.cc:179
-#, fuzzy
+#: gtk2_ardour/add_route_dialog.cc:179
 msgid "Tape"
-msgstr "Начало"
+msgstr ""
 
-#: add_route_dialog.cc:196
-#, fuzzy
+#: gtk2_ardour/add_route_dialog.cc:196
 msgid "Mono"
-msgstr "�оно"
+msgstr "�оно"
 
-#: add_route_dialog.cc:198
-#, fuzzy
+#: gtk2_ardour/add_route_dialog.cc:198
 msgid "Stereo"
-msgstr "стерео"
+msgstr "Стерео"
 
-#. preroll stuff
-#: ardour_ui.cc:106
+#: gtk2_ardour/ardour_ui.cc:106
 msgid ""
 "pre\n"
 "roll"
 msgstr "откат"
 
-#: ardour_ui.cc:107
+#: gtk2_ardour/ardour_ui.cc:107
 msgid ""
 "post\n"
 "roll"
 msgstr "накат"
 
-#. transport
-#: ardour_ui.cc:115
-#, fuzzy
+#: gtk2_ardour/ardour_ui.cc:115
 msgid ""
 "time\n"
 "master"
-msgstr "JACK-счётчик - мастер"
+msgstr ""
 
-#: ardour_ui.cc:117
+#: gtk2_ardour/ardour_ui.cc:117
 msgid "% "
 msgstr "% "
 
-#: ardour_ui.cc:119
-msgid ""
-"punch\n"
-"in"
-msgstr ""
-"врезка\n"
-"до"
+#: gtk2_ardour/ardour_ui.cc:119 gtk2_ardour/ardour_ui_ed.cc:267
+msgid "Punch In"
+msgstr "Начало врезки"
 
-#: ardour_ui.cc:120
-msgid ""
-"punch\n"
-"out"
-msgstr ""
-"врезка\n"
-"после"
+#: gtk2_ardour/ardour_ui.cc:120 gtk2_ardour/ardour_ui_ed.cc:270
+msgid "Punch Out"
+msgstr "Конец врезки"
 
-#: ardour_ui.cc:121
-msgid ""
-"auto\n"
-"return"
-msgstr ""
-"авто\n"
-"возврат"
+#: gtk2_ardour/ardour_ui.cc:121 gtk2_ardour/ardour_ui_ed.cc:282
+msgid "Auto Return"
+msgstr "Автовозврат"
 
-#: ardour_ui.cc:122
-msgid ""
-"auto\n"
-"play"
-msgstr ""
-"авто\n"
-"воспр."
+#: gtk2_ardour/ardour_ui.cc:122
+msgid "Autuo Play"
+msgstr "Автовоспр."
 
-#: ardour_ui.cc:123
-msgid ""
-"auto\n"
-"input"
-msgstr ""
-"авто\n"
-"вход"
+#: gtk2_ardour/ardour_ui.cc:123 gtk2_ardour/ardour_ui_ed.cc:276
+msgid "Auto Input"
+msgstr "Автовход"
 
-#: ardour_ui.cc:124
-msgid "click"
-msgstr "метроном"
+#: gtk2_ardour/ardour_ui.cc:124 gtk2_ardour/ardour_ui_ed.cc:273
+#: gtk2_ardour/option_editor.cc:128
+msgid "Click"
+msgstr "Метроном"
 
-#: ardour_ui.cc:125
-msgid "AUDITIONING"
+#: gtk2_ardour/ardour_ui.cc:125
+msgid "AUDITION"
 msgstr "КОНТРОЛЬ"
 
-#: ardour_ui.cc:126
+#: gtk2_ardour/ardour_ui.cc:126
 msgid "SOLO"
 msgstr "СОЛО"
 
-#: ardour_ui.cc:375
+#: gtk2_ardour/ardour_ui.cc:374
 msgid "quit"
 msgstr "выйти"
 
-#: ardour_ui.cc:384
+#: gtk2_ardour/ardour_ui.cc:383
 msgid ""
 "Ardour was unable to save your session.\n"
 "\n"
@@ -305,33 +312,33 @@ msgid ""
 "\"Just quit\" option."
 msgstr ""
 
-#: ardour_ui.cc:403
+#: gtk2_ardour/ardour_ui.cc:402
 msgid "ardour: save session?"
 msgstr "ardour: сохранить сессию?"
 
-#: ardour_ui.cc:410
+#: gtk2_ardour/ardour_ui.cc:409
 msgid "Don't %1"
 msgstr "Отмена"
 
-#: ardour_ui.cc:412
+#: gtk2_ardour/ardour_ui.cc:411
 msgid "Just %1"
 msgstr "Да, %1"
 
-#: ardour_ui.cc:414
+#: gtk2_ardour/ardour_ui.cc:413
 msgid "Save and %1"
 msgstr "Сохранить и %1"
 
-#: ardour_ui.cc:426
+#: gtk2_ardour/ardour_ui.cc:425
 #, fuzzy
 msgid "session"
 msgstr "Сессия"
 
-#: ardour_ui.cc:428
+#: gtk2_ardour/ardour_ui.cc:427
 #, fuzzy
 msgid "snapshot"
 msgstr "Снимок"
 
-#: ardour_ui.cc:430
+#: gtk2_ardour/ardour_ui.cc:429
 #, fuzzy
 msgid ""
 "The %1\"%2\"\n"
@@ -350,80 +357,82 @@ msgstr ""
 "\n"
 "Что Вы хотите сделать?"
 
-#: ardour_ui.cc:444
+#: gtk2_ardour/ardour_ui.cc:443
 msgid "Prompter"
 msgstr ""
 
-#: ardour_ui.cc:503
+#: gtk2_ardour/ardour_ui.cc:502
 #, fuzzy, c-format
 msgid "disconnected"
 msgstr "Отсоединить"
 
-#: ardour_ui.cc:510
+#: gtk2_ardour/ardour_ui.cc:509
 #, fuzzy, c-format
-msgid "SR: %.1f kHz / %4.1f msecs"
+msgid "%.1f kHz / %4.1f msecs"
 msgstr "SR: %.1f кГц"
 
-#: ardour_ui.cc:514
-#, c-format
-msgid "SR: %u kHz / %4.1f msecs"
-msgstr ""
+#: gtk2_ardour/ardour_ui.cc:513
+#, fuzzy, c-format
+msgid "%u kHz / %4.1f msecs"
+msgstr "SR: %.1f кГц"
 
-#: ardour_ui.cc:527
-#, c-format
-msgid "DSP Load: %.1f%%"
+#: gtk2_ardour/ardour_ui.cc:526
+#, fuzzy, c-format
+msgid "DSP: %.1f%%"
 msgstr "Загрузка DSP: %.1f%%"
 
-#: ardour_ui.cc:537
+#: gtk2_ardour/ardour_ui.cc:536
 #, fuzzy, c-format
 msgid "Buffers p:%<PRIu32>%% c:%<PRIu32>%%"
 msgstr "Буферы p:%5.0f%% c:%5.0f%%"
 
-#: ardour_ui.cc:564
-msgid "space: 24hrs+"
+#: gtk2_ardour/ardour_ui.cc:564
+#, fuzzy
+msgid "Disk: 24hrs+"
 msgstr "место на диске: 24 часа +"
 
-#: ardour_ui.cc:594
-#, c-format
-msgid "space: %02dh:%02dm:%02ds"
+#: gtk2_ardour/ardour_ui.cc:594
+#, fuzzy, c-format
+msgid "Disk: %02dh:%02dm:%02ds"
 msgstr "свободное место: %02dч:%02dмин:%02dсек"
 
-#: ardour_ui.cc:633
+#: gtk2_ardour/ardour_ui.cc:633
 msgid "programming error: impossible control method"
 msgstr "ошибка в программе: impossible control method"
 
-#: ardour_ui.cc:741 new_session_dialog.cc:294
+#: gtk2_ardour/ardour_ui.cc:741 gtk2_ardour/new_session_dialog.cc:301
 #, fuzzy
 msgid "Recent Sessions"
 msgstr "открыть сессию"
 
-#. ardour sessions are folders
-#: ardour_ui.cc:834
+#: gtk2_ardour/ardour_ui.cc:834
 msgid "open session"
 msgstr "открыть сессию"
 
-#: ardour_ui.cc:840
-#, fuzzy
+#: gtk2_ardour/ardour_ui.cc:840
 msgid "Ardour sessions"
-msgstr "ardour_новая_сессия"
+msgstr "Сессии Ardour"
 
-#: ardour_ui.cc:873
+#: gtk2_ardour/ardour_ui.cc:873
 msgid "Patience is a virtue.\n"
 msgstr "По нитке дойдёшь и до клубка.\n"
 
-#: ardour_ui.cc:882
-msgid "You cannot add a track without a session already loaded."
+#: gtk2_ardour/ardour_ui.cc:883
+#, fuzzy
+msgid "You cannot add a track or bus without a session already loaded."
 msgstr "Вы не можете добавить трек пока сессия не загружена."
 
-#: ardour_ui.cc:889
-msgid "could not create new audio track"
+#: gtk2_ardour/ardour_ui.cc:893 gtk2_ardour/ardour_ui.cc:905
+#, fuzzy
+msgid "could not create a new audio track"
 msgstr "не удалось создать новый аудиотрек"
 
-#: ardour_ui.cc:893
-msgid "could not create new audio bus"
-msgstr "не удалось создать новую аудиошину"
+#: gtk2_ardour/ardour_ui.cc:895 gtk2_ardour/ardour_ui.cc:907
+#, fuzzy
+msgid "could not create %1 new audio tracks"
+msgstr "не удалось создать новый аудиотрек"
 
-#: ardour_ui.cc:912
+#: gtk2_ardour/ardour_ui.cc:927
 msgid ""
 "There are insufficient JACK ports available\n"
 "to create a new track or bus.\n"
@@ -431,14 +440,14 @@ msgid ""
 "restart JACK with more ports."
 msgstr ""
 
-#: ardour_ui.cc:1036
+#: gtk2_ardour/ardour_ui.cc:1046
 msgid ""
 "Please create 1 or more track\n"
 "before trying to record.\n"
 "Check the Session menu."
 msgstr ""
 
-#: ardour_ui.cc:1265
+#: gtk2_ardour/ardour_ui.cc:1268
 #, fuzzy
 msgid ""
 "JACK has either been shutdown or it\n"
@@ -451,55 +460,50 @@ msgstr ""
 "Необходимо сохранить сессию и\n"
 "перезапустить JACK и Ardour."
 
-#: ardour_ui.cc:1282
+#: gtk2_ardour/ardour_ui.cc:1285
 msgid "Unable to create all required ports"
 msgstr ""
 
-#: ardour_ui.cc:1290
+#: gtk2_ardour/ardour_ui.cc:1293
 #, fuzzy
 msgid "Unable to start the session running"
 msgstr "В начало сессии"
 
-#: ardour_ui.cc:1426
-msgid "No Stream"
-msgstr "Нет потока"
-
-#: ardour_ui.cc:1453 ardour_ui.cc:1472
+#: gtk2_ardour/ardour_ui.cc:1399 gtk2_ardour/ardour_ui.cc:1418
 msgid "none"
 msgstr "нет"
 
-#: ardour_ui.cc:1462 ardour_ui.cc:1481
+#: gtk2_ardour/ardour_ui.cc:1408 gtk2_ardour/ardour_ui.cc:1427
 msgid "off"
 msgstr "выкл"
 
-#: ardour_ui.cc:1505
-#, fuzzy
+#: gtk2_ardour/ardour_ui.cc:1451
 msgid "Name of New Snapshot"
-msgstr "Имя снимка"
+msgstr "Имя нового снимка:"
 
-#: ardour_ui.cc:1651
+#: gtk2_ardour/ardour_ui.cc:1597
 msgid "Name for mix template:"
 msgstr "Имя mix-шаблона:"
 
-#: ardour_ui.cc:1652
+#: gtk2_ardour/ardour_ui.cc:1598
 msgid "-template"
 msgstr "-шаблон"
 
-#: ardour_ui.cc:1809
+#: gtk2_ardour/ardour_ui.cc:1806
 msgid ""
 "You do not have write access to this session.\n"
 "This prevents the session from being loaded."
 msgstr ""
 
-#: ardour_ui.cc:1822 ardour_ui.cc:1877
+#: gtk2_ardour/ardour_ui.cc:1819 gtk2_ardour/ardour_ui.cc:1871
 msgid "Session \"%1 (snapshot %2)\" did not load successfully"
 msgstr "Не удалось загрузить сессию \"%1 (снимок %2)\""
 
-#: ardour_ui.cc:1933
+#: gtk2_ardour/ardour_ui.cc:1926
 msgid "No audio files were ready for cleanup"
 msgstr ""
 
-#: ardour_ui.cc:1937
+#: gtk2_ardour/ardour_ui.cc:1930
 msgid ""
 "If this seems suprising, \n"
 "check for any existing snapshots.\n"
@@ -507,23 +511,23 @@ msgid ""
 "require some unused files to continue to exist."
 msgstr ""
 
-#: ardour_ui.cc:1946
+#: gtk2_ardour/ardour_ui.cc:1939
 msgid "ardour: cleanup"
 msgstr "ardour: очистка"
 
-#: ardour_ui.cc:1982 ardour_ui.cc:1988
+#: gtk2_ardour/ardour_ui.cc:1975 gtk2_ardour/ardour_ui.cc:1981
 msgid "files were"
 msgstr ""
 
-#: ardour_ui.cc:1984 ardour_ui.cc:1990
+#: gtk2_ardour/ardour_ui.cc:1977 gtk2_ardour/ardour_ui.cc:1983
 msgid "file was"
 msgstr ""
 
-#: ardour_ui.cc:2031
+#: gtk2_ardour/ardour_ui.cc:2024
 msgid "Are you sure you want to cleanup?"
 msgstr ""
 
-#: ardour_ui.cc:2036
+#: gtk2_ardour/ardour_ui.cc:2029
 msgid ""
 "Cleanup is a destructive operation.\n"
 "ALL undo/redo information will be lost if you cleanup.\n"
@@ -531,26 +535,26 @@ msgid ""
 "location."
 msgstr ""
 
-#: ardour_ui.cc:2042
+#: gtk2_ardour/ardour_ui.cc:2035
 #, fuzzy
 msgid "Clean Up"
 msgstr "Очистка"
 
-#: ardour_ui.cc:2045
+#: gtk2_ardour/ardour_ui.cc:2038
 #, fuzzy
 msgid "CleanupDialog"
 msgstr "Очистка"
 
-#: ardour_ui.cc:2046
+#: gtk2_ardour/ardour_ui.cc:2039
 #, fuzzy
 msgid "ardour_cleanup"
 msgstr "ardour: очистка"
 
-#: ardour_ui.cc:2065
+#: gtk2_ardour/ardour_ui.cc:2058
 msgid "cleaned files"
 msgstr ""
 
-#: ardour_ui.cc:2066
+#: gtk2_ardour/ardour_ui.cc:2059
 #, fuzzy
 msgid ""
 "The following %1 %2 not in use and \n"
@@ -565,25 +569,24 @@ msgstr ""
 "Последующая очистка корзины освободит\n"
 "%2 мегабайт места на диске."
 
-#: ardour_ui.cc:2091
+#: gtk2_ardour/ardour_ui.cc:2084
 #, fuzzy
 msgid "deleted file"
 msgstr "удалённые файлы"
 
-#: ardour_ui.cc:2092
+#: gtk2_ardour/ardour_ui.cc:2085
 #, fuzzy
 msgid ""
 "The following %1 %2 deleted from\n"
 "%3,\n"
 "releasing %4 %5bytes of disk space"
-msgstr ""
-"Следующие %1 файлов были удалены, освободив при этом %2 Мб места на диске"
+msgstr "Следующие %1 файлов были удалены, освободив при этом %2 Мб места на диске"
 
-#: ardour_ui.cc:2215
+#: gtk2_ardour/ardour_ui.cc:2201
 msgid "Recording was stopped because your system could not keep up."
 msgstr "Запись остановлена из-за недостаточного быстродействия системы"
 
-#: ardour_ui.cc:2238
+#: gtk2_ardour/ardour_ui.cc:2224
 msgid ""
 "The disk system on your computer\n"
 "was not able to keep up with Ardour.\n"
@@ -592,7 +595,7 @@ msgid ""
 "quickly enough to keep up with recording.\n"
 msgstr ""
 
-#: ardour_ui.cc:2257
+#: gtk2_ardour/ardour_ui.cc:2243
 msgid ""
 "The disk system on your computer\n"
 "was not able to keep up with Ardour.\n"
@@ -601,7 +604,7 @@ msgid ""
 "quickly enough to keep up with playback.\n"
 msgstr ""
 
-#: ardour_ui.cc:2283
+#: gtk2_ardour/ardour_ui.cc:2269
 msgid ""
 "This session appears to have been in\n"
 "middle of recording when ardour or\n"
@@ -612,2866 +615,2742 @@ msgid ""
 "what you would like to do.\n"
 msgstr ""
 
-#: ardour_ui.cc:2293
+#: gtk2_ardour/ardour_ui.cc:2279
 msgid "Recover from crash"
 msgstr ""
 
-#: ardour_ui.cc:2294
+#: gtk2_ardour/ardour_ui.cc:2280
 msgid "Ignore crash data"
 msgstr ""
 
-#: ardour_ui.cc:2312
+#: gtk2_ardour/ardour_ui.cc:2298
 #, fuzzy
 msgid "Could not disconnect from JACK"
 msgstr "Не удалось соединиться с сервером JACK как \"%1\""
 
-#: ardour_ui.cc:2325
+#: gtk2_ardour/ardour_ui.cc:2311
 #, fuzzy
 msgid "Could not reconnect to JACK"
 msgstr "Не удалось соединиться с сервером JACK как \"%1\""
 
-#: ardour_ui2.cc:60
+#: gtk2_ardour/ardour_ui2.cc:60
 msgid "UI: cannot setup editor"
 msgstr "Интерфейс: не удалось инициализировать редактор"
 
-#: ardour_ui2.cc:65
+#: gtk2_ardour/ardour_ui2.cc:65
 msgid "UI: cannot setup mixer"
 msgstr "Интерфейс: не удалось инициализировать микшер"
 
-#: ardour_ui2.cc:91
+#: gtk2_ardour/ardour_ui2.cc:91
 msgid "MMC + Local"
 msgstr ""
 
-#: ardour_ui2.cc:92
+#: gtk2_ardour/ardour_ui2.cc:92
 msgid "MMC"
 msgstr "MMC"
 
-#: ardour_ui2.cc:93
+#: gtk2_ardour/ardour_ui2.cc:93
 msgid "Local"
 msgstr ""
 
-#: ardour_ui2.cc:110
+#: gtk2_ardour/ardour_ui2.cc:110
 msgid "MMC ID"
 msgstr "MMC идентификатор"
 
-#: ardour_ui2.cc:291
+#: gtk2_ardour/ardour_ui2.cc:291
 msgid "Play from playhead"
 msgstr "Воспроизвести от указателя"
 
-#: ardour_ui2.cc:292
+#: gtk2_ardour/ardour_ui2.cc:292
 msgid "Stop playback"
 msgstr "Стоп"
 
-#: ardour_ui2.cc:293
+#: gtk2_ardour/ardour_ui2.cc:293
 #, fuzzy
 msgid "Play range/selection"
 msgstr "Воспроизвести выделенное"
 
-#: ardour_ui2.cc:294
+#: gtk2_ardour/ardour_ui2.cc:294
 msgid "Go to start of session"
 msgstr "В начало сессии"
 
-#: ardour_ui2.cc:295
+#: gtk2_ardour/ardour_ui2.cc:295
 msgid "Go to end of session"
 msgstr "В конец сессии"
 
-#: ardour_ui2.cc:296
+#: gtk2_ardour/ardour_ui2.cc:296
 msgid "Play loop range"
 msgstr "Воспроизвести \"кольцо\""
 
-#: ardour_ui2.cc:297
+#: gtk2_ardour/ardour_ui2.cc:297
 msgid "Return to last playback start when stopped"
 msgstr "Вернуться к точке начала воспроизведения"
 
-#: ardour_ui2.cc:298
+#: gtk2_ardour/ardour_ui2.cc:298
 msgid "Start playback after any locate"
 msgstr ""
 
-#: ardour_ui2.cc:299
+#: gtk2_ardour/ardour_ui2.cc:299
 msgid "Be sensible about input monitoring"
 msgstr ""
 
-#: ardour_ui2.cc:300
+#: gtk2_ardour/ardour_ui2.cc:300
 msgid "Start recording at auto-punch start"
 msgstr "Начать запись с начала \"авто-врезки\""
 
-#: ardour_ui2.cc:301
+#: gtk2_ardour/ardour_ui2.cc:301
 msgid "Stop recording at auto-punch end"
 msgstr "Остановить запись в конце \"авто-врезки\""
 
-#: ardour_ui2.cc:302
+#: gtk2_ardour/ardour_ui2.cc:302
 msgid "Enable/Disable audio click"
 msgstr "Вкл./Выкл. метроном"
 
-#: ardour_ui2.cc:303
+#: gtk2_ardour/ardour_ui2.cc:303
 msgid "Positional sync source"
 msgstr ""
 
-#: ardour_ui2.cc:304
+#: gtk2_ardour/ardour_ui2.cc:304
 msgid "Does Ardour control the time?"
 msgstr ""
 
-#: ardour_ui2.cc:305
+#: gtk2_ardour/ardour_ui2.cc:305
 msgid "Shuttle speed control"
 msgstr ""
 
-#: ardour_ui2.cc:306
+#: gtk2_ardour/ardour_ui2.cc:306
 #, c-format
 msgid "Select semitones or %%-age for speed display"
 msgstr ""
 
-#: ardour_ui2.cc:307
+#: gtk2_ardour/ardour_ui2.cc:307
 msgid "Current transport speed"
 msgstr "Текщаяя скорсть транспорта"
 
-#: ardour_ui2.cc:330
+#: gtk2_ardour/ardour_ui2.cc:330
 msgid "Primary clock"
 msgstr "Основной счётчик"
 
-#: ardour_ui2.cc:331
+#: gtk2_ardour/ardour_ui2.cc:331
 msgid "secondary clock"
 msgstr "дополнительный счётчик"
 
-#. XXX: this should really be saved in instant.xml or something similar and restored from there
-#. Combo's are stupid - they steal space from the entry for the button
-#: ardour_ui2.cc:388 ardour_ui2.cc:833 ardour_ui2.cc:846 ardour_ui2.cc:909
-#: ardour_ui2.cc:911
+#: gtk2_ardour/ardour_ui2.cc:388 gtk2_ardour/ardour_ui2.cc:849
+#: gtk2_ardour/ardour_ui2.cc:862 gtk2_ardour/ardour_ui2.cc:925
+#: gtk2_ardour/ardour_ui2.cc:927
 msgid "sprung"
 msgstr ""
 
-#: ardour_ui2.cc:389 ardour_ui2.cc:835 ardour_ui2.cc:857
+#: gtk2_ardour/ardour_ui2.cc:389 gtk2_ardour/ardour_ui2.cc:851
+#: gtk2_ardour/ardour_ui2.cc:873
 msgid "wheel"
 msgstr ""
 
-#: ardour_ui2.cc:451
+#: gtk2_ardour/ardour_ui2.cc:467
 msgid "ardour: clock"
 msgstr "ardour: счётчик"
 
-#: ardour_ui2.cc:596
+#: gtk2_ardour/ardour_ui2.cc:612
 msgid "Maximum speed"
-msgstr ""
+msgstr "Макс. скорость"
 
-#: ardour_ui2.cc:823
-msgid "st"
-msgstr ""
+#: gtk2_ardour/ardour_ui2.cc:839
+#, fuzzy
+msgid "ST"
+msgstr "УСТАНОВИТЬ"
+
+#: gtk2_ardour/ardour_ui2.cc:883 gtk2_ardour/ardour_ui2.cc:906
+#, fuzzy
+msgid "stop"
+msgstr "Стоп"
 
-#: ardour_ui2.cc:867 ardour_ui2.cc:890 ardour_ui2.cc:907
-msgid "stopped"
-msgstr "остановлено"
+#: gtk2_ardour/ardour_ui2.cc:923
+msgid "-0.55"
+msgstr "-0.55"
 
-#: ardour_ui_dialogs.cc:153 playlist_selector.cc:70
+#: gtk2_ardour/ardour_ui_dialogs.cc:145 gtk2_ardour/playlist_selector.cc:70
 #, fuzzy
 msgid "close"
 msgstr "Закрыть"
 
-#: ardour_ui_dialogs.cc:360 ardour_ui_ed.cc:184
-#, fuzzy
+#: gtk2_ardour/ardour_ui_dialogs.cc:352 gtk2_ardour/ardour_ui_ed.cc:184
 msgid "Sound File Browser"
-msgstr "Аудио-библиотека"
+msgstr "Аудиобиблиотека"
 
-#. menus + submenus that need action items
-#: ardour_ui_ed.cc:72
+#: gtk2_ardour/ardour_ui_ed.cc:72
 msgid "Session"
 msgstr "Сессия"
 
-#: ardour_ui_ed.cc:73 ardour_ui_ed.cc:130 editor.cc:1836 export_dialog.cc:350
-#: export_dialog.cc:1059 export_dialog.cc:1063
+#: gtk2_ardour/ardour_ui_ed.cc:73 gtk2_ardour/ardour_ui_ed.cc:130
+#: gtk2_ardour/editor.cc:1786 gtk2_ardour/export_dialog.cc:350
+#: gtk2_ardour/export_dialog.cc:1059 gtk2_ardour/export_dialog.cc:1063
 msgid "Export"
-msgstr "Экспорт"
+msgstr "Экспортировать"
 
-#: ardour_ui_ed.cc:74
+#: gtk2_ardour/ardour_ui_ed.cc:74
 msgid "Cleanup"
-msgstr "Очист��а"
+msgstr "Очист��ть"
 
-#: ardour_ui_ed.cc:75 option_editor.cc:126
+#: gtk2_ardour/ardour_ui_ed.cc:75 gtk2_ardour/option_editor.cc:125
 msgid "Sync"
 msgstr "Синхр."
 
-#: ardour_ui_ed.cc:76 ardour_ui_ed.cc:77
-#, fuzzy
+#: gtk2_ardour/ardour_ui_ed.cc:76 gtk2_ardour/ardour_ui_ed.cc:77
 msgid "Options"
-msgstr "��едактор параметров"
+msgstr "��араметры"
 
-#: ardour_ui_ed.cc:78
+#: gtk2_ardour/ardour_ui_ed.cc:78
 msgid "Help"
-msgstr ""
+msgstr "Справка"
 
-#: ardour_ui_ed.cc:79
+#: gtk2_ardour/ardour_ui_ed.cc:79
 msgid "KeyMouse Actions"
-msgstr ""
+msgstr "Горячие клавиши"
 
-#: ardour_ui_ed.cc:80
-#, fuzzy
+#: gtk2_ardour/ardour_ui_ed.cc:80
 msgid "Audio File Format"
-msgstr "��удио кадры"
+msgstr "��ормат звуковых файлов"
 
-#: ardour_ui_ed.cc:81
-#, fuzzy
+#: gtk2_ardour/ardour_ui_ed.cc:81
 msgid "Header"
-msgstr "��ред фейдер"
+msgstr "��аголовок"
 
-#: ardour_ui_ed.cc:82
+#: gtk2_ardour/ardour_ui_ed.cc:82
 msgid "Data"
-msgstr ""
+msgstr "Данные"
 
-#: ardour_ui_ed.cc:83
-#, fuzzy
+#: gtk2_ardour/ardour_ui_ed.cc:83
 msgid "Control Surfaces"
-msgstr "Контрольные выходы"
+msgstr ""
 
-#. the real actions
-#: ardour_ui_ed.cc:87 audio_time_axis.cc:1854 new_session_dialog.cc:529
+#: gtk2_ardour/ardour_ui_ed.cc:87 gtk2_ardour/route_time_axis.cc:1139
+#: gtk2_ardour/new_session_dialog.cc:546
 msgid "New"
-msgstr "Новый"
+msgstr "Новая"
 
-#: ardour_ui_ed.cc:89 new_session_dialog.cc:517
+#: gtk2_ardour/ardour_ui_ed.cc:89 gtk2_ardour/new_session_dialog.cc:533
 msgid "Open"
 msgstr "Открыть"
 
-#: ardour_ui_ed.cc:90
+#: gtk2_ardour/ardour_ui_ed.cc:90
 msgid "Recent"
 msgstr "Последние"
 
-#: ardour_ui_ed.cc:91 io_selector.cc:58 io_selector.cc:792
+#: gtk2_ardour/ardour_ui_ed.cc:91 gtk2_ardour/io_selector.cc:60
+#: gtk2_ardour/io_selector.cc:794 gtk2_ardour/connection_editor.cc:59
 msgid "Close"
 msgstr "Закрыть"
 
-#: ardour_ui_ed.cc:94 route_params_ui.cc:514
+#: gtk2_ardour/ardour_ui_ed.cc:94 gtk2_ardour/route_params_ui.cc:510
 msgid "Add Track/Bus"
-msgstr "Добавить ��рек/Шину"
+msgstr "Добавить ��орожку/Шину"
 
-#: ardour_ui_ed.cc:105
+#: gtk2_ardour/ardour_ui_ed.cc:105
 msgid "Connect"
 msgstr "Соединить"
 
-#. </CMT Additions>
-#: ardour_ui_ed.cc:113
+#: gtk2_ardour/ardour_ui_ed.cc:113
 msgid "Snapshot"
 msgstr "Снимок"
 
-#: ardour_ui_ed.cc:116
+#: gtk2_ardour/ardour_ui_ed.cc:116
 msgid "Save Template..."
 msgstr "Сохранить шаблон..."
 
-#: ardour_ui_ed.cc:119
+#: gtk2_ardour/ardour_ui_ed.cc:119
 msgid "Export session to audiofile..."
 msgstr "Экспорт сессии в аудиофайл..."
 
-#: ardour_ui_ed.cc:122
-#, fuzzy
+#: gtk2_ardour/ardour_ui_ed.cc:122
 msgid "Export selection to audiofile..."
-msgstr "Экспорт сессии в аудиофайл..."
+msgstr "Экспорт выделение в аудиофайл..."
 
-#: ardour_ui_ed.cc:126
-#, fuzzy
+#: gtk2_ardour/ardour_ui_ed.cc:126
 msgid "Export range markers to audiofile..."
-msgstr "Экспорт сессии в аудиофайл..."
+msgstr "Экспортировать маркеры области в аудиофайл..."
 
-#: ardour_ui_ed.cc:133
+#: gtk2_ardour/ardour_ui_ed.cc:133
 msgid "Cleanup unused sources"
-msgstr ""
+msgstr "Очистить неиспользуемые источники"
 
-#: ardour_ui_ed.cc:135
+#: gtk2_ardour/ardour_ui_ed.cc:135
 msgid "Flush wastebasket"
 msgstr "Очистить корзину"
 
-#: ardour_ui_ed.cc:141 ardour_ui_options.cc:408 ardour_ui_options.cc:417
-#: ardour_ui_options.cc:489
+#: gtk2_ardour/ardour_ui_ed.cc:141 gtk2_ardour/ardour_ui_options.cc:425
+#: gtk2_ardour/ardour_ui_options.cc:434 gtk2_ardour/ardour_ui_options.cc:507
 msgid "JACK"
 msgstr "JACK"
 
-#: ardour_ui_ed.cc:142
+#: gtk2_ardour/ardour_ui_ed.cc:142
 msgid "Latency"
-msgstr ""
+msgstr "Задержка отклика"
 
-#: ardour_ui_ed.cc:144
-#, fuzzy
+#: gtk2_ardour/ardour_ui_ed.cc:144
 msgid "Reconnect"
-msgstr "��оединить"
+msgstr "��ересоединиться"
 
-#: ardour_ui_ed.cc:147 mixer_strip.cc:497 mixer_strip.cc:565
+#: gtk2_ardour/ardour_ui_ed.cc:147 gtk2_ardour/mixer_strip.cc:498
+#: gtk2_ardour/mixer_strip.cc:561
 msgid "Disconnect"
-msgstr "Отсоединить"
+msgstr "Отсоединиться"
 
-#: ardour_ui_ed.cc:174
+#: gtk2_ardour/ardour_ui_ed.cc:174
 msgid "Windows"
 msgstr "Окна"
 
-#: ardour_ui_ed.cc:175
+#: gtk2_ardour/ardour_ui_ed.cc:175
 msgid "start prefix"
 msgstr ""
 
-#: ardour_ui_ed.cc:176
+#: gtk2_ardour/ardour_ui_ed.cc:176
 msgid "Quit"
 msgstr "Выйти"
 
-#. windows visibility actions
-#: ardour_ui_ed.cc:180
+#: gtk2_ardour/ardour_ui_ed.cc:180
 msgid "Maximise Editor Space"
-msgstr ""
+msgstr "Редактор на полный экран"
 
-#: ardour_ui_ed.cc:182
-#, fuzzy
+#: gtk2_ardour/ardour_ui_ed.cc:182
 msgid "Show Editor"
-msgstr "�едактор"
+msgstr "��оказать редактор"
 
-#: ardour_ui_ed.cc:183
-#, fuzzy
+#: gtk2_ardour/ardour_ui_ed.cc:183
 msgid "Show Mixer"
-msgstr "�икшер"
+msgstr "��оказать микшер"
 
-#: ardour_ui_ed.cc:185
+#: gtk2_ardour/ardour_ui_ed.cc:185
 msgid "Options Editor"
 msgstr "Редактор параметров"
 
-#: ardour_ui_ed.cc:186
-#, fuzzy
+#: gtk2_ardour/ardour_ui_ed.cc:186
 msgid "Track/Bus Inspector"
-msgstr "��реки/Шины"
+msgstr "��нспектор дорожек/шин"
 
-#: ardour_ui_ed.cc:188
+#: gtk2_ardour/ardour_ui_ed.cc:188 gtk2_ardour/connection_editor.cc:147
+#: gtk2_ardour/connection_editor.cc:148
 msgid "Connections"
 msgstr "Соединения"
 
-#: ardour_ui_ed.cc:190
+#: gtk2_ardour/ardour_ui_ed.cc:190
 msgid "Locations"
 msgstr "Интервалы"
 
-#: ardour_ui_ed.cc:192
+#: gtk2_ardour/ardour_ui_ed.cc:192
 msgid "Big Clock"
 msgstr "Большой счётчик"
 
-#: ardour_ui_ed.cc:194
+#: gtk2_ardour/ardour_ui_ed.cc:194
 msgid "About"
 msgstr "О программе"
 
-#: ardour_ui_ed.cc:195
-#, fuzzy
+#: gtk2_ardour/ardour_ui_ed.cc:195
 msgid "Colors"
-msgstr "Цвет"
+msgstr "Цвета"
 
-#: ardour_ui_ed.cc:197
-#, fuzzy
+#: gtk2_ardour/ardour_ui_ed.cc:197
 msgid "Add Audio Track"
-msgstr "Добавить ��рек/Шину"
+msgstr "Добавить ��вуковую дорожку"
 
-#: ardour_ui_ed.cc:199
-#, fuzzy
+#: gtk2_ardour/ardour_ui_ed.cc:199
 msgid "Add Audio Bus"
-msgstr "��крыть все аудиошины"
+msgstr "��обавить звуковую шину"
 
-#: ardour_ui_ed.cc:201
+#: gtk2_ardour/ardour_ui_ed.cc:201
 msgid "Save"
 msgstr "Сохранить"
 
-#: ardour_ui_ed.cc:203 editor_actions.cc:255
+#: gtk2_ardour/ardour_ui_ed.cc:203 gtk2_ardour/editor_actions.cc:257
 #, fuzzy
 msgid "Remove Last Capture"
 msgstr "Удалить последнюю запись"
 
-#. do-nothing action for the "transport" menu bar item
-#: ardour_ui_ed.cc:210
-#, fuzzy
+#: gtk2_ardour/ardour_ui_ed.cc:210
 msgid "Transport"
-msgstr "Triangular"
+msgstr "Транспорт"
 
-#. these two are not used by key bindings, instead use ToggleRoll for that. these two do show up in
-#. menus and via button proxies.
-#.
-#: ardour_ui_ed.cc:216 sfdb_ui.cc:57
+#: gtk2_ardour/ardour_ui_ed.cc:216 gtk2_ardour/sfdb_ui.cc:60
 msgid "Stop"
 msgstr "Стоп"
 
-#: ardour_ui_ed.cc:219
+#: gtk2_ardour/ardour_ui_ed.cc:219
 msgid "Roll"
 msgstr ""
 
-#: ardour_ui_ed.cc:223
-#, fuzzy
+#: gtk2_ardour/ardour_ui_ed.cc:223
 msgid "Start/Stop"
-msgstr "��ачало:"
+msgstr "��тарт/Стоп"
 
-#: ardour_ui_ed.cc:226
+#: gtk2_ardour/ardour_ui_ed.cc:226
 msgid "Stop + Forget Capture"
-msgstr ""
+msgstr "Стоп+ Забыть захват"
 
-#: ardour_ui_ed.cc:229
-#, fuzzy
+#: gtk2_ardour/ardour_ui_ed.cc:229
 msgid "Play Loop Range"
-msgstr "Воспроизвести \"кольцо\""
+msgstr "Воспроизвести петлю"
 
-#: ardour_ui_ed.cc:232
-#, fuzzy
+#: gtk2_ardour/ardour_ui_ed.cc:232
 msgid "Play Selection"
-msgstr "Воспроизвести выделен��ую область"
+msgstr "Воспроизвести выделен��е"
 
-#: ardour_ui_ed.cc:236
-#, fuzzy
+#: gtk2_ardour/ardour_ui_ed.cc:236
 msgid "Enable Record"
-msgstr "�апись"
+msgstr "��азрешить запись"
 
-#: ardour_ui_ed.cc:239
-#, fuzzy
+#: gtk2_ardour/ardour_ui_ed.cc:239
 msgid "Rewind"
-msgstr "��бласть"
+msgstr "��еремотать назад"
 
-#: ardour_ui_ed.cc:242
+#: gtk2_ardour/ardour_ui_ed.cc:242
 msgid "Rewind (Slow)"
-msgstr ""
+msgstr "Перемотать назад (медленно)"
 
-#: ardour_ui_ed.cc:245
+#: gtk2_ardour/ardour_ui_ed.cc:245
 msgid "Rewind (Fast)"
-msgstr ""
+msgstr "Перемотать назад (быстро)"
 
-#: ardour_ui_ed.cc:248
+#: gtk2_ardour/ardour_ui_ed.cc:248
 msgid "Forward"
-msgstr ""
+msgstr "Перемотать вперёд"
 
-#: ardour_ui_ed.cc:251
+#: gtk2_ardour/ardour_ui_ed.cc:251
 msgid "Forward (Slow)"
-msgstr ""
+msgstr "Перемотать вперёд (медленно)"
 
-#: ardour_ui_ed.cc:254
+#: gtk2_ardour/ardour_ui_ed.cc:254
 msgid "Forward (Fast)"
-msgstr ""
+msgstr "Перемотать вперёд (быстро)"
 
-#: ardour_ui_ed.cc:257
+#: gtk2_ardour/ardour_ui_ed.cc:257
 msgid "Goto Zero"
-msgstr ""
+msgstr "К нулевой отметке"
 
-#: ardour_ui_ed.cc:260
-#, fuzzy
+#: gtk2_ardour/ardour_ui_ed.cc:260
 msgid "Goto Start"
-msgstr "��ачало:"
+msgstr "�� началу"
 
-#: ardour_ui_ed.cc:263
+#: gtk2_ardour/ardour_ui_ed.cc:263
 msgid "Goto End"
-msgstr ""
-
-#. XXX the newline in the displayed names of these action is really wrong, but its because we want the button
-#. that proxies for these action to be more compact. It would be nice to find a way to override the action
-#. name appearance on the buttons.
-#.
-#: ardour_ui_ed.cc:272
-#, fuzzy
-msgid ""
-"Punch\n"
-"in"
-msgstr ""
-"врезка\n"
-"до"
-
-#: ardour_ui_ed.cc:275
-#, fuzzy
-msgid ""
-"Punch\n"
-"out"
-msgstr ""
-"врезка\n"
-"после"
-
-#: ardour_ui_ed.cc:278 option_editor.cc:129
-msgid "Click"
-msgstr "Метроном"
+msgstr "В конец"
 
-#: ardour_ui_ed.cc:281
-#, fuzzy
-msgid ""
-"Auto\n"
-"input"
-msgstr ""
-"авто\n"
-"вход"
-
-#: ardour_ui_ed.cc:284
-#, fuzzy
-msgid ""
-"Auto\n"
-"play"
-msgstr ""
-"авто\n"
-"воспр."
+#: gtk2_ardour/ardour_ui_ed.cc:279
+msgid "Auto Play"
+msgstr "Автовоспроизведение"
 
-#: ardour_ui_ed.cc:287
-#, fuzzy
-msgid ""
-"Auto\n"
-"return"
-msgstr ""
-"авто\n"
-"возврат"
+#: gtk2_ardour/ardour_ui_ed.cc:286
+msgid "Sync startup to video"
+msgstr "Синхронизировать начало с видео"
 
-#: ardour_ui_ed.cc:291
+#: gtk2_ardour/ardour_ui_ed.cc:287
 #, fuzzy
-msgid ""
-"Time\n"
-"master"
+msgid "Time master"
 msgstr "JACK-счётчик - мастер"
 
-#: ardour_ui_ed.cc:294
+#: gtk2_ardour/ardour_ui_ed.cc:290
 msgid "Toggle Record Enable Track1"
 msgstr ""
 
-#: ardour_ui_ed.cc:296
+#: gtk2_ardour/ardour_ui_ed.cc:292
 msgid "Toggle Record Enable Track2"
 msgstr ""
 
-#: ardour_ui_ed.cc:298
+#: gtk2_ardour/ardour_ui_ed.cc:294
 msgid "Toggle Record Enable Track3"
 msgstr ""
 
-#: ardour_ui_ed.cc:300
+#: gtk2_ardour/ardour_ui_ed.cc:296
 msgid "Toggle Record Enable Track4"
 msgstr ""
 
-#: ardour_ui_ed.cc:302
+#: gtk2_ardour/ardour_ui_ed.cc:298
 msgid "Toggle Record Enable Track5"
 msgstr ""
 
-#: ardour_ui_ed.cc:304
+#: gtk2_ardour/ardour_ui_ed.cc:300
 msgid "Toggle Record Enable Track6"
 msgstr ""
 
-#: ardour_ui_ed.cc:306
+#: gtk2_ardour/ardour_ui_ed.cc:302
 msgid "Toggle Record Enable Track7"
 msgstr ""
 
-#: ardour_ui_ed.cc:308
+#: gtk2_ardour/ardour_ui_ed.cc:304
 msgid "Toggle Record Enable Track8"
 msgstr ""
 
-#: ardour_ui_ed.cc:310
+#: gtk2_ardour/ardour_ui_ed.cc:306
 msgid "Toggle Record Enable Track9"
 msgstr ""
 
-#: ardour_ui_ed.cc:312
+#: gtk2_ardour/ardour_ui_ed.cc:308
 msgid "Toggle Record Enable Track10"
 msgstr ""
 
-#: ardour_ui_ed.cc:314
+#: gtk2_ardour/ardour_ui_ed.cc:310
 msgid "Toggle Record Enable Track11"
 msgstr ""
 
-#: ardour_ui_ed.cc:316
+#: gtk2_ardour/ardour_ui_ed.cc:312
 msgid "Toggle Record Enable Track12"
 msgstr ""
 
-#: ardour_ui_ed.cc:318
+#: gtk2_ardour/ardour_ui_ed.cc:314
 msgid "Toggle Record Enable Track13"
 msgstr ""
 
-#: ardour_ui_ed.cc:320
+#: gtk2_ardour/ardour_ui_ed.cc:316
 msgid "Toggle Record Enable Track14"
 msgstr ""
 
-#: ardour_ui_ed.cc:322
+#: gtk2_ardour/ardour_ui_ed.cc:318
 msgid "Toggle Record Enable Track15"
 msgstr ""
 
-#: ardour_ui_ed.cc:324
+#: gtk2_ardour/ardour_ui_ed.cc:320
 msgid "Toggle Record Enable Track16"
 msgstr ""
 
-#: ardour_ui_ed.cc:326
+#: gtk2_ardour/ardour_ui_ed.cc:322
 msgid "Toggle Record Enable Track17"
 msgstr ""
 
-#: ardour_ui_ed.cc:328
+#: gtk2_ardour/ardour_ui_ed.cc:324
 msgid "Toggle Record Enable Track18"
 msgstr ""
 
-#: ardour_ui_ed.cc:330
+#: gtk2_ardour/ardour_ui_ed.cc:326
 msgid "Toggle Record Enable Track19"
 msgstr ""
 
-#: ardour_ui_ed.cc:332
+#: gtk2_ardour/ardour_ui_ed.cc:328
 msgid "Toggle Record Enable Track20"
 msgstr ""
 
-#: ardour_ui_ed.cc:334
+#: gtk2_ardour/ardour_ui_ed.cc:330
 msgid "Toggle Record Enable Track21"
 msgstr ""
 
-#: ardour_ui_ed.cc:336
+#: gtk2_ardour/ardour_ui_ed.cc:332
 msgid "Toggle Record Enable Track22"
 msgstr ""
 
-#: ardour_ui_ed.cc:338
+#: gtk2_ardour/ardour_ui_ed.cc:334
 msgid "Toggle Record Enable Track23"
 msgstr ""
 
-#: ardour_ui_ed.cc:340
+#: gtk2_ardour/ardour_ui_ed.cc:336
 msgid "Toggle Record Enable Track24"
 msgstr ""
 
-#: ardour_ui_ed.cc:342
+#: gtk2_ardour/ardour_ui_ed.cc:338
 msgid "Toggle Record Enable Track25"
 msgstr ""
 
-#: ardour_ui_ed.cc:344
+#: gtk2_ardour/ardour_ui_ed.cc:340
 msgid "Toggle Record Enable Track26"
 msgstr ""
 
-#: ardour_ui_ed.cc:346
+#: gtk2_ardour/ardour_ui_ed.cc:342
 msgid "Toggle Record Enable Track27"
 msgstr ""
 
-#: ardour_ui_ed.cc:348
+#: gtk2_ardour/ardour_ui_ed.cc:344
 msgid "Toggle Record Enable Track28"
 msgstr ""
 
-#: ardour_ui_ed.cc:350
+#: gtk2_ardour/ardour_ui_ed.cc:346
 msgid "Toggle Record Enable Track29"
 msgstr ""
 
-#: ardour_ui_ed.cc:352
+#: gtk2_ardour/ardour_ui_ed.cc:348
 msgid "Toggle Record Enable Track30"
 msgstr ""
 
-#: ardour_ui_ed.cc:354
+#: gtk2_ardour/ardour_ui_ed.cc:350
 msgid "Toggle Record Enable Track31"
 msgstr ""
 
-#: ardour_ui_ed.cc:356
+#: gtk2_ardour/ardour_ui_ed.cc:352
 msgid "Toggle Record Enable Track32"
 msgstr ""
 
-#: ardour_ui_ed.cc:361
+#: gtk2_ardour/ardour_ui_ed.cc:357
 msgid "Percentage"
 msgstr "Процентов"
 
-#: ardour_ui_ed.cc:362
+#: gtk2_ardour/ardour_ui_ed.cc:358
 msgid "Semitones"
 msgstr "Полутонов"
 
-#: ardour_ui_ed.cc:366
+#: gtk2_ardour/ardour_ui_ed.cc:362
 msgid "Send MTC"
-msgstr "Передача MTC"
+msgstr "Передавать MTC"
 
-#: ardour_ui_ed.cc:368
+#: gtk2_ardour/ardour_ui_ed.cc:364
 msgid "Send MMC"
-msgstr "Передача MMC"
+msgstr "Передавать MMC"
 
-#: ardour_ui_ed.cc:370
-#, fuzzy
+#: gtk2_ardour/ardour_ui_ed.cc:366
 msgid "Use MMC"
-msgstr "��ередача MMC"
+msgstr "��спользовать MMC"
 
-#: ardour_ui_ed.cc:372
+#: gtk2_ardour/ardour_ui_ed.cc:368
 msgid "Send MIDI feedback"
-msgstr ""
+msgstr "Передавать отклик MIDI"
 
-#: ardour_ui_ed.cc:374
-#, fuzzy
+#: gtk2_ardour/ardour_ui_ed.cc:370
 msgid "Use MIDI control"
-msgstr "MMC порт"
+msgstr "Использовать управление по MIDI"
 
-#: ardour_ui_ed.cc:377
-#, fuzzy
+#: gtk2_ardour/ardour_ui_ed.cc:373
 msgid "Connect new track inputs to hardware"
-msgstr "��втоподсоединение новых треков"
+msgstr "��одключать входы новых дорожек к устройству"
 
-#: ardour_ui_ed.cc:396
-#, fuzzy
+#: gtk2_ardour/ardour_ui_ed.cc:392
 msgid "Connect new track outputs to hardware"
-msgstr "��втоподсоединение новых треков"
+msgstr "��одключать выходы новых дорожек к устройству"
 
-#: ardour_ui_ed.cc:398
-#, fuzzy
+#: gtk2_ardour/ardour_ui_ed.cc:394
 msgid "Connect new track outputs to master"
-msgstr "��втоматическое подключение треков к мастер-выходам"
+msgstr "��одключать выходы новых дорожек к мастеру"
 
-#: ardour_ui_ed.cc:400
-#, fuzzy
+#: gtk2_ardour/ardour_ui_ed.cc:396
 msgid "Manually connect new track outputs"
-msgstr "ручное подключение треков к выходам"
+msgstr "Ручное подключение дорожек к выходам"
 
-#: ardour_ui_ed.cc:405
-#, fuzzy
+#: gtk2_ardour/ardour_ui_ed.cc:401
 msgid "Hardware monitoring"
 msgstr "Аппаратный контроль"
 
-#: ardour_ui_ed.cc:406
-#, fuzzy
+#: gtk2_ardour/ardour_ui_ed.cc:402
 msgid "Software monitoring"
-msgstr "��спользовать программный контроль"
+msgstr "�рограммный контроль"
 
-#: ardour_ui_ed.cc:407
-#, fuzzy
+#: gtk2_ardour/ardour_ui_ed.cc:403
 msgid "External monitoring"
-msgstr "��ппаратный контроль"
+msgstr "��нешний контроль"
 
-#. Configuration object options (i.e. not session specific)
-#: ardour_ui_ed.cc:411
+#: gtk2_ardour/ardour_ui_ed.cc:407
 msgid "Stop plugins with transport"
-msgstr "Останавливать модули (plugins) вместе с транспортом"
+msgstr "Останавливать расширения с транспортом"
 
-#: ardour_ui_ed.cc:412
-#, fuzzy
+#: gtk2_ardour/ardour_ui_ed.cc:408
 msgid "Verify remove last capture"
-msgstr "��далить последнюю запись"
+msgstr "��роверить удаление последней записи"
 
-#: ardour_ui_ed.cc:413
+#: gtk2_ardour/ardour_ui_ed.cc:409
 msgid "Stop recording on xrun"
 msgstr "Остановить запись при потере отсчётов"
 
-#: ardour_ui_ed.cc:414
-#, fuzzy
+#: gtk2_ardour/ardour_ui_ed.cc:410
 msgid "Stop transport at session end"
 msgstr "Останавливать транспорт в конце сессии"
 
-#: ardour_ui_ed.cc:415
+#: gtk2_ardour/ardour_ui_ed.cc:411
 msgid "-12dB gain reduce ffwd/rewind"
 msgstr ""
 
-#: ardour_ui_ed.cc:416
+#: gtk2_ardour/ardour_ui_ed.cc:412
 msgid "Rec-enable stays engaged at stop"
 msgstr ""
 
-#. session options
-#: ardour_ui_ed.cc:420
+#: gtk2_ardour/ardour_ui_ed.cc:416
 #, fuzzy
 msgid "Do not run plugins while recording"
 msgstr "Использовать модули (plugins) во время записи"
 
-#: ardour_ui_ed.cc:423
+#: gtk2_ardour/ardour_ui_ed.cc:419
 msgid "Latched solo"
 msgstr ""
 
-#: ardour_ui_ed.cc:428
+#: gtk2_ardour/ardour_ui_ed.cc:424
 #, fuzzy
 msgid "Solo in-place"
 msgstr "Соло"
 
-#: ardour_ui_ed.cc:430
+#: gtk2_ardour/ardour_ui_ed.cc:426
 msgid "Solo via bus"
 msgstr ""
 
-#: ardour_ui_ed.cc:433
+#: gtk2_ardour/ardour_ui_ed.cc:429
 #, fuzzy
 msgid "Automatically create crossfades"
 msgstr "Автоматический кроссфейд на перекрытии"
 
-#: ardour_ui_ed.cc:435
+#: gtk2_ardour/ardour_ui_ed.cc:431
 msgid "Unmute new full crossfades"
 msgstr ""
 
-#: ardour_ui_options.cc:406 ardour_ui_options.cc:416 ardour_ui_options.cc:483
+#: gtk2_ardour/ardour_ui_options.cc:423 gtk2_ardour/ardour_ui_options.cc:433
+#: gtk2_ardour/ardour_ui_options.cc:501
 #, fuzzy
 msgid "Internal"
 msgstr "внутренний"
 
-#: ardour_ui_options.cc:407 ardour_ui_options.cc:486
+#: gtk2_ardour/ardour_ui_options.cc:424 gtk2_ardour/ardour_ui_options.cc:504
 #, fuzzy
 msgid "MTC"
 msgstr "MMC"
 
-#: audio_clock.cc:1742 editor.cc:188
+#: gtk2_ardour/audio_clock.cc:1742 gtk2_ardour/editor.cc:189
 msgid "SMPTE"
 msgstr "SMPTE"
 
-#: audio_clock.cc:1743 editor.cc:187 editor_rulers.cc:360
+#: gtk2_ardour/audio_clock.cc:1743 gtk2_ardour/editor.cc:188
+#: gtk2_ardour/editor_rulers.cc:359
 msgid "Bars:Beats"
 msgstr "Такт:Доля"
 
-#: audio_clock.cc:1744
+#: gtk2_ardour/audio_clock.cc:1744
 msgid "Minutes:Seconds"
 msgstr "Минуты:Секунды"
 
-#: audio_clock.cc:1745
+#: gtk2_ardour/audio_clock.cc:1745
 msgid "Audio Frames"
 msgstr "Аудио кадры"
 
-#.
-#. Slowest = 6.6dB/sec falloff at update rate of 40ms
-#. Slow    = 6.8dB/sec falloff at update rate of 40ms
-#.
-#: audio_clock.cc:1746 editor_actions.cc:375 editor_actions.cc:383
-#: gain_meter.cc:172 panner_ui.cc:89 plugin_ui.cc:392 plugin_ui.cc:635
+#: gtk2_ardour/audio_clock.cc:1746 gtk2_ardour/editor_actions.cc:379
+#: gtk2_ardour/editor_actions.cc:387 gtk2_ardour/gain_meter.cc:167
+#: gtk2_ardour/ladspa_pluginui.cc:330 gtk2_ardour/ladspa_pluginui.cc:573
+#: gtk2_ardour/panner_ui.cc:87
 msgid "Off"
 msgstr "Выкл"
 
-#: audio_clock.cc:1748
+#: gtk2_ardour/audio_clock.cc:1748
 msgid "Mode"
 msgstr "Режим"
 
-#: audio_time_axis.cc:91
+#: gtk2_ardour/route_time_axis.cc:86
 msgid "m"
 msgstr "т"
 
-#: audio_time_axis.cc:91
+#: gtk2_ardour/route_time_axis.cc:86
 msgid "s"
 msgstr "с"
 
-#: audio_time_axis.cc:91
+#: gtk2_ardour/route_time_axis.cc:86
 msgid "r"
 msgstr "з"
 
-#: audio_time_axis.cc:95
+#: gtk2_ardour/route_time_axis.cc:90
 msgid "g"
 msgstr "г"
 
-#. group
-#: audio_time_axis.cc:96
+#: gtk2_ardour/route_time_axis.cc:91
 msgid "p"
 msgstr "сп"
 
-#: audio_time_axis.cc:97 automation_time_axis.cc:32 visual_time_axis.cc:74
+#: gtk2_ardour/route_time_axis.cc:92 gtk2_ardour/automation_time_axis.cc:33
+#: gtk2_ardour/visual_time_axis.cc:74
 msgid "h"
 msgstr "в"
 
-#. height
-#: audio_time_axis.cc:98
+#: gtk2_ardour/route_time_axis.cc:93
 msgid "a"
 msgstr "а"
 
-#: audio_time_axis.cc:99 visual_time_axis.cc:73
+#: gtk2_ardour/route_time_axis.cc:94 gtk2_ardour/visual_time_axis.cc:73
 msgid "v"
 msgstr "п"
 
-#: audio_time_axis.cc:168 mixer_strip.cc:86
+#: gtk2_ardour/route_time_axis.cc:138 gtk2_ardour/mixer_strip.cc:83
 msgid "Record"
 msgstr "Запись"
 
-#: audio_time_axis.cc:169 editor_actions.cc:37 mixer_strip.cc:86
+#: gtk2_ardour/route_time_axis.cc:146 gtk2_ardour/editor_actions.cc:37
+#: gtk2_ardour/mixer_strip.cc:83
 msgid "Solo"
 msgstr "Соло"
 
-#: audio_time_axis.cc:170 editor.cc:1760 editor.cc:1859 mixer_strip.cc:86
-#: panner_ui.cc:427
+#: gtk2_ardour/route_time_axis.cc:147 gtk2_ardour/editor.cc:1710
+#: gtk2_ardour/editor.cc:1809 gtk2_ardour/mixer_strip.cc:83
+#: gtk2_ardour/panner_ui.cc:417
 msgid "Mute"
 msgstr "Тихо"
 
-#: audio_time_axis.cc:171
+#: gtk2_ardour/route_time_axis.cc:148
 msgid "Edit Group"
 msgstr "Группы"
 
-#: audio_time_axis.cc:172 visual_time_axis.cc:92
+#: gtk2_ardour/route_time_axis.cc:149 gtk2_ardour/visual_time_axis.cc:92
 msgid "Display Height"
 msgstr "Высота дорожки"
 
-#: audio_time_axis.cc:173
+#: gtk2_ardour/route_time_axis.cc:150
 msgid "Playlist"
 msgstr "Список"
 
-#: audio_time_axis.cc:174 audio_time_axis.cc:741
+#: gtk2_ardour/route_time_axis.cc:151 gtk2_ardour/route_time_axis.cc:428
 msgid "Automation"
 msgstr "Автомат"
 
-#: audio_time_axis.cc:175 visual_time_axis.cc:93
+#: gtk2_ardour/route_time_axis.cc:152 gtk2_ardour/visual_time_axis.cc:93
 msgid "Visual options"
 msgstr "Параметры отображения"
 
-#: audio_time_axis.cc:176 visual_time_axis.cc:94
+#: gtk2_ardour/route_time_axis.cc:153 gtk2_ardour/visual_time_axis.cc:94
 msgid "Hide this track"
 msgstr "Скрыть трек"
 
-#: audio_time_axis.cc:333 mixer_strip.cc:927
+#: gtk2_ardour/route_time_axis.cc:272 gtk2_ardour/mixer_strip.cc:887
 msgid "No group"
 msgstr "Нет группы"
 
-#: audio_time_axis.cc:702 automation_time_axis.cc:450
-#: imageframe_time_axis.cc:255 marker_time_axis.cc:211
-msgid "Height"
-msgstr "Высота"
-
-#: audio_time_axis.cc:703 color_manager.cc:41 imageframe_time_axis.cc:256
-#: marker_time_axis.cc:212
-msgid "Color"
-msgstr "Цвет"
-
-#: audio_time_axis.cc:707
-msgid "Hide all crossfades"
-msgstr ""
-
-#: audio_time_axis.cc:708
-msgid "Show all crossfades"
-msgstr ""
-
-#: audio_time_axis.cc:712 mixer_strip.cc:1011
-#, fuzzy
-msgid "Remote Control ID"
-msgstr "использовать контрольные выходы"
-
-#: audio_time_axis.cc:718
+#: gtk2_ardour/route_time_axis.cc:389
 #, fuzzy
 msgid "Show all automation"
 msgstr "автомат"
 
-#: audio_time_axis.cc:721
+#: gtk2_ardour/route_time_axis.cc:392
 #, fuzzy
 msgid "Show existing automation"
 msgstr "использовать имеющийся шаблон"
 
-#: audio_time_axis.cc:724
+#: gtk2_ardour/route_time_axis.cc:395
 #, fuzzy
 msgid "Hide all automation"
 msgstr "очистить интервалы"
 
-#: audio_time_axis.cc:729
-#, fuzzy
-msgid "Fader"
-msgstr "Затухание"
-
-#: audio_time_axis.cc:734
-#, fuzzy
-msgid "Pan"
-msgstr "пан."
-
-#: audio_time_axis.cc:739
+#: gtk2_ardour/route_time_axis.cc:398
 msgid "Plugins"
 msgstr "Модули (плагины)"
 
-#: audio_time_axis.cc:747
-msgid "Show waveforms"
-msgstr "Отображать форму сигнала"
-
-#: audio_time_axis.cc:755
-msgid "Traditional"
-msgstr "Обычная"
+#: gtk2_ardour/route_time_axis.cc:419 gtk2_ardour/automation_time_axis.cc:426
+#: gtk2_ardour/imageframe_time_axis.cc:255 gtk2_ardour/marker_time_axis.cc:211
+msgid "Height"
+msgstr "Высота"
 
-#: audio_time_axis.cc:758
-msgid "Rectified"
-msgstr "Увеличенная"
+#: gtk2_ardour/route_time_axis.cc:420 gtk2_ardour/color_manager.cc:41
+#: gtk2_ardour/imageframe_time_axis.cc:256 gtk2_ardour/marker_time_axis.cc:212
+msgid "Color"
+msgstr "Цвет"
 
-#: audio_time_axis.cc:761
-msgid "Waveform"
-msgstr "Форма сигнала"
+#: gtk2_ardour/route_time_axis.cc:425 gtk2_ardour/mixer_strip.cc:971
+#, fuzzy
+msgid "Remote Control ID"
+msgstr "использовать контрольные выходы"
 
-#: audio_time_axis.cc:771
+#: gtk2_ardour/route_time_axis.cc:443
 #, fuzzy
 msgid "Align with existing material"
 msgstr "Существующий материал"
 
-#: audio_time_axis.cc:776
+#: gtk2_ardour/route_time_axis.cc:449
 #, fuzzy
 msgid "Align with capture time"
 msgstr "Время записи"
 
-#: audio_time_axis.cc:782
+#: gtk2_ardour/route_time_axis.cc:455
 #, fuzzy
 msgid "Alignment"
 msgstr "Выровнять"
 
-#: audio_time_axis.cc:788 editor.cc:527 editor_actions.cc:60
-#: mixer_strip.cc:1000 mixer_ui.cc:111
+#: gtk2_ardour/route_time_axis.cc:462 gtk2_ardour/editor.cc:480
+#: gtk2_ardour/editor_actions.cc:62 gtk2_ardour/mixer_strip.cc:960
+#: gtk2_ardour/mixer_ui.cc:109
 msgid "Active"
-msgstr "Актив��н"
+msgstr "Актив��ы"
 
-#: audio_time_axis.cc:793 editor.cc:1922 editor_actions.cc:320
-#: editor_markers.cc:508 imageframe_time_axis.cc:259 location_ui.cc:57
-#: marker_time_axis.cc:215 mixer_strip.cc:1014
+#: gtk2_ardour/route_time_axis.cc:467 gtk2_ardour/editor.cc:1872
+#: gtk2_ardour/editor_actions.cc:322 gtk2_ardour/editor_markers.cc:511
+#: gtk2_ardour/imageframe_time_axis.cc:259 gtk2_ardour/location_ui.cc:58
+#: gtk2_ardour/marker_time_axis.cc:215 gtk2_ardour/mixer_strip.cc:974
 msgid "Remove"
 msgstr "Удалить"
 
-#: audio_time_axis.cc:833
+#: gtk2_ardour/route_time_axis.cc:733
 #, fuzzy
 msgid "Name for playlist"
 msgstr "Имя снимка"
 
-#: audio_time_axis.cc:835 audio_time_axis.cc:1851 editor_markers.cc:827
-#: editor_mouse.cc:4673 imageframe_time_axis.cc:248 marker_time_axis.cc:208
-#: meter_bridge_strip.cc:224 mixer_strip.cc:998 redirect_box.cc:751
-#: redirect_box.cc:1065 route_ui.cc:739 visual_time_axis.cc:326
+#: gtk2_ardour/route_time_axis.cc:735 gtk2_ardour/route_time_axis.cc:1136
+#: gtk2_ardour/editor_markers.cc:830 gtk2_ardour/editor_mouse.cc:4723
+#: gtk2_ardour/imageframe_time_axis.cc:248 gtk2_ardour/marker_time_axis.cc:208
+#: gtk2_ardour/mixer_strip.cc:958 gtk2_ardour/redirect_box.cc:752
+#: gtk2_ardour/redirect_box.cc:1080 gtk2_ardour/route_ui.cc:746
+#: gtk2_ardour/visual_time_axis.cc:326
 msgid "Rename"
 msgstr "Переименовать"
 
-#: audio_time_axis.cc:868 audio_time_axis.cc:908
+#: gtk2_ardour/route_time_axis.cc:770 gtk2_ardour/route_time_axis.cc:811
 #, fuzzy
 msgid "Name for Playlist"
 msgstr "Имя снимка"
 
-#: audio_time_axis.cc:1126 visual_time_axis.cc:383
+#: gtk2_ardour/route_time_axis.cc:990 gtk2_ardour/visual_time_axis.cc:383
 msgid "a track already exists with that name"
-msgstr "трек с таким именем уже существует"
-
-#: audio_time_axis.cc:1167 editor.cc:218
-msgid "gain"
-msgstr "усил."
-
-#: audio_time_axis.cc:1207
-msgid "pan"
-msgstr "пан."
-
-#: audio_time_axis.cc:1410 editor.cc:1483 selection.cc:634
-msgid "programming error: "
-msgstr "ошибка в программе: "
+msgstr "Дорожка с таким именем уже существует"
 
-#: audio_time_axis.cc:1848
+#: gtk2_ardour/route_time_axis.cc:1133
 msgid "Current: %1"
 msgstr ""
 
-#: audio_time_axis.cc:1855
+#: gtk2_ardour/route_time_axis.cc:1140
 msgid "New Copy"
 msgstr "Новая копия"
 
-#: audio_time_axis.cc:1857
+#: gtk2_ardour/route_time_axis.cc:1142
 msgid "Clear Current"
 msgstr "Очистить текущий"
 
-#: audio_time_axis.cc:1859 editor.cc:2024 editor.cc:2100
+#: gtk2_ardour/route_time_axis.cc:1144 gtk2_ardour/editor.cc:1974
+#: gtk2_ardour/editor.cc:2050
 msgid "Select"
-msgstr "Выделеннное"
+msgstr "Выделить"
+
+#: gtk2_ardour/route_time_axis.cc:1333 gtk2_ardour/editor.cc:1432
+#: gtk2_ardour/selection.cc:642
+msgid "programming error: "
+msgstr "Ошибка в программе: "
+
+#: gtk2_ardour/audio_time_axis.cc:229
+msgid "Fader"
+msgstr "Фейдер"
+
+#: gtk2_ardour/audio_time_axis.cc:234
+msgid "Pan"
+msgstr "Пан."
+
+#: gtk2_ardour/audio_time_axis.cc:249
+msgid "Hide all crossfades"
+msgstr "Скрыть все кроссфейды"
+
+#: gtk2_ardour/audio_time_axis.cc:250
+msgid "Show all crossfades"
+msgstr "Показать все кроссфейды"
+
+#: gtk2_ardour/audio_time_axis.cc:257
+msgid "Show waveforms"
+msgstr "Показывать форму сигнала"
+
+#: gtk2_ardour/audio_time_axis.cc:265
+msgid "Traditional"
+msgstr "Обычная"
+
+#: gtk2_ardour/audio_time_axis.cc:268
+msgid "Rectified"
+msgstr "Увеличенная"
+
+#: gtk2_ardour/audio_time_axis.cc:271
+msgid "Waveform"
+msgstr "Форма сигнала"
+
+#: gtk2_ardour/audio_time_axis.cc:331
+msgid "gain"
+msgstr "усил."
+
+#: gtk2_ardour/audio_time_axis.cc:371
+msgid "pan"
+msgstr "пан."
 
-#: automation_line.cc:884
+#: gtk2_ardour/automation_line.cc:888
 #, fuzzy
 msgid "automation event move"
 msgstr "автомат"
 
-#: automation_line.cc:886
+#: gtk2_ardour/automation_line.cc:890
 #, fuzzy
 msgid "automation range drag"
 msgstr "автомат"
 
-#: automation_line.cc:1015 region_gain_line.cc:62
+#: gtk2_ardour/automation_line.cc:1019 gtk2_ardour/region_gain_line.cc:64
 #, fuzzy
 msgid "remove control point"
 msgstr "использовать контрольные выходы"
 
-#: automation_time_axis.cc:33 editor_ops.cc:2885
+#: gtk2_ardour/automation_time_axis.cc:34 gtk2_ardour/editor_ops.cc:2922
 msgid "clear"
 msgstr "очистить"
 
-#: automation_time_axis.cc:75
+#: gtk2_ardour/automation_time_axis.cc:79
 msgid "track height"
-msgstr ""
+msgstr "Высота дорожки"
 
-#: automation_time_axis.cc:76
-#, fuzzy
+#: gtk2_ardour/automation_time_axis.cc:80
 msgid "automation state"
-msgstr "��втомат"
+msgstr "��остояние автоматизации"
 
-#: automation_time_axis.cc:77
-#, fuzzy
+#: gtk2_ardour/automation_time_axis.cc:81
 msgid "clear track"
-msgstr "��крыть трек"
+msgstr "��чистить дорожку"
 
-#: automation_time_axis.cc:78
-#, fuzzy
+#: gtk2_ardour/automation_time_axis.cc:82
 msgid "hide track"
-msgstr "Скрыть трек"
+msgstr "Скрыть дорожку"
 
-#: automation_time_axis.cc:184 automation_time_axis.cc:213
-#: automation_time_axis.cc:461
+#: gtk2_ardour/automation_time_axis.cc:188
+#: gtk2_ardour/automation_time_axis.cc:217
+#: gtk2_ardour/automation_time_axis.cc:437
 msgid "Manual"
 msgstr ""
 
-#: automation_time_axis.cc:186 automation_time_axis.cc:224
-#: automation_time_axis.cc:465 editor.cc:2001 editor.cc:2082 gain_meter.cc:174
-#: panner_ui.cc:91 plugin_ui.cc:395 plugin_ui.cc:637 sfdb_ui.cc:56
+#: gtk2_ardour/automation_time_axis.cc:190
+#: gtk2_ardour/automation_time_axis.cc:228
+#: gtk2_ardour/automation_time_axis.cc:441 gtk2_ardour/editor.cc:1951
+#: gtk2_ardour/editor.cc:2032 gtk2_ardour/gain_meter.cc:169
+#: gtk2_ardour/ladspa_pluginui.cc:333 gtk2_ardour/ladspa_pluginui.cc:575
+#: gtk2_ardour/panner_ui.cc:89 gtk2_ardour/sfdb_ui.cc:59
 msgid "Play"
 msgstr "Воспроизвести"
 
-#: automation_time_axis.cc:188 automation_time_axis.cc:235
-#: automation_time_axis.cc:469 gain_meter.cc:176 panner_ui.cc:93
-#: plugin_ui.cc:398 plugin_ui.cc:639
-#, fuzzy
+#: gtk2_ardour/automation_time_axis.cc:192
+#: gtk2_ardour/automation_time_axis.cc:239
+#: gtk2_ardour/automation_time_axis.cc:445 gtk2_ardour/gain_meter.cc:171
+#: gtk2_ardour/ladspa_pluginui.cc:336 gtk2_ardour/ladspa_pluginui.cc:577
+#: gtk2_ardour/panner_ui.cc:91
 msgid "Write"
-msgstr "��апись"
+msgstr "��аписать"
 
-#: automation_time_axis.cc:190 automation_time_axis.cc:246
-#: automation_time_axis.cc:473 gain_meter.cc:178 panner_ui.cc:95
-#: plugin_ui.cc:401 plugin_ui.cc:641
+#: gtk2_ardour/automation_time_axis.cc:194
+#: gtk2_ardour/automation_time_axis.cc:250
+#: gtk2_ardour/automation_time_axis.cc:449 gtk2_ardour/gain_meter.cc:173
+#: gtk2_ardour/ladspa_pluginui.cc:339 gtk2_ardour/ladspa_pluginui.cc:579
+#: gtk2_ardour/panner_ui.cc:93
 #, fuzzy
 msgid "Touch"
 msgstr "Врезка"
 
-#: automation_time_axis.cc:257 option_editor.cc:183 option_editor.cc:189
-#: plugin_ui.cc:404
+#: gtk2_ardour/automation_time_axis.cc:261 gtk2_ardour/ladspa_pluginui.cc:342
 msgid "???"
-msgstr ""
+msgstr "???"
 
-#: automation_time_axis.cc:271
-#, fuzzy
+#: gtk2_ardour/automation_time_axis.cc:275
 msgid "clear automation"
-msgstr "��чистить интервалы"
+msgstr "��чистить автоматизацию"
 
-#: automation_time_axis.cc:452 editor_actions.cc:318
+#: gtk2_ardour/automation_time_axis.cc:428 gtk2_ardour/editor_actions.cc:320
 msgid "Hide"
 msgstr "Скрыть"
 
-#: automation_time_axis.cc:454 crossfade_edit.cc:78 redirect_box.cc:1057
+#: gtk2_ardour/automation_time_axis.cc:430 gtk2_ardour/crossfade_edit.cc:79
+#: gtk2_ardour/redirect_box.cc:1072 gtk2_ardour/connection_editor.cc:57
 msgid "Clear"
 msgstr "Очистить"
 
-#: automation_time_axis.cc:477
-#, fuzzy
+#: gtk2_ardour/automation_time_axis.cc:453
 msgid "State"
-msgstr "��ачало"
+msgstr "��остояние"
 
-#: canvas-imageframe.c:104
+#: gtk2_ardour/canvas-imageframe.c:104
 msgid "pixbuf"
-msgstr ""
+msgstr "pixbuf"
 
-#: canvas-imageframe.c:105
+#: gtk2_ardour/canvas-imageframe.c:105
 msgid "the pixbuf"
-msgstr ""
+msgstr "the pixbuf"
 
-#: canvas-imageframe.c:110
+#: gtk2_ardour/canvas-imageframe.c:110
 msgid "x"
-msgstr ""
+msgstr "x"
 
-#: canvas-imageframe.c:111 canvas-simpleline.c:111 canvas-simplerect.c:107
+#: gtk2_ardour/canvas-imageframe.c:111 gtk2_ardour/canvas-simpleline.c:111
+#: gtk2_ardour/canvas-simplerect.c:107
 msgid "x coordinate of upper left corner of rect"
 msgstr ""
 
-#: canvas-imageframe.c:120
+#: gtk2_ardour/canvas-imageframe.c:120
 msgid "y"
 msgstr ""
 
-#: canvas-imageframe.c:121 canvas-simpleline.c:121 canvas-simplerect.c:117
+#: gtk2_ardour/canvas-imageframe.c:121 gtk2_ardour/canvas-simpleline.c:121
+#: gtk2_ardour/canvas-simplerect.c:117
 msgid "y coordinate of upper left corner of rect "
 msgstr ""
 
-#: canvas-imageframe.c:129
+#: gtk2_ardour/canvas-imageframe.c:129
 #, fuzzy
 msgid "width"
 msgstr "запись"
 
-#: canvas-imageframe.c:130
+#: gtk2_ardour/canvas-imageframe.c:130
 msgid "the width"
 msgstr ""
 
-#: canvas-imageframe.c:139
+#: gtk2_ardour/canvas-imageframe.c:139
 msgid "drawwidth"
 msgstr ""
 
-#: canvas-imageframe.c:140
+#: gtk2_ardour/canvas-imageframe.c:140
 msgid "drawn width"
 msgstr ""
 
-#: canvas-imageframe.c:148
+#: gtk2_ardour/canvas-imageframe.c:148
 #, fuzzy
 msgid "height"
 msgstr "Высота"
 
-#: canvas-imageframe.c:149
+#: gtk2_ardour/canvas-imageframe.c:149
 #, fuzzy
 msgid "the height"
 msgstr "Высота"
 
-#: canvas-imageframe.c:157
+#: gtk2_ardour/canvas-imageframe.c:157
 msgid "anchor"
 msgstr ""
 
-#: canvas-imageframe.c:158
+#: gtk2_ardour/canvas-imageframe.c:158
 msgid "the anchor"
 msgstr ""
 
-#: canvas-simpleline.c:110 canvas-simplerect.c:106
+#: gtk2_ardour/canvas-simpleline.c:110 gtk2_ardour/canvas-simplerect.c:106
 msgid "x1"
 msgstr ""
 
-#: canvas-simpleline.c:120 canvas-simplerect.c:116
+#: gtk2_ardour/canvas-simpleline.c:120 gtk2_ardour/canvas-simplerect.c:116
 msgid "y1"
 msgstr ""
 
-#: canvas-simpleline.c:131 canvas-simplerect.c:127
+#: gtk2_ardour/canvas-simpleline.c:131 gtk2_ardour/canvas-simplerect.c:127
 msgid "x2"
 msgstr ""
 
-#: canvas-simpleline.c:132 canvas-simplerect.c:128
+#: gtk2_ardour/canvas-simpleline.c:132 gtk2_ardour/canvas-simplerect.c:128
 msgid "x coordinate of lower right corner of rect"
 msgstr ""
 
-#: canvas-simpleline.c:141 canvas-simplerect.c:137
+#: gtk2_ardour/canvas-simpleline.c:141 gtk2_ardour/canvas-simplerect.c:137
 msgid "y2"
 msgstr ""
 
-#: canvas-simpleline.c:142 canvas-simplerect.c:138
+#: gtk2_ardour/canvas-simpleline.c:142 gtk2_ardour/canvas-simplerect.c:138
 msgid "y coordinate of lower right corner of rect "
 msgstr ""
 
-#: canvas-simpleline.c:150
+#: gtk2_ardour/canvas-simpleline.c:150
 msgid "color rgba"
 msgstr ""
 
-#: canvas-simpleline.c:151
+#: gtk2_ardour/canvas-simpleline.c:151
 #, fuzzy
 msgid "color of line"
 msgstr "линейное"
 
-#: canvas-simplerect.c:148
+#: gtk2_ardour/canvas-simplerect.c:148
 msgid "outline pixels"
 msgstr ""
 
-#: canvas-simplerect.c:149
+#: gtk2_ardour/canvas-simplerect.c:149
 msgid "width in pixels of outline"
 msgstr ""
 
-#: canvas-simplerect.c:159
+#: gtk2_ardour/canvas-simplerect.c:159
 msgid "outline what"
 msgstr ""
 
-#: canvas-simplerect.c:160
+#: gtk2_ardour/canvas-simplerect.c:160
 msgid "which boundaries to outline (mask)"
 msgstr ""
 
-#: canvas-simplerect.c:171
+#: gtk2_ardour/canvas-simplerect.c:171
 msgid "fill"
 msgstr ""
 
-#: canvas-simplerect.c:172
+#: gtk2_ardour/canvas-simplerect.c:172
 #, fuzzy
 msgid "fill rectangle"
 msgstr "Закольцевать выделенное"
 
-#: canvas-simplerect.c:179
+#: gtk2_ardour/canvas-simplerect.c:179
 msgid "draw"
 msgstr ""
 
-#: canvas-simplerect.c:180
+#: gtk2_ardour/canvas-simplerect.c:180
 msgid "draw rectangle"
 msgstr ""
 
-#: canvas-simplerect.c:188
+#: gtk2_ardour/canvas-simplerect.c:188
 msgid "outline color rgba"
 msgstr ""
 
-#: canvas-simplerect.c:189
+#: gtk2_ardour/canvas-simplerect.c:189
 msgid "color of outline"
 msgstr ""
 
-#: canvas-simplerect.c:199
+#: gtk2_ardour/canvas-simplerect.c:199
 msgid "fill color rgba"
 msgstr ""
 
-#: canvas-simplerect.c:200
+#: gtk2_ardour/canvas-simplerect.c:200
 msgid "color of fill"
-msgstr ""
+msgstr "Цвет заливки"
 
-#: color_manager.cc:40
-#, fuzzy
+#: gtk2_ardour/color_manager.cc:40
 msgid "Object"
-msgstr "�бъект"
+msgstr "�бъект"
 
-#: color_manager.cc:78
+#: gtk2_ardour/color_manager.cc:78
 #, fuzzy
 msgid "cannot open color definition file %1: %2"
 msgstr "не удалось отобразить заставку (файл \"%1\")"
 
-#: crossfade_edit.cc:75
-#, fuzzy
+#: gtk2_ardour/crossfade_edit.cc:76
 msgid "ardour: x-fade edit"
-msgstr "ardour: редактор"
+msgstr "ardour: редактор кроссфейдов"
 
-#: crossfade_edit.cc:79 panner_ui.cc:443
-#, fuzzy
+#: gtk2_ardour/crossfade_edit.cc:80 gtk2_ardour/panner_ui.cc:433
 msgid "Reset"
-msgstr "��громная"
+msgstr "��бросить"
 
-#: crossfade_edit.cc:80
-#, fuzzy
+#: gtk2_ardour/crossfade_edit.cc:81
 msgid "Fade"
-msgstr "��атухание"
+msgstr "��ейд"
 
-#: crossfade_edit.cc:81
-#, fuzzy
+#: gtk2_ardour/crossfade_edit.cc:82
 msgid "Out (dry)"
-msgstr "в %d"
+msgstr ""
 
-#: crossfade_edit.cc:82
-#, fuzzy
+#: gtk2_ardour/crossfade_edit.cc:83
 msgid "Out"
-msgstr "Выходов"
+msgstr ""
 
-#: crossfade_edit.cc:83
-#, fuzzy
+#: gtk2_ardour/crossfade_edit.cc:84
 msgid "In (dry)"
-msgstr "в %d"
+msgstr ""
 
-#: crossfade_edit.cc:84
+#: gtk2_ardour/crossfade_edit.cc:85
 msgid "In"
 msgstr ""
 
-#: crossfade_edit.cc:86
+#: gtk2_ardour/crossfade_edit.cc:87
 #, fuzzy
 msgid "With Pre-roll"
 msgstr "откат"
 
-#: crossfade_edit.cc:87
+#: gtk2_ardour/crossfade_edit.cc:88
 #, fuzzy
 msgid "With Post-roll"
 msgstr "накат"
 
-#: crossfade_edit.cc:95
-#, fuzzy
+#: gtk2_ardour/crossfade_edit.cc:96
 msgid "Fade In"
-msgstr "��атухание"
+msgstr "��арастание"
 
-#: crossfade_edit.cc:96
-#, fuzzy
+#: gtk2_ardour/crossfade_edit.cc:97
 msgid "Fade Out"
 msgstr "Затухание"
 
-#: crossfade_edit.cc:172 editor.cc:1835 editor_actions.cc:316
-#: option_editor.cc:130
+#: gtk2_ardour/crossfade_edit.cc:173 gtk2_ardour/editor.cc:1785
+#: gtk2_ardour/editor_actions.cc:318 gtk2_ardour/option_editor.cc:129
 msgid "Audition"
-msgstr "��удит"
+msgstr "��онтроль"
 
-#: editor.cc:104 editor.cc:3616
-msgid "Slide"
+#: gtk2_ardour/editor.cc:105 gtk2_ardour/editor.cc:3521
+#, fuzzy
+msgid "Slide Edit"
 msgstr "Скольжение"
 
-#: editor.cc:105 editor.cc:3614
-msgid "Splice"
+#: gtk2_ardour/editor.cc:106 gtk2_ardour/editor.cc:3519
+#, fuzzy
+msgid "Splice Edit"
 msgstr "Стыковка"
 
-#. note that this menu list starts at zero, not 1, because zero
-#. is a valid, if useless, ID.
-#.
-#. leave some breathing room
-#: editor.cc:110 editor.cc:3671 export_dialog.cc:78 export_dialog.cc:92
-#: export_dialog.cc:893 export_dialog.cc:1225 route_ui.cc:437
+#: gtk2_ardour/editor.cc:111 gtk2_ardour/editor.cc:3576
+#: gtk2_ardour/editor_actions.cc:417 gtk2_ardour/export_dialog.cc:78
+#: gtk2_ardour/export_dialog.cc:92 gtk2_ardour/export_dialog.cc:893
+#: gtk2_ardour/export_dialog.cc:1225 gtk2_ardour/route_ui.cc:438
 msgid "None"
 msgstr "Нет"
 
-#: editor.cc:111 editor.cc:3659
-#, fuzzy
+#: gtk2_ardour/editor.cc:112 gtk2_ardour/editor.cc:3564
 msgid "CD Frames"
-msgstr "��адр"
+msgstr "��ыборка CD"
 
-#: editor.cc:112 editor.cc:3661
-#, fuzzy
+#: gtk2_ardour/editor.cc:113 gtk2_ardour/editor.cc:3566
 msgid "SMPTE Frames"
-msgstr "SMPTE ��адры/Секунды"
+msgstr "SMPTE ��адры"
 
-#: editor.cc:113 editor.cc:3663
-#, fuzzy
+#: gtk2_ardour/editor.cc:114 gtk2_ardour/editor.cc:3568
 msgid "SMPTE Seconds"
-msgstr "SMPTE Кадры/Секунды"
+msgstr "SMPTE секунды"
 
-#: editor.cc:114 editor.cc:3665
+#: gtk2_ardour/editor.cc:115 gtk2_ardour/editor.cc:3570
 msgid "SMPTE Minutes"
-msgstr ""
+msgstr "SMPTE минуты"
 
-#: editor.cc:115 editor.cc:3667
-#, fuzzy
+#: gtk2_ardour/editor.cc:116 gtk2_ardour/editor.cc:3572
 msgid "Seconds"
-msgstr "��инуты:Секунды"
+msgstr "��екунд"
 
-#: editor.cc:116 editor.cc:3669
-#, fuzzy
+#: gtk2_ardour/editor.cc:117 gtk2_ardour/editor.cc:3574
 msgid "Minutes"
-msgstr "��лавные выходы"
+msgstr "��инут"
 
-#: editor.cc:117 editor.cc:3641
+#: gtk2_ardour/editor.cc:118 gtk2_ardour/editor.cc:3546
 msgid "Beats/32"
 msgstr "долям/32"
 
-#: editor.cc:118 editor.cc:3639
+#: gtk2_ardour/editor.cc:119 gtk2_ardour/editor.cc:3544
 msgid "Beats/16"
 msgstr "долям/16"
 
-#: editor.cc:119 editor.cc:3637
+#: gtk2_ardour/editor.cc:120 gtk2_ardour/editor.cc:3542
 msgid "Beats/8"
 msgstr "долям/8"
 
-#: editor.cc:120 editor.cc:3635
+#: gtk2_ardour/editor.cc:121 gtk2_ardour/editor.cc:3540
 msgid "Beats/4"
 msgstr "долям/4"
 
-#: editor.cc:121 editor.cc:3633
+#: gtk2_ardour/editor.cc:122 gtk2_ardour/editor.cc:3538
 msgid "Beats/3"
 msgstr "долям/3"
 
-#: editor.cc:122 editor.cc:3643
+#: gtk2_ardour/editor.cc:123 gtk2_ardour/editor.cc:3548
 msgid "Beats"
 msgstr "долям"
 
-#: editor.cc:123 editor.cc:3645
+#: gtk2_ardour/editor.cc:124 gtk2_ardour/editor.cc:3550
 msgid "Bars"
 msgstr "тактам"
 
-#: editor.cc:124 editor.cc:3647
+#: gtk2_ardour/editor.cc:125 gtk2_ardour/editor.cc:3552
 msgid "Marks"
 msgstr "маркерам"
 
-#: editor.cc:125 editor.cc:144 editor.cc:3649 editor.cc:3715
+#: gtk2_ardour/editor.cc:126 gtk2_ardour/editor.cc:3554
 msgid "Edit Cursor"
 msgstr "курсору"
 
-#: editor.cc:126 editor.cc:3651
+#: gtk2_ardour/editor.cc:127 gtk2_ardour/editor.cc:3556
 msgid "Region starts"
 msgstr "нач. областей"
 
-#: editor.cc:127 editor.cc:3653
+#: gtk2_ardour/editor.cc:128 gtk2_ardour/editor.cc:3558
 msgid "Region ends"
 msgstr "оконч. областей"
 
-#: editor.cc:128 editor.cc:3657
+#: gtk2_ardour/editor.cc:129 gtk2_ardour/editor.cc:3562
 msgid "Region syncs"
 msgstr ""
 
-#: editor.cc:129 editor.cc:3655
+#: gtk2_ardour/editor.cc:130 gtk2_ardour/editor.cc:3560
 msgid "Region bounds"
 msgstr ""
 
-#: editor.cc:135 editor.cc:3690
-msgid "Magnetic"
+#: gtk2_ardour/editor.cc:135 gtk2_ardour/editor.cc:3593
+#, fuzzy
+msgid "Normal Snap"
+msgstr "Норм."
+
+#: gtk2_ardour/editor.cc:136 gtk2_ardour/editor.cc:3595
+#, fuzzy
+msgid "Magnetic Snap"
 msgstr "Магн."
 
-#: editor.cc:140 editor.cc:3707 export_dialog.cc:140 export_dialog.cc:156
-#: export_dialog.cc:1068 export_dialog.cc:1072
-msgid "Left"
-msgstr "��ев. краю"
+#: gtk2_ardour/editor.cc:141 gtk2_ardour/editor.cc:3612
+#, fuzzy
+msgid "Focus Left"
+msgstr "��асштабировать к"
 
-#: editor.cc:141 editor.cc:3709 export_dialog.cc:141 export_dialog.cc:157
-msgid "Right"
-msgstr "прав. краю"
+#: gtk2_ardour/editor.cc:142 gtk2_ardour/editor.cc:3614
+#, fuzzy
+msgid "Focus Right"
+msgstr "Масштабировать к"
+
+#: gtk2_ardour/editor.cc:143 gtk2_ardour/editor.cc:3616
+#, fuzzy
+msgid "Focus Center"
+msgstr "Масштабировать к"
 
-#: editor.cc:142 editor.cc:3711
-msgid "Center"
-msgstr "центру"
+#: gtk2_ardour/editor.cc:144
+#, fuzzy
+msgid "Focus Play"
+msgstr "Масштабировать к"
 
-#: editor.cc:143 editor.cc:3713
-msgid "Playhead"
-msgstr "указателю"
+#: gtk2_ardour/editor.cc:145
+#, fuzzy
+msgid "Focus Edit"
+msgstr "Масштабировать к"
 
-#. time display buttons
-#: editor.cc:186
+#: gtk2_ardour/editor.cc:187
 msgid "Mins:Secs"
 msgstr "Мин:Сек"
 
-#: editor.cc:189 editor_rulers.cc:354
+#: gtk2_ardour/editor.cc:190 gtk2_ardour/editor_rulers.cc:353
 msgid "Frames"
-msgstr "Кадр"
+msgstr "Кадры"
 
-#: editor.cc:190 editor_rulers.cc:374
+#: gtk2_ardour/editor.cc:191 gtk2_ardour/editor_rulers.cc:373
 msgid "Tempo"
 msgstr "Темп"
 
-#: editor.cc:191 editor_rulers.cc:368
+#: gtk2_ardour/editor.cc:192 gtk2_ardour/editor_rulers.cc:367
 msgid "Meter"
 msgstr "Размер"
 
-#: editor.cc:192 editor_rulers.cc:380
+#: gtk2_ardour/editor.cc:193 gtk2_ardour/editor_rulers.cc:379
 msgid "Location Markers"
 msgstr "Маркеры интервалов"
 
-#: editor.cc:193 editor_rulers.cc:386
+#: gtk2_ardour/editor.cc:194 gtk2_ardour/editor_rulers.cc:385
 msgid "Range Markers"
-msgstr ""
+msgstr "Маркеры областей"
 
-#: editor.cc:194 editor_rulers.cc:392
+#: gtk2_ardour/editor.cc:195 gtk2_ardour/editor_rulers.cc:391
 msgid "Loop/Punch Ranges"
-msgstr ""
-
-#: editor.cc:216
-msgid "range"
-msgstr "выделять"
-
-#: editor.cc:217
-msgid "object"
-msgstr "объект"
-
-#: editor.cc:219
-msgid "zoom"
-msgstr "масштаб"
-
-#: editor.cc:220
-msgid "timefx"
-msgstr "эффект"
+msgstr "Области колец/врезок"
 
-#: editor.cc:221
-msgid "listen"
-msgstr ""
-
-#: editor.cc:223
+#: gtk2_ardour/editor.cc:213
 msgid "mode"
 msgstr "режим"
 
-#: editor.cc:224
+#: gtk2_ardour/editor.cc:214
 msgid "automation"
 msgstr "автомат"
 
-#: editor.cc:226
-msgid "Edit Mode"
-msgstr "Режим редактирования"
-
-#: editor.cc:227 editor_actions.cc:284
-msgid "Snap To"
-msgstr "Привязка к"
-
-#: editor.cc:228
-msgid "Snap Mode"
-msgstr "Привязка к"
-
-#: editor.cc:229
-msgid "Zoom Focus"
-msgstr "Масштабировать к"
-
-#. </CMT Additions>
-#. nudge
-#: editor.cc:237 editor.cc:1900 editor.cc:2066 editor.cc:2122
-msgid "Nudge"
-msgstr ""
-
-#: editor.cc:470
-msgid "Zoom in"
-msgstr "Увеличить"
-
-#: editor.cc:471
-msgid "Zoom out"
-msgstr "Уменьшить"
-
-#: editor.cc:474
-msgid "Zoom to session"
-msgstr "Показать всё"
-
-#: editor.cc:489
-msgid "Zoom Span"
-msgstr "Область просмотра"
-
-#: editor.cc:502 editor.cc:528 editor_actions.cc:62 mixer_ui.cc:86
-#: mixer_ui.cc:112
-#, fuzzy
+#: gtk2_ardour/editor.cc:455 gtk2_ardour/editor.cc:481
+#: gtk2_ardour/editor_actions.cc:64 gtk2_ardour/mixer_ui.cc:84
+#: gtk2_ardour/mixer_ui.cc:110 gtk2_ardour/analysis_window.cc:64
 msgid "Visible"
-msgstr "��тображать"
+msgstr "��идимы"
 
-#: editor.cc:503 editor.cc:526
-#, fuzzy
+#: gtk2_ardour/editor.cc:456 gtk2_ardour/editor.cc:479
 msgid "Name"
-msgstr "��адр"
+msgstr "��мя"
 
-#: editor.cc:602 editor.cc:669
-#, fuzzy
+#: gtk2_ardour/editor.cc:555 gtk2_ardour/editor.cc:622
 msgid "Regions"
-msgstr "Область"
+msgstr "Области"
 
-#: editor.cc:642 editor.cc:681
+#: gtk2_ardour/editor.cc:595 gtk2_ardour/editor.cc:634
 msgid "Chunks"
 msgstr "Фрагменты"
 
-#: editor.cc:672
-#, fuzzy
+#: gtk2_ardour/editor.cc:625
 msgid "Tracks/Busses"
-msgstr "��реки/Шины"
+msgstr "��орожки/Шины"
 
-#: editor.cc:675
+#: gtk2_ardour/editor.cc:628
 msgid "Snapshots"
 msgstr "Снимки"
 
-#: editor.cc:678
+#: gtk2_ardour/editor.cc:631
 msgid "Edit Groups"
 msgstr ""
 "Ред.\n"
 "группы"
 
-#: editor.cc:727
-msgid "Nudge region/selection forwards"
+#: gtk2_ardour/editor.cc:680
+msgid "Nudge Region/Selection Forwards"
 msgstr ""
 
-#: editor.cc:728
-msgid "Nudge region/selection backwards"
-msgstr ""
+#: gtk2_ardour/editor.cc:681
+#, fuzzy
+msgid "Nudge Region/Selection Backwards"
+msgstr "Скрыть трек"
 
-#: editor.cc:735 editor_mixer.cc:299
+#: gtk2_ardour/editor.cc:688 gtk2_ardour/editor_mixer.cc:296
 msgid "ardour: editor"
 msgstr "ardour: редактор"
 
-#: editor.cc:736
+#: gtk2_ardour/editor.cc:689
 msgid "ardour_editor"
 msgstr "ardour_редактор"
 
-#: editor.cc:1183
+#: gtk2_ardour/editor.cc:1122
 msgid "ardour: editor: "
 msgstr "ardour: редактор: "
 
-#. force name
-#: editor.cc:1268 editor.cc:1277 editor_markers.cc:870
+#: gtk2_ardour/editor.cc:1208 gtk2_ardour/editor.cc:1217
+#: gtk2_ardour/editor_markers.cc:874
 msgid "Loop"
 msgstr "Кольцо"
 
-#. force name
-#: editor.cc:1282 editor.cc:1291 editor_markers.cc:896
+#: gtk2_ardour/editor.cc:1222 gtk2_ardour/editor.cc:1231
+#: gtk2_ardour/editor_markers.cc:902
 msgid "Punch"
 msgstr "Врезка"
 
-#: editor.cc:1439 editor_mouse.cc:1742
+#: gtk2_ardour/editor.cc:1387 gtk2_ardour/editor_mouse.cc:1748
 #, fuzzy
 msgid "programming error: fade in canvas item has no regionview data pointer!"
 msgstr "ошибка в программе: line canvas item has no line pointer!"
 
-#: editor.cc:1451 editor.cc:1468 redirect_box.cc:1073
+#: gtk2_ardour/editor.cc:1400 gtk2_ardour/editor.cc:1417
+#: gtk2_ardour/redirect_box.cc:1088
 msgid "Deactivate"
 msgstr "Деактивировать"
 
-#. activation
-#: editor.cc:1453 editor.cc:1470 redirect_box.cc:1071
+#: gtk2_ardour/editor.cc:1402 gtk2_ardour/editor.cc:1419
+#: gtk2_ardour/redirect_box.cc:1086
 msgid "Activate"
 msgstr "Активировать"
 
-#: editor.cc:1458 editor.cc:1475
+#: gtk2_ardour/editor.cc:1407 gtk2_ardour/editor.cc:1424
 #, fuzzy
 msgid "Linear"
 msgstr "линейное"
 
-#: editor.cc:1459 editor.cc:1476 editor_actions.cc:376
-#, fuzzy
+#: gtk2_ardour/editor.cc:1408 gtk2_ardour/editor.cc:1425
+#: gtk2_ardour/editor_actions.cc:380
 msgid "Slowest"
-msgstr "Ме��ьше"
+msgstr "Ме��леннее всего"
 
-#: editor.cc:1460 editor.cc:1477 editor_actions.cc:377
-#, fuzzy
+#: gtk2_ardour/editor.cc:1409 gtk2_ardour/editor.cc:1426
+#: gtk2_ardour/editor_actions.cc:381
 msgid "Slow"
-msgstr "��оло"
+msgstr "��едленно"
 
-#: editor.cc:1461 editor.cc:1478 editor_actions.cc:379
-#, fuzzy
+#: gtk2_ardour/editor.cc:1410 gtk2_ardour/editor.cc:1427
+#: gtk2_ardour/editor_actions.cc:383
 msgid "Fast"
-msgstr "��атухание"
+msgstr "��ыстро"
 
-#: editor.cc:1462 editor.cc:1479 editor_actions.cc:381
-#, fuzzy
+#: gtk2_ardour/editor.cc:1411 gtk2_ardour/editor.cc:1428
+#: gtk2_ardour/editor_actions.cc:385
 msgid "Fastest"
-msgstr "��ыстрое"
+msgstr "��ыстрее всего"
 
-#: editor.cc:1589 editor.cc:1597
+#: gtk2_ardour/editor.cc:1539 gtk2_ardour/editor.cc:1547
 msgid "Freeze"
 msgstr "Заморозить"
 
-#: editor.cc:1593
+#: gtk2_ardour/editor.cc:1543
 msgid "Unfreeze"
 msgstr "Разморозить"
 
-#: editor.cc:1762 editor.cc:1857
-#, fuzzy
+#: gtk2_ardour/editor.cc:1712 gtk2_ardour/editor.cc:1807
 msgid "Unmute"
-msgstr "тихо"
+msgstr "Снять глушение"
 
-#. non-operative menu items for menu bar
-#. show editors
-#: editor.cc:1766 editor.cc:2046 editor.cc:2748 editor_actions.cc:27
-#: editor_markers.cc:507 mixer_strip.cc:495 mixer_strip.cc:563
-#: redirect_box.cc:1079
+#: gtk2_ardour/editor.cc:1716 gtk2_ardour/editor.cc:1996
+#: gtk2_ardour/editor_actions.cc:27 gtk2_ardour/editor_markers.cc:510
+#: gtk2_ardour/mixer_strip.cc:496 gtk2_ardour/mixer_strip.cc:559
+#: gtk2_ardour/redirect_box.cc:1094
 msgid "Edit"
 msgstr "Правка"
 
-#: editor.cc:1771
+#: gtk2_ardour/editor.cc:1721
 msgid "Convert to short"
 msgstr ""
 
-#: editor.cc:1773
+#: gtk2_ardour/editor.cc:1723
 msgid "Convert to full"
 msgstr ""
 
-#: editor.cc:1784
-#, fuzzy
+#: gtk2_ardour/editor.cc:1734
 msgid "Crossfade"
 msgstr "Кроссфейд"
 
-#: editor.cc:1827
+#: gtk2_ardour/editor.cc:1777
 msgid "Popup region editor"
 msgstr "Открыть редактор области"
 
-#: editor.cc:1828
+#: gtk2_ardour/editor.cc:1778
 #, fuzzy
 msgid "Raise to top layer"
 msgstr "Поднять область в верхний слой"
 
-#: editor.cc:1829
+#: gtk2_ardour/editor.cc:1779
 #, fuzzy
 msgid "Lower to bottom layer"
 msgstr "Опустить область в нижний слой"
 
-#: editor.cc:1831
+#: gtk2_ardour/editor.cc:1781
 msgid "Define sync point"
 msgstr ""
 
-#: editor.cc:1832
+#: gtk2_ardour/editor.cc:1782
 msgid "Remove sync point"
 msgstr ""
 
-#: editor.cc:1837
+#: gtk2_ardour/editor.cc:1787
 #, fuzzy
 msgid "Bounce"
 msgstr "Свести выделенное"
 
-#: editor.cc:1840
+#: gtk2_ardour/editor.cc:1790
 #, fuzzy
 msgid "Analyze region"
 msgstr "Воспроизвести область"
 
-#: editor.cc:1852
+#: gtk2_ardour/editor.cc:1802
 msgid "Lock"
-msgstr ""
+msgstr "Запереть"
 
-#: editor.cc:1853
+#: gtk2_ardour/editor.cc:1803
 msgid "Unlock"
-msgstr ""
+msgstr "Отпереть"
 
-#: editor.cc:1863
+#: gtk2_ardour/editor.cc:1813
 msgid "Original position"
-msgstr ""
+msgstr "Исходное положение"
 
-#: editor.cc:1869
+#: gtk2_ardour/editor.cc:1819
 msgid "Toggle envelope visibility"
 msgstr ""
 
-#: editor.cc:1870
+#: gtk2_ardour/editor.cc:1820
 msgid "Toggle envelope active"
 msgstr ""
 
-#: editor.cc:1874
-#, fuzzy
+#: gtk2_ardour/editor.cc:1824
 msgid "DeNormalize"
-msgstr "��орм."
+msgstr "��енормализовать"
 
-#: editor.cc:1876
+#: gtk2_ardour/editor.cc:1826
 msgid "Normalize"
-msgstr ""
+msgstr "Нормализовать"
 
-#: editor.cc:1879
+#: gtk2_ardour/editor.cc:1829
 msgid "Reverse"
 msgstr ""
 
-#. range related stuff
-#: editor.cc:1885
-#, fuzzy
+#: gtk2_ardour/editor.cc:1835
 msgid "Add Range Markers"
-msgstr "��аркеры интервалов"
+msgstr "��обавить маркеры областей"
 
-#: editor.cc:1886
+#: gtk2_ardour/editor.cc:1836
 #, fuzzy
 msgid "Set Range"
 msgstr "Разделить область"
 
-#: editor.cc:1895
+#: gtk2_ardour/editor.cc:1845
 msgid "Nudge fwd"
-msgstr ""
+msgstr "Подвинуть вперёд"
 
-#: editor.cc:1896
+#: gtk2_ardour/editor.cc:1846
 msgid "Nudge bwd"
-msgstr ""
+msgstr "Подвинуть назад"
 
-#: editor.cc:1897
+#: gtk2_ardour/editor.cc:1847
 msgid "Nudge fwd by capture offset"
 msgstr ""
 
-#: editor.cc:1898
+#: gtk2_ardour/editor.cc:1848
 msgid "Nudge bwd by capture offset"
 msgstr ""
 
-#: editor.cc:1907
+#: gtk2_ardour/editor.cc:1850 gtk2_ardour/editor.cc:2016
+#: gtk2_ardour/editor.cc:2072
+msgid "Nudge"
+msgstr "Подвинуть"
+
+#: gtk2_ardour/editor.cc:1857
 msgid "Start to edit cursor"
 msgstr "От начала до курсора"
 
-#: editor.cc:1908
+#: gtk2_ardour/editor.cc:1858
 msgid "Edit cursor to end"
 msgstr "От курсора до конца"
 
-#: editor.cc:1910 gain_meter.cc:181 gain_meter.cc:813 panner_ui.cc:98
-#: panner_ui.cc:803
+#: gtk2_ardour/editor.cc:1860 gtk2_ardour/gain_meter.cc:176
+#: gtk2_ardour/gain_meter.cc:808 gtk2_ardour/panner_ui.cc:96
+#: gtk2_ardour/panner_ui.cc:793
 msgid "Trim"
 msgstr ""
 
-#: editor.cc:1913
+#: gtk2_ardour/editor.cc:1863
 msgid "Split"
 msgstr "Склеить"
 
-#: editor.cc:1916
+#: gtk2_ardour/editor.cc:1866
 msgid "Make mono regions"
 msgstr "Создать моно-области"
 
-#: editor.cc:1919
+#: gtk2_ardour/editor.cc:1869
 msgid "Duplicate"
 msgstr "Размножить"
 
-#: editor.cc:1920
+#: gtk2_ardour/editor.cc:1870
 msgid "Fill Track"
 msgstr "Заполнить трек"
 
-#: editor.cc:1924
+#: gtk2_ardour/editor.cc:1874
 msgid "Destroy"
 msgstr ""
 
-#: editor.cc:1954
+#: gtk2_ardour/editor.cc:1904
 #, fuzzy
 msgid "Play range"
 msgstr "Воспроизвести \"кольцо\""
 
-#: editor.cc:1955
+#: gtk2_ardour/editor.cc:1905
 msgid "Loop range"
 msgstr ""
 
-#: editor.cc:1959
+#: gtk2_ardour/editor.cc:1909
 #, fuzzy
 msgid "Analyze range"
 msgstr "Воспроизвести \"кольцо\""
 
-#: editor.cc:1963
+#: gtk2_ardour/editor.cc:1913
 #, fuzzy
 msgid "Separate range to track"
 msgstr "Разделить область"
 
-#: editor.cc:1964
+#: gtk2_ardour/editor.cc:1914
 #, fuzzy
 msgid "Separate range to region list"
 msgstr "Воспроизвести выделенную область"
 
-#: editor.cc:1967
+#: gtk2_ardour/editor.cc:1917
 #, fuzzy
 msgid "Select all in range"
 msgstr "Выделить всё"
 
-#: editor.cc:1969 editor.cc:2014
+#: gtk2_ardour/editor.cc:1919 gtk2_ardour/editor.cc:1964
 #, fuzzy
 msgid "Set range to loop range"
 msgstr "выбрать окно просмотра"
 
-#: editor.cc:1970 editor.cc:2015
+#: gtk2_ardour/editor.cc:1920 gtk2_ardour/editor.cc:1965
 #, fuzzy
 msgid "Set range to punch range"
 msgstr "Выбрать текущий интервал"
 
-#: editor.cc:1972
+#: gtk2_ardour/editor.cc:1922
 #, fuzzy
 msgid "Crop region to range"
 msgstr "Обрезать область по выделенному"
 
-#: editor.cc:1973
+#: gtk2_ardour/editor.cc:1923
 #, fuzzy
 msgid "Fill range with region"
 msgstr "Создать область"
 
-#: editor.cc:1974
+#: gtk2_ardour/editor.cc:1924
 #, fuzzy
 msgid "Duplicate range"
 msgstr "Размножить"
 
-#: editor.cc:1975
+#: gtk2_ardour/editor.cc:1925
 #, fuzzy
 msgid "Create chunk from range"
 msgstr "Создать фрагмент из выделенного"
 
-#: editor.cc:1977
+#: gtk2_ardour/editor.cc:1927
 msgid "Bounce range"
 msgstr ""
 
-#: editor.cc:1978
+#: gtk2_ardour/editor.cc:1928
 #, fuzzy
 msgid "Export range"
 msgstr "Экспорт области"
 
-#: editor.cc:1980
+#: gtk2_ardour/editor.cc:1930
 #, fuzzy
 msgid "Range"
 msgstr "выделять"
 
-#: editor.cc:1995 editor.cc:2080
-#, fuzzy
+#: gtk2_ardour/editor.cc:1945 gtk2_ardour/editor.cc:2030
 msgid "Play from edit cursor"
 msgstr "Воспроизвести от курсора"
 
-#: editor.cc:1996 editor.cc:2081
+#: gtk2_ardour/editor.cc:1946 gtk2_ardour/editor.cc:2031
 msgid "Play from start"
-msgstr "Воспроизвести с начала"
+msgstr "Воспроизвести сначала"
 
-#: editor.cc:1997
-#, fuzzy
+#: gtk2_ardour/editor.cc:1947
 msgid "Play region"
 msgstr "Воспроизвести область"
 
-#: editor.cc:1999
+#: gtk2_ardour/editor.cc:1949
 msgid "Loop Region"
-msgstr "\"Закольцевать\" область"
+msgstr "«Закольцевать» область"
 
-#: editor.cc:2009 editor.cc:2090
-#, fuzzy
+#: gtk2_ardour/editor.cc:1959 gtk2_ardour/editor.cc:2040
 msgid "Select All in track"
-msgstr "Выделить всё"
+msgstr "Выделить всё в дорожке"
 
-#: editor.cc:2010 editor.cc:2091 redirect_box.cc:1067
-#, fuzzy
+#: gtk2_ardour/editor.cc:1960 gtk2_ardour/editor.cc:2041
+#: gtk2_ardour/redirect_box.cc:1082
 msgid "Select All"
 msgstr "Выделить всё"
 
-#: editor.cc:2011 editor.cc:2092
-#, fuzzy
+#: gtk2_ardour/editor.cc:1961 gtk2_ardour/editor.cc:2042
 msgid "Invert selection in track"
-msgstr "��крыть трек"
+msgstr "��братить выделение в дорожке"
 
-#: editor.cc:2012 editor.cc:2093
-#, fuzzy
+#: gtk2_ardour/editor.cc:1962 gtk2_ardour/editor.cc:2043
 msgid "Invert selection"
-msgstr "��вести выделенное"
+msgstr "��братить выделение"
 
-#: editor.cc:2017 editor.cc:2095
-#, fuzzy
+#: gtk2_ardour/editor.cc:1967 gtk2_ardour/editor.cc:2045
 msgid "Select all after edit cursor"
-msgstr "��т начала до курсора"
+msgstr "��ыделить всё после курсора"
 
-#: editor.cc:2018 editor.cc:2096
-#, fuzzy
+#: gtk2_ardour/editor.cc:1968 gtk2_ardour/editor.cc:2046
 msgid "Select all before edit cursor"
-msgstr "��т начала до курсора"
+msgstr "��ыделить всё до курсора"
 
-#: editor.cc:2019 editor.cc:2097
-#, fuzzy
+#: gtk2_ardour/editor.cc:1969 gtk2_ardour/editor.cc:2047
 msgid "Select all after playhead"
-msgstr "Воспроизвести от указателя"
+msgstr "Выделить всё после указателя"
 
-#: editor.cc:2020 editor.cc:2098
-#, fuzzy
+#: gtk2_ardour/editor.cc:1970 gtk2_ardour/editor.cc:2048
 msgid "Select all before playhead"
-msgstr "Воспроизвести от указателя"
+msgstr "Выделить всё до указателя"
 
-#: editor.cc:2021
-#, fuzzy
+#: gtk2_ardour/editor.cc:1971
 msgid "Select all between cursors"
-msgstr "��т начала до курсора"
+msgstr "��ыделить всё между курсорами"
 
-#. standard editing stuff
-#: editor.cc:2032 editor.cc:2108 editor.cc:3483 editor_actions.cc:214
-#: redirect_box.cc:1060
+#: gtk2_ardour/editor.cc:1982 gtk2_ardour/editor.cc:2058
+#: gtk2_ardour/editor.cc:3388 gtk2_ardour/editor_actions.cc:216
+#: gtk2_ardour/redirect_box.cc:1075
 msgid "Cut"
 msgstr "Вырезать"
 
-#: editor.cc:2033 editor.cc:2109 editor.cc:3485 editor_actions.cc:219
-#: redirect_box.cc:1062
+#: gtk2_ardour/editor.cc:1983 gtk2_ardour/editor.cc:2059
+#: gtk2_ardour/editor.cc:3390 gtk2_ardour/editor_actions.cc:221
+#: gtk2_ardour/redirect_box.cc:1077
 msgid "Copy"
 msgstr "Копировать"
 
-#: editor.cc:2034
-#, fuzzy
+#: gtk2_ardour/editor.cc:1984
 msgid "Paste at edit cursor"
-msgstr "��т начала до курсора"
+msgstr "��ставить под курсор редактора"
 
-#: editor.cc:2035
-#, fuzzy
+#: gtk2_ardour/editor.cc:1985
 msgid "Paste at mouse"
-msgstr "��спользовать мастер-выходы"
+msgstr "��ставить под курсор мыши"
 
-#: editor.cc:2039 editor.cc:3490
+#: gtk2_ardour/editor.cc:1989 gtk2_ardour/editor.cc:3395
 msgid "Align"
 msgstr "Выровнять"
 
-#: editor.cc:2040 editor.cc:3492
+#: gtk2_ardour/editor.cc:1990 gtk2_ardour/editor.cc:3397
 msgid "Align Relative"
 msgstr "Выровнять относительно"
 
-#: editor.cc:2044
+#: gtk2_ardour/editor.cc:1994
 msgid "Insert chunk"
 msgstr "Вставить фрагмент"
 
-#: editor.cc:2051
+#: gtk2_ardour/editor.cc:2001
 #, fuzzy
 msgid "Insert Selected Region"
 msgstr "Воспроизвести выделенную область"
 
-#: editor.cc:2052
+#: gtk2_ardour/editor.cc:2002
 msgid "Insert Existing Audio"
 msgstr ""
 
-#: editor.cc:2061 editor.cc:2117
+#: gtk2_ardour/editor.cc:2011 gtk2_ardour/editor.cc:2067
 msgid "Nudge entire track fwd"
 msgstr ""
 
-#: editor.cc:2062 editor.cc:2118
+#: gtk2_ardour/editor.cc:2012 gtk2_ardour/editor.cc:2068
 msgid "Nudge track after edit cursor fwd"
 msgstr ""
 
-#: editor.cc:2063 editor.cc:2119
+#: gtk2_ardour/editor.cc:2013 gtk2_ardour/editor.cc:2069
 msgid "Nudge entire track bwd"
 msgstr ""
 
-#: editor.cc:2064 editor.cc:2120
+#: gtk2_ardour/editor.cc:2014 gtk2_ardour/editor.cc:2070
 msgid "Nudge track after edit cursor bwd"
 msgstr ""
 
-#: editor.cc:2110 editor.cc:3487 editor_actions.cc:221 redirect_box.cc:1064
+#: gtk2_ardour/editor.cc:2060 gtk2_ardour/editor.cc:3392
+#: gtk2_ardour/editor_actions.cc:223 gtk2_ardour/redirect_box.cc:1079
 msgid "Paste"
 msgstr "Вставить"
 
-#: editor.cc:2630
-msgid "select/move objects"
+#: gtk2_ardour/editor.cc:2612
+#, fuzzy
+msgid "Select/Move Objects"
 msgstr "выбирать/двигать объекты"
 
-#: editor.cc:2631
-msgid "select/move ranges"
+#: gtk2_ardour/editor.cc:2613
+#, fuzzy
+msgid "Select/Move Ranges"
 msgstr "выбирать/двигать диапазоны"
 
-#: editor.cc:2632
-msgid "draw gain automation"
-msgstr ""
+#: gtk2_ardour/editor.cc:2614
+#, fuzzy
+msgid "Draw Gain Automation"
+msgstr "автомат"
 
-#: editor.cc:2633
-msgid "select zoom range"
+#: gtk2_ardour/editor.cc:2615
+#, fuzzy
+msgid "Select Zoom Range"
 msgstr "выбрать окно просмотра"
 
-#: editor.cc:2634
-msgid "stretch/shrink regions"
+#: gtk2_ardour/editor.cc:2616
+#, fuzzy
+msgid "Stretch/Shrink Regions"
 msgstr "растянуть/сжать области"
 
-#: editor.cc:2635
+#: gtk2_ardour/editor.cc:2617
 #, fuzzy
-msgid "listen to specific regions"
+msgid "Listen to Specific Regions"
 msgstr "Воспроизвести выделенную область"
 
-#: editor.cc:2746
-msgid "Start:"
-msgstr "Начало:"
+#: gtk2_ardour/editor.cc:2646 gtk2_ardour/editor_actions.cc:144
+msgid "Zoom In"
+msgstr "Увеличить"
+
+#: gtk2_ardour/editor.cc:2651 gtk2_ardour/editor_actions.cc:142
+msgid "Zoom Out"
+msgstr "Уменьшить"
+
+#: gtk2_ardour/editor.cc:2656 gtk2_ardour/editor_actions.cc:146
+msgid "Zoom to Session"
+msgstr "Показать всё"
+
+#: gtk2_ardour/editor.cc:2663
+msgid ""
+"Current Zoom Range\n"
+"(Width of visible area)"
+msgstr ""
 
-#: editor.cc:2747
-msgid "End:"
-msgstr "Конец:"
+#: gtk2_ardour/editor.cc:2682
+msgid "Unit to snap cursors and ranges to"
+msgstr ""
 
-#: editor.cc:3362 editor.cc:3402
+#: gtk2_ardour/editor.cc:3267 gtk2_ardour/editor.cc:3307
 #, fuzzy
 msgid "set selected regions"
 msgstr "Воспроизвести выделенную область"
 
-#: editor.cc:3458 editor_actions.cc:204
+#: gtk2_ardour/editor.cc:3363 gtk2_ardour/editor_actions.cc:206
 msgid "Undo"
 msgstr "Отменить"
 
-#: editor.cc:3460
+#: gtk2_ardour/editor.cc:3365
 msgid "Undo (%1)"
 msgstr "Отменить (%1)"
 
-#: editor.cc:3470 editor_actions.cc:206
+#: gtk2_ardour/editor.cc:3375 gtk2_ardour/editor_actions.cc:208
 msgid "Redo"
-msgstr "��ернуть"
+msgstr "��овторить"
 
-#: editor.cc:3472
+#: gtk2_ardour/editor.cc:3377
 msgid "Redo (%1)"
-msgstr "��ернуть (%1)"
+msgstr "��овторить (%1)"
 
-#: editor.cc:3506
+#: gtk2_ardour/editor.cc:3411
 msgid "... as new track"
-msgstr ""
+msgstr "... как новую дорожку"
 
-#: editor.cc:3507
-#, fuzzy
+#: gtk2_ardour/editor.cc:3412
 msgid "... as new region"
-msgstr "прослушать область"
+msgstr "... как новую область"
 
-#: editor.cc:3509
+#: gtk2_ardour/editor.cc:3414
 msgid "Import audio (copy)"
-msgstr "Импортировать аудио (копировать)"
+msgstr "Импортировать аудио (копией)"
 
-#: editor.cc:3512
+#: gtk2_ardour/editor.cc:3417
 msgid "Remove last capture"
 msgstr "Удалить последнюю запись"
 
-#: editor.cc:3536
+#: gtk2_ardour/editor.cc:3441
 msgid "Duplicate how many times?"
 msgstr "Количество повторов?"
 
-#: editor.cc:4022
+#: gtk2_ardour/editor.cc:3618
+#, fuzzy
+msgid "Focus Playhead"
+msgstr "Масштабировать к"
+
+#: gtk2_ardour/editor.cc:3620
+#, fuzzy
+msgid "Focus Edit Cursor"
+msgstr "курсору"
+
+#: gtk2_ardour/editor.cc:3929
 msgid ""
 "Playlist %1 is currently unused.\n"
 "If left alone, no audio files used by it will be cleaned.\n"
 "If deleted, audio files used by it alone by will cleaned."
 msgstr ""
 
-#: editor.cc:4030
-#, fuzzy
+#: gtk2_ardour/editor.cc:3937
 msgid "Delete playlist"
-msgstr "��мя снимка"
+msgstr "��далить список воспроизведения"
 
-#: editor.cc:4031
-#, fuzzy
+#: gtk2_ardour/editor.cc:3938
 msgid "Keep playlist"
-msgstr "Имя снимка"
-
-#: editor.cc:4032 editor_audio_import.cc:236 editor_ops.cc:2048
-#: editor_timefx.cc:71 export_dialog.cc:971 io_selector.cc:59
-#: io_selector.cc:793 redirect_box.cc:903 tempo_dialog.cc:20
-#: tempo_dialog.cc:37 tempo_dialog.cc:202 tempo_dialog.cc:220
+msgstr "Сохранить список воспроизведения"
+
+#: gtk2_ardour/editor.cc:3939 gtk2_ardour/editor_audio_import.cc:239
+#: gtk2_ardour/editor_ops.cc:2061 gtk2_ardour/editor_timefx.cc:72
+#: gtk2_ardour/export_dialog.cc:971 gtk2_ardour/io_selector.cc:61
+#: gtk2_ardour/io_selector.cc:795 gtk2_ardour/redirect_box.cc:901
+#: gtk2_ardour/tempo_dialog.cc:20 gtk2_ardour/tempo_dialog.cc:37
+#: gtk2_ardour/tempo_dialog.cc:202 gtk2_ardour/tempo_dialog.cc:220
+#: gtk2_ardour/connection_editor.cc:60
 msgid "Cancel"
 msgstr "Отмена"
 
-#: editor.cc:4199
-#, fuzzy
+#: gtk2_ardour/editor.cc:4107
 msgid "new playlists"
-msgstr "��мя снимка"
+msgstr "��оздать списки воспроизведения"
 
-#: editor.cc:4207
-#, fuzzy
+#: gtk2_ardour/editor.cc:4115
 msgid "copy playlists"
-msgstr "��мя снимка"
+msgstr "��копировать списки воспроизведения"
 
-#: editor.cc:4215
-#, fuzzy
+#: gtk2_ardour/editor.cc:4123
 msgid "clear playlists"
-msgstr "��мя снимка"
+msgstr "��чистить списки воспроизведения"
 
-#: editor_actions.cc:28
-#, fuzzy
+#: gtk2_ardour/editor_actions.cc:28
 msgid "Select regions"
-msgstr "Воспроизвести выделенную область"
+msgstr "Выделение областей"
 
-#: editor_actions.cc:29
-#, fuzzy
+#: gtk2_ardour/editor_actions.cc:29
 msgid "Select range operations"
-msgstr "��оспроизвести выделенную область"
+msgstr "��ействия с выделенной областью"
 
-#: editor_actions.cc:30
-#, fuzzy
+#: gtk2_ardour/editor_actions.cc:30
 msgid "Move edit cursor"
-msgstr "��т начала до курсора"
+msgstr "��ереместить курсор редактора"
 
-#: editor_actions.cc:31
-#, fuzzy
+#: gtk2_ardour/editor_actions.cc:31
 msgid "Region operations"
-msgstr "��бласти/создание"
+msgstr "��ействия с областями"
 
-#: editor_actions.cc:32
+#: gtk2_ardour/editor_actions.cc:32
 msgid "Tools"
-msgstr ""
+msgstr "Инструменты"
 
-#: editor_actions.cc:33
+#: gtk2_ardour/editor_actions.cc:33
 msgid "View"
-msgstr ""
+msgstr "Вид"
 
-#: editor_actions.cc:34
-#, fuzzy
+#: gtk2_ardour/editor_actions.cc:34
 msgid "ZoomFocus"
-msgstr "��асштабировать к"
+msgstr "��окус при масштабировании"
 
-#: editor_actions.cc:35
-#, fuzzy
+#: gtk2_ardour/editor_actions.cc:35
 msgid "Meter hold"
-msgstr "��азмер"
+msgstr "��адержка индикатора"
 
-#: editor_actions.cc:36
+#: gtk2_ardour/editor_actions.cc:36
 msgid "Meter falloff"
-msgstr ""
+msgstr "Спадание индикатора"
 
-#: editor_actions.cc:38
-#, fuzzy
+#: gtk2_ardour/editor_actions.cc:38
 msgid "Crossfades"
-msgstr "Кроссфейд"
+msgstr "Кроссфейды"
 
-#: editor_actions.cc:39
-#, fuzzy
+#: gtk2_ardour/editor_actions.cc:39
 msgid "Monitoring"
-msgstr "��ппаратный контроль"
+msgstr "�онтроль"
 
-#: editor_actions.cc:40
-#, fuzzy
+#: gtk2_ardour/editor_actions.cc:40
 msgid "Autoconnect"
-msgstr "��оединить"
+msgstr "��втосоединение"
 
-#: editor_actions.cc:41
-#, fuzzy
+#: gtk2_ardour/editor_actions.cc:41
 msgid "Layering"
-msgstr "Сло�"
+msgstr "Сло�"
 
-#: editor_actions.cc:42
-#, fuzzy
+#: gtk2_ardour/editor_actions.cc:42
+msgid "SMPTE fps"
+msgstr "Кадров в секунду SMPTE"
+
+#: gtk2_ardour/editor_actions.cc:43
+msgid "Pullup / Pulldown"
+msgstr ""
+
+#: gtk2_ardour/editor_actions.cc:44
 msgid "Metering"
-msgstr "��азмер"
+msgstr "��ндикаторы"
 
-#: editor_actions.cc:43
+#: gtk2_ardour/editor_actions.cc:45
 msgid "Fall off rate"
-msgstr ""
+msgstr "Частота спада"
 
-#: editor_actions.cc:44
+#: gtk2_ardour/editor_actions.cc:46
 msgid "Hold Time"
-msgstr ""
+msgstr "Время задержки"
 
-#: editor_actions.cc:45
+#: gtk2_ardour/editor_actions.cc:47
 msgid "Add Existing Audio"
-msgstr ""
+msgstr "Добавить существующий файл"
 
-#. add named actions for the editor
-#: editor_actions.cc:50
-#, fuzzy
+#: gtk2_ardour/editor_actions.cc:52
 msgid "Show Editor Mixer"
-msgstr "Показать ��се каналы аудиотреков"
+msgstr "Показать ��икшер редактора"
 
-#: editor_actions.cc:55
+#: gtk2_ardour/editor_actions.cc:57
 #, fuzzy
 msgid "Span Entire Overlap"
 msgstr "Поднять область на один слой"
 
-#: editor_actions.cc:57 editor_actions.cc:384
-#, fuzzy
+#: gtk2_ardour/editor_actions.cc:59 gtk2_ardour/editor_actions.cc:388
 msgid "Short"
-msgstr "��орт"
+msgstr "��ороткая"
 
-#: editor_actions.cc:64
+#: gtk2_ardour/editor_actions.cc:66
 msgid "Created Automatically"
-msgstr ""
+msgstr "Создано автоматически"
 
-#: editor_actions.cc:67
+#: gtk2_ardour/editor_actions.cc:69
 msgid "Playhead to Next Region Start"
-msgstr ""
+msgstr "Указатель к началу следующей области"
 
-#: editor_actions.cc:69
+#: gtk2_ardour/editor_actions.cc:71
 msgid "Playhead to Next Region End"
-msgstr ""
+msgstr "Указатель к концу следующей области"
 
-#: editor_actions.cc:71
+#: gtk2_ardour/editor_actions.cc:73
 msgid "Playhead to Next Region Sync"
 msgstr ""
 
-#: editor_actions.cc:74
+#: gtk2_ardour/editor_actions.cc:76
 msgid "Playhead to Previous Region Start"
-msgstr ""
+msgstr "Указатель к началу предыдущей области"
 
-#: editor_actions.cc:76
+#: gtk2_ardour/editor_actions.cc:78
 msgid "Playhead to Previous Region End"
-msgstr ""
+msgstr "Указатель к концу предыдущей области"
 
-#: editor_actions.cc:78
+#: gtk2_ardour/editor_actions.cc:80
 msgid "Playhead to Previous Region Sync"
 msgstr ""
 
-#: editor_actions.cc:81
-#, fuzzy
+#: gtk2_ardour/editor_actions.cc:83
 msgid "Edit Cursor to Next Region Start"
-msgstr "��т курсора до конца"
+msgstr "��урсор редактора к началу следующей области"
 
-#: editor_actions.cc:83
-#, fuzzy
+#: gtk2_ardour/editor_actions.cc:85
 msgid "Edit Cursor to Next Region End"
-msgstr "��т курсора до конца"
+msgstr "��урсор редактора к концу следующей области"
 
-#: editor_actions.cc:85
+#: gtk2_ardour/editor_actions.cc:87
 #, fuzzy
 msgid "Edit Cursor to Next Region Sync"
 msgstr "От курсора до конца"
 
-#: editor_actions.cc:88
+#: gtk2_ardour/editor_actions.cc:90
 msgid "Edit Cursor to Previous Region Start"
-msgstr ""
+msgstr "Курсор редактора к началу предыдущей области"
 
-#: editor_actions.cc:90
-#, fuzzy
+#: gtk2_ardour/editor_actions.cc:92
 msgid "Edit Cursor to Previous Region End"
-msgstr "��т курсора до конца"
+msgstr "��урсор редактора к концу предыдущей области"
 
-#: editor_actions.cc:92
-#, fuzzy
+#: gtk2_ardour/editor_actions.cc:94
 msgid "Edit Cursor to Previous Region Sync"
-msgstr "От курсора до конца"
+msgstr ""
 
-#: editor_actions.cc:95
+#: gtk2_ardour/editor_actions.cc:97
 msgid "Playhead to Range Start"
-msgstr ""
+msgstr "Указатель к началу области"
 
-#: editor_actions.cc:97
-#, fuzzy
+#: gtk2_ardour/editor_actions.cc:99
 msgid "Playhead to Range End"
-msgstr "��оспроизвести \"кольцо\""
+msgstr "��казатель к концу области"
 
-#: editor_actions.cc:100
-#, fuzzy
+#: gtk2_ardour/editor_actions.cc:102
 msgid "Edit Cursor to Range Start"
-msgstr "��т курсора до конца"
+msgstr "��урсор редактора к началу области"
 
-#: editor_actions.cc:102
-#, fuzzy
+#: gtk2_ardour/editor_actions.cc:104
 msgid "Edit Cursor to Range End"
-msgstr "��т курсора до конца"
+msgstr "��урсор редактора к концу области"
 
-#: editor_actions.cc:105 editor_ops.cc:1363
-#, fuzzy
+#: gtk2_ardour/editor_actions.cc:107 gtk2_ardour/editor_ops.cc:1373
 msgid "select all"
 msgstr "Выделить всё"
 
-#: editor_actions.cc:107
-#, fuzzy
+#: gtk2_ardour/editor_actions.cc:109
 msgid "Select All After Edit Cursor"
-msgstr "Воспроизвести от курсора"
+msgstr "Выделить всё после курсора редактора"
 
-#: editor_actions.cc:109
+#: gtk2_ardour/editor_actions.cc:111
 msgid "Select All Before Edit Cursor"
-msgstr ""
+msgstr "Выделить всё перед курсором редактора"
 
-#: editor_actions.cc:112
-#, fuzzy
+#: gtk2_ardour/editor_actions.cc:114
 msgid "Select All After Playhead"
-msgstr "Воспроизвести от указателя"
+msgstr "Выделить всё после указателя"
 
-#: editor_actions.cc:114
-#, fuzzy
+#: gtk2_ardour/editor_actions.cc:116
 msgid "Select All Before Playhead"
-msgstr "Воспроизвести от указателя"
+msgstr "Выделить всё до указателя"
 
-#: editor_actions.cc:116
+#: gtk2_ardour/editor_actions.cc:118
 #, fuzzy
 msgid "Select All Between Cursors"
 msgstr "Воспроизвести от курсора"
 
-#: editor_actions.cc:119
+#: gtk2_ardour/editor_actions.cc:121
 #, fuzzy
 msgid "Select All in Punch Range"
 msgstr "Выбрать текущий интервал"
 
-#: editor_actions.cc:121
-#, fuzzy
+#: gtk2_ardour/editor_actions.cc:123
 msgid "Select All in Loop Range"
-msgstr "��ыбрать окно просмотра"
+msgstr "��ыделить всё в закольцованной области"
 
-#: editor_actions.cc:124
+#: gtk2_ardour/editor_actions.cc:126
 msgid "Jump Forward to Mark"
-msgstr ""
+msgstr "К следующей метке"
 
-#: editor_actions.cc:126
+#: gtk2_ardour/editor_actions.cc:128
 msgid "Jump Backward to Mark"
-msgstr ""
+msgstr "К предыдущей метке"
 
-#: editor_actions.cc:128
+#: gtk2_ardour/editor_actions.cc:130
 #, fuzzy
 msgid "Add Location from Playhead"
 msgstr "Воспроизвести от указателя"
 
-#: editor_actions.cc:131
+#: gtk2_ardour/editor_actions.cc:133
 msgid "Nudge Forward"
-msgstr ""
+msgstr "Подвинуть вперёд"
 
-#: editor_actions.cc:133
+#: gtk2_ardour/editor_actions.cc:135
 msgid "Nudge Next Forward"
 msgstr ""
 
-#: editor_actions.cc:135
-#, fuzzy
+#: gtk2_ardour/editor_actions.cc:137
 msgid "Nudge Backward"
-msgstr "��крыть трек"
+msgstr "��одвинуть назад"
 
-#: editor_actions.cc:137
+#: gtk2_ardour/editor_actions.cc:139
 #, fuzzy
 msgid "Nudge Next Backward"
 msgstr "Скрыть трек"
 
-#: editor_actions.cc:140
-#, fuzzy
-msgid "Zoom Out"
-msgstr "Уменьшить"
+#: gtk2_ardour/editor_actions.cc:149
+msgid "Scroll Tracks Up"
+msgstr "Прокрутить дорожки вверх"
+
+#: gtk2_ardour/editor_actions.cc:151
+msgid "Scroll Tracks Down"
+msgstr "Прокрутить дорожки вниз"
 
-#: editor_actions.cc:142
-#, fuzzy
-msgid "Zoom In"
-msgstr "Увеличить"
-
-#: editor_actions.cc:144
-#, fuzzy
-msgid "Zoom to Session"
-msgstr "Показать всё"
-
-#: editor_actions.cc:147
-#, fuzzy
-msgid "Scroll Tracks Up"
-msgstr "Заполнить трек"
-
-#: editor_actions.cc:149
-msgid "Scroll Tracks Down"
-msgstr ""
-
-#: editor_actions.cc:151
+#: gtk2_ardour/editor_actions.cc:153
 #, fuzzy
 msgid "Step Tracks Up"
 msgstr "Скрыть трек"
 
-#: editor_actions.cc:153
+#: gtk2_ardour/editor_actions.cc:155
 msgid "Step Tracks Down"
 msgstr ""
 
-#: editor_actions.cc:156
+#: gtk2_ardour/editor_actions.cc:158
 msgid "Scroll Backward"
-msgstr ""
+msgstr "Прокрутить назад"
 
-#: editor_actions.cc:158
+#: gtk2_ardour/editor_actions.cc:160
 msgid "Scroll Forward"
-msgstr ""
+msgstr "Прокрутить вперёд"
 
-#: editor_actions.cc:160
+#: gtk2_ardour/editor_actions.cc:162
 msgid "goto"
-msgstr ""
+msgstr "Перейти"
 
-#: editor_actions.cc:162
-#, fuzzy
+#: gtk2_ardour/editor_actions.cc:164
 msgid "Center Playhead"
-msgstr "указателю"
+msgstr "Указатель по центру"
 
-#: editor_actions.cc:164
-#, fuzzy
+#: gtk2_ardour/editor_actions.cc:166
 msgid "Center Edit Cursor"
-msgstr "��урсору"
+msgstr "��урсор редактора по центру"
 
-#: editor_actions.cc:166
-#, fuzzy
+#: gtk2_ardour/editor_actions.cc:168
 msgid "Playhead Forward"
-msgstr "указателю"
+msgstr "Указатель вперёд"
 
-#: editor_actions.cc:168
-#, fuzzy
+#: gtk2_ardour/editor_actions.cc:170
 msgid "Playhead Backward"
-msgstr "указателю"
+msgstr "Указатель назад"
 
-#: editor_actions.cc:170
-#, fuzzy
+#: gtk2_ardour/editor_actions.cc:172
 msgid "Playhead to Edit"
-msgstr "указателю"
+msgstr "Указатель к курсору редактора"
 
-#: editor_actions.cc:172
-#, fuzzy
+#: gtk2_ardour/editor_actions.cc:174
 msgid "Edit to Playhead"
-msgstr "��оспроизвести от указателя"
+msgstr "��урсор редактора к указателю"
 
-#: editor_actions.cc:175
-#, fuzzy
+#: gtk2_ardour/editor_actions.cc:177
 msgid "Align Regions Start"
-msgstr "��ач. областей"
+msgstr "��ыровнять начало областей"
 
-#: editor_actions.cc:177
+#: gtk2_ardour/editor_actions.cc:179
 #, fuzzy
 msgid "Align Regions Start Relative"
 msgstr "Выровнять относительно"
 
-#: editor_actions.cc:179
-#, fuzzy
+#: gtk2_ardour/editor_actions.cc:181
 msgid "Align Regions End"
-msgstr "��рослушать область"
+msgstr "��ыровнять конец областей"
 
-#: editor_actions.cc:181
+#: gtk2_ardour/editor_actions.cc:183
 #, fuzzy
 msgid "Align Regions End Relative"
 msgstr "Выровнять относительно"
 
-#: editor_actions.cc:184
+#: gtk2_ardour/editor_actions.cc:186
 #, fuzzy
 msgid "Align Regions Sync"
 msgstr "прослушать область"
 
-#: editor_actions.cc:186
+#: gtk2_ardour/editor_actions.cc:188
 #, fuzzy
 msgid "Align Regions Sync Relative"
 msgstr "Выровнять относительно"
 
-#: editor_actions.cc:189
-#, fuzzy
+#: gtk2_ardour/editor_actions.cc:191
 msgid "Audition at Mouse"
-msgstr "��удит"
+msgstr "��онтроль по курсору мыши"
 
-#: editor_actions.cc:191
-#, fuzzy
+#: gtk2_ardour/editor_actions.cc:193
 msgid "Brush at Mouse"
-msgstr "��спользовать мастер-выходы"
+msgstr "��источка по курсору"
 
-#: editor_actions.cc:193
-#, fuzzy
+#: gtk2_ardour/editor_actions.cc:195
 msgid "Set Edit Cursor"
-msgstr "��урсору"
+msgstr "��становить курсор редактора"
 
-#: editor_actions.cc:195
-#, fuzzy
+#: gtk2_ardour/editor_actions.cc:197
 msgid "Mute/Unmute Region"
-msgstr "��оздать область"
+msgstr "��риглушить /вернуть звук области"
 
-#: editor_actions.cc:197
-#, fuzzy
+#: gtk2_ardour/editor_actions.cc:199
 msgid "Set Playhead"
-msgstr "указателю"
+msgstr "Установить указатель"
 
-#: editor_actions.cc:199
-#, fuzzy
+#: gtk2_ardour/editor_actions.cc:201
 msgid "Split Region"
 msgstr "Разделить область"
 
-#: editor_actions.cc:201
+#: gtk2_ardour/editor_actions.cc:203
 #, fuzzy
 msgid "Set Region Sync Position"
 msgstr "по расположению области"
 
-#: editor_actions.cc:209
-#, fuzzy
+#: gtk2_ardour/editor_actions.cc:211
 msgid "Export Session"
-msgstr "Экспорт области"
+msgstr "Экспортировать сессию"
 
-#: editor_actions.cc:211
-#, fuzzy
+#: gtk2_ardour/editor_actions.cc:213
 msgid "Export Range"
-msgstr "��азделить область"
+msgstr "��кспортировать область"
 
-#. Note: for now, editor-delete does the exact same thing as editor-cut
-#: editor_actions.cc:217
-#, fuzzy
+#: gtk2_ardour/editor_actions.cc:219 gtk2_ardour/connection_editor.cc:56
 msgid "Delete"
-msgstr "удалить"
+msgstr "Удалить"
 
-#: editor_actions.cc:223
-#, fuzzy
+#: gtk2_ardour/editor_actions.cc:225
 msgid "Duplicate Region"
-msgstr "��азделить область"
+msgstr "��родублировать область"
 
-#: editor_actions.cc:225
-#, fuzzy
+#: gtk2_ardour/editor_actions.cc:227
 msgid "Duplicate Range"
-msgstr "��азмножить"
+msgstr "��родублировать область"
 
-#: editor_actions.cc:227
+#: gtk2_ardour/editor_actions.cc:229
 msgid "Insert Region"
 msgstr "Вставить область"
 
-#: editor_actions.cc:229
-#, fuzzy
+#: gtk2_ardour/editor_actions.cc:231
 msgid "Reverse Region"
-msgstr "Раз��елить область"
+msgstr "Раз��ернуть область"
 
-#: editor_actions.cc:231
-#, fuzzy
+#: gtk2_ardour/editor_actions.cc:233
 msgid "Normalize Region"
-msgstr "��оздать область"
+msgstr "��ормализовать область"
 
-#: editor_actions.cc:233
-#, fuzzy
+#: gtk2_ardour/editor_actions.cc:235
 msgid "crop"
-msgstr "��опировать"
+msgstr "��брезать"
 
-#: editor_actions.cc:235
-#, fuzzy
+#: gtk2_ardour/editor_actions.cc:237
 msgid "Insert Chunk"
 msgstr "Вставить фрагмент"
 
-#: editor_actions.cc:238
-#, fuzzy
+#: gtk2_ardour/editor_actions.cc:240
 msgid "Split at edit cursor"
-msgstr "��т начала до курсора"
+msgstr "��азделить по курсору редактора"
 
-#: editor_actions.cc:241
-#, fuzzy
+#: gtk2_ardour/editor_actions.cc:243
 msgid "Start Range"
-msgstr "Разделить область"
+msgstr ""
 
-#: editor_actions.cc:243
+#: gtk2_ardour/editor_actions.cc:245
 msgid "Finish Range"
 msgstr ""
 
-#: editor_actions.cc:245
+#: gtk2_ardour/editor_actions.cc:247
 msgid "Finish add Range"
 msgstr ""
 
-#: editor_actions.cc:248
+#: gtk2_ardour/editor_actions.cc:250
 msgid "Extend Range to End of Region"
 msgstr ""
 
-#: editor_actions.cc:250
+#: gtk2_ardour/editor_actions.cc:252
 #, fuzzy
 msgid "Extend Range to Start of Region"
 msgstr "В начало сессии"
 
-#: editor_actions.cc:253
-#, fuzzy
+#: gtk2_ardour/editor_actions.cc:255
 msgid "Follow Playhead"
 msgstr "Следовать за указателем"
 
-#: editor_actions.cc:261
-#, fuzzy
+#: gtk2_ardour/editor_actions.cc:263
 msgid "Zoom Focus Left"
-msgstr "��асштабировать к"
+msgstr "��окус влево"
 
-#: editor_actions.cc:263
-#, fuzzy
+#: gtk2_ardour/editor_actions.cc:265
 msgid "Zoom Focus Right"
-msgstr "��асштабировать к"
+msgstr "��окус вправо"
 
-#: editor_actions.cc:265
-#, fuzzy
+#: gtk2_ardour/editor_actions.cc:267
 msgid "Zoom Focus Center"
-msgstr "��асштабировать к"
+msgstr "��окус по центру"
 
-#: editor_actions.cc:267
-#, fuzzy
+#: gtk2_ardour/editor_actions.cc:269
 msgid "Zoom Focus Playhead"
-msgstr "��асштабировать к"
+msgstr "��окус по указателю"
 
-#: editor_actions.cc:269
-#, fuzzy
+#: gtk2_ardour/editor_actions.cc:271
 msgid "Zoom Focus Edit"
-msgstr "��асштабировать к"
+msgstr "��окус по курсору"
 
-#: editor_actions.cc:275
+#: gtk2_ardour/editor_actions.cc:277
 msgid "Object Tool"
-msgstr ""
+msgstr "Объект"
 
-#: editor_actions.cc:276
-#, fuzzy
+#: gtk2_ardour/editor_actions.cc:278
 msgid "Range Tool"
-msgstr "��ыделять"
+msgstr "��бласть"
 
-#: editor_actions.cc:277
+#: gtk2_ardour/editor_actions.cc:279
 msgid "Gain Tool"
-msgstr ""
+msgstr "Усиление"
 
-#: editor_actions.cc:278
-#, fuzzy
+#: gtk2_ardour/editor_actions.cc:280
 msgid "Zoom Tool"
-msgstr "��меньшить"
+msgstr "��упа"
 
-#: editor_actions.cc:279
+#: gtk2_ardour/editor_actions.cc:281
 msgid "Timefx Tool"
-msgstr ""
+msgstr "Время"
 
-#: editor_actions.cc:286
-#, fuzzy
+#: gtk2_ardour/editor_actions.cc:286
+msgid "Snap To"
+msgstr "Привязка"
+
+#: gtk2_ardour/editor_actions.cc:288
 msgid "Snap to frame"
-msgstr "Привязка к"
+msgstr "Привязка к выборке"
 
-#: editor_actions.cc:287
-#, fuzzy
+#: gtk2_ardour/editor_actions.cc:289
 msgid "Snap to cd frame"
-msgstr "Привязка к"
+msgstr "Привязка к выборке CD"
 
-#: editor_actions.cc:288
-#, fuzzy
+#: gtk2_ardour/editor_actions.cc:290
 msgid "Snap to SMPTE frame"
-msgstr "SMPTE Кадры/Секунды"
+msgstr "Привязка к кадру SMPTE"
 
-#: editor_actions.cc:289
-#, fuzzy
+#: gtk2_ardour/editor_actions.cc:291
 msgid "Snap to SMPTE seconds"
-msgstr "SMPTE Кадры/Секунды"
+msgstr "Привязка к секундам SMPTE"
 
-#: editor_actions.cc:290
+#: gtk2_ardour/editor_actions.cc:292
 msgid "Snap to SMPTE minutes"
-msgstr ""
+msgstr "Привязка к минутам SMPTE"
 
-#: editor_actions.cc:291
-#, fuzzy
+#: gtk2_ardour/editor_actions.cc:293
 msgid "Snap to seconds"
-msgstr "��инуты:Секунды"
+msgstr "��ривязка к секундам"
 
-#: editor_actions.cc:292
+#: gtk2_ardour/editor_actions.cc:294
 msgid "Snap to minutes"
-msgstr ""
+msgstr "Привязка к минутам"
 
-#: editor_actions.cc:293
-#, fuzzy
+#: gtk2_ardour/editor_actions.cc:295
 msgid "Snap to thirtyseconds"
-msgstr "тридцать-вторых (32)"
+msgstr "Привязка по 30 секундам"
 
-#: editor_actions.cc:294
+#: gtk2_ardour/editor_actions.cc:296
 msgid "Snap to asixteenthbeat"
-msgstr ""
+msgstr "Привязка к 1/16"
 
-#: editor_actions.cc:295
+#: gtk2_ardour/editor_actions.cc:297
 msgid "Snap to eighths"
-msgstr ""
+msgstr "Привязка к 1/8"
 
-#: editor_actions.cc:296
+#: gtk2_ardour/editor_actions.cc:298
 msgid "Snap to quarters"
-msgstr ""
+msgstr "Привязка к 1/4"
 
-#: editor_actions.cc:297
-#, fuzzy
+#: gtk2_ardour/editor_actions.cc:299
 msgid "Snap to thirds"
-msgstr "Привязка к"
+msgstr "Привязка к 1/3"
 
-#: editor_actions.cc:298
-#, fuzzy
+#: gtk2_ardour/editor_actions.cc:300
 msgid "Snap to beat"
-msgstr "Привязка к"
+msgstr "Привязка к доле"
 
-#: editor_actions.cc:299
-#, fuzzy
+#: gtk2_ardour/editor_actions.cc:301
 msgid "Snap to bar"
-msgstr "Привязка к"
+msgstr "Привязка к такту"
 
-#: editor_actions.cc:300
-#, fuzzy
+#: gtk2_ardour/editor_actions.cc:302
 msgid "Snap to mark"
-msgstr "��обавить маркер"
+msgstr "��ривязка к маркеру"
 
-#: editor_actions.cc:301
-#, fuzzy
+#: gtk2_ardour/editor_actions.cc:303
 msgid "Snap to edit cursor"
-msgstr "��т начала до курсора"
+msgstr "��ривязка к курсору редактора"
 
-#: editor_actions.cc:302
-#, fuzzy
+#: gtk2_ardour/editor_actions.cc:304
 msgid "Snap to region start"
-msgstr "��ач. областей"
+msgstr "��ривязка к началу области"
 
-#: editor_actions.cc:303
-#, fuzzy
+#: gtk2_ardour/editor_actions.cc:305
 msgid "Snap to region end"
-msgstr "��конч. областей"
+msgstr "��ривязка к концу области"
 
-#: editor_actions.cc:304
-#, fuzzy
+#: gtk2_ardour/editor_actions.cc:306
 msgid "Snap to region sync"
-msgstr "Создать моно-области"
+msgstr ""
 
-#: editor_actions.cc:305
+#: gtk2_ardour/editor_actions.cc:307
 msgid "Snap to region boundary"
-msgstr ""
+msgstr "Привязка к границам области"
 
-#. the region list popup menu
-#: editor_actions.cc:314
-#, fuzzy
+#: gtk2_ardour/editor_actions.cc:316
 msgid "Sort"
-msgstr "порт"
+msgstr ""
 
-#: editor_actions.cc:322
+#: gtk2_ardour/editor_actions.cc:324
 msgid "Show all"
 msgstr "Показать всё"
 
-#: editor_actions.cc:323
-#, fuzzy
+#: gtk2_ardour/editor_actions.cc:325
 msgid "Show automatic regions"
-msgstr "��втомат"
+msgstr "��оказать автомат. области"
 
-#: editor_actions.cc:325
+#: gtk2_ardour/editor_actions.cc:327
 msgid "Ascending"
-msgstr "�о возрастанию"
+msgstr "�о возрастанию"
 
-#: editor_actions.cc:327
+#: gtk2_ardour/editor_actions.cc:329
 msgid "Descending"
-msgstr "�о убыванию"
+msgstr "�о убыванию"
 
-#: editor_actions.cc:330
+#: gtk2_ardour/editor_actions.cc:332
 msgid "By Region Name"
-msgstr "�о имени области"
+msgstr "�о имени области"
 
-#: editor_actions.cc:332
+#: gtk2_ardour/editor_actions.cc:334
 msgid "By Region Length"
-msgstr "��о длине области"
+msgstr "��о длительности области"
 
-#: editor_actions.cc:334
+#: gtk2_ardour/editor_actions.cc:336
 msgid "By Region Position"
-msgstr "�о расположению области"
+msgstr "�о расположению области"
 
-#: editor_actions.cc:336
+#: gtk2_ardour/editor_actions.cc:338
 msgid "By Region Timestamp"
-msgstr "�о времени создания области"
+msgstr "�о времени создания области"
 
-#: editor_actions.cc:338
+#: gtk2_ardour/editor_actions.cc:340
 msgid "By Region Start in File"
-msgstr "�о началу области в файле"
+msgstr "�о началу области в файле"
 
-#: editor_actions.cc:340
+#: gtk2_ardour/editor_actions.cc:342
 msgid "By Region End in File"
-msgstr "�о концу области в файле"
+msgstr "�о концу области в файле"
 
-#: editor_actions.cc:342
+#: gtk2_ardour/editor_actions.cc:344
 msgid "By Source File Name"
-msgstr "��о имени файла"
+msgstr "��о имени исходного файла"
 
-#: editor_actions.cc:344
+#: gtk2_ardour/editor_actions.cc:346
 msgid "By Source File Length"
-msgstr "��о размеру файла"
+msgstr "��о длительности исходного файла"
 
-#: editor_actions.cc:346
+#: gtk2_ardour/editor_actions.cc:348
 msgid "By Source File Creation Date"
-msgstr "�о дате создания исходного файла"
+msgstr "�о дате создания исходного файла"
 
-#: editor_actions.cc:348
+#: gtk2_ardour/editor_actions.cc:350
 msgid "By Source Filesystem"
-msgstr "��о расположению файла"
+msgstr "��о исходной файловой системе"
 
-#. the next two are duplicate items with different names for use in two different contexts
-#: editor_actions.cc:354
-#, fuzzy
+#: gtk2_ardour/editor_actions.cc:356
 msgid "Add External Audio"
-msgstr "Добавить в�� внешний список областей"
+msgstr "Добавить в��ешний звуковой файл"
 
-#: editor_actions.cc:356
-#, fuzzy
+#: gtk2_ardour/editor_actions.cc:358
 msgid "as Region(s)"
-msgstr "��оспроизвести выделенную область"
+msgstr "��ак область(-и)"
 
-#: editor_actions.cc:358
-#, fuzzy
+#: gtk2_ardour/editor_actions.cc:360
 msgid "as Tracks"
-msgstr "��реки"
+msgstr "��ак дорожки"
 
-#: editor_actions.cc:360
-#, fuzzy
+#: gtk2_ardour/editor_actions.cc:362
+msgid "as Tape Tracks"
+msgstr ""
+
+#: gtk2_ardour/editor_actions.cc:364
 msgid "to Tracks"
-msgstr "��реки"
+msgstr "�� дорожки"
 
-#: editor_actions.cc:363
-#, fuzzy
+#: gtk2_ardour/editor_actions.cc:367
 msgid "Show Waveforms"
-msgstr "��тображать форму сигнала"
+msgstr "��оказывать форму сигнала"
 
-#: editor_actions.cc:364
-#, fuzzy
+#: gtk2_ardour/editor_actions.cc:368
 msgid "Show Waveforms While Recording"
-msgstr "��тображать форму сигнала"
+msgstr "��оказывать форму сигнала при записи"
 
-#: editor_actions.cc:365
-#, fuzzy
+#: gtk2_ardour/editor_actions.cc:369
 msgid "Show Measures"
 msgstr "Показывать линии тактов"
 
-#: editor_actions.cc:378 editor_actions.cc:385
+#: gtk2_ardour/editor_actions.cc:382 gtk2_ardour/editor_actions.cc:389
 msgid "Medium"
-msgstr ""
+msgstr "Средне"
 
-#: editor_actions.cc:380
-#, fuzzy
+#: gtk2_ardour/editor_actions.cc:384
 msgid "Faster"
-msgstr "��атухание"
+msgstr "��ыстрее"
 
-#: editor_actions.cc:386
+#: gtk2_ardour/editor_actions.cc:390
 msgid "Long"
-msgstr ""
+msgstr "Долгая"
 
-#: editor_actions.cc:390
+#: gtk2_ardour/editor_actions.cc:394
 #, fuzzy
 msgid "Later is Higher"
 msgstr "Опустить область на один слой"
 
-#: editor_actions.cc:391
+#: gtk2_ardour/editor_actions.cc:395
 #, fuzzy
 msgid "Most Recently Moved/Added is Higher"
 msgstr "Опустить область на один слой"
 
-#: editor_actions.cc:392
+#: gtk2_ardour/editor_actions.cc:396
 #, fuzzy
 msgid "Most Recently Added is Higher"
 msgstr "Опустить область на один слой"
 
-#: editor_audio_import.cc:72
+#: gtk2_ardour/editor_actions.cc:400
+msgid "23.976"
+msgstr ""
+
+#: gtk2_ardour/editor_actions.cc:401
+msgid "24"
+msgstr ""
+
+#: gtk2_ardour/editor_actions.cc:402
+msgid "24.976"
+msgstr ""
+
+#: gtk2_ardour/editor_actions.cc:403
+msgid "25"
+msgstr ""
+
+#: gtk2_ardour/editor_actions.cc:404
+msgid "29.97"
+msgstr ""
+
+#: gtk2_ardour/editor_actions.cc:405
+msgid "29.97 drop"
+msgstr ""
+
+#: gtk2_ardour/editor_actions.cc:406
+msgid "30"
+msgstr ""
+
+#: gtk2_ardour/editor_actions.cc:407
+msgid "30 drop"
+msgstr ""
+
+#: gtk2_ardour/editor_actions.cc:408
+msgid "59.94"
+msgstr ""
+
+#: gtk2_ardour/editor_actions.cc:409
+msgid "60"
+msgstr ""
+
+#: gtk2_ardour/editor_actions.cc:413
+#, c-format
+msgid "+4.1667% + 0.1%"
+msgstr ""
+
+#: gtk2_ardour/editor_actions.cc:414
+msgid "+4.1667%"
+msgstr ""
+
+#: gtk2_ardour/editor_actions.cc:415
+#, c-format
+msgid "+4.1667% - 0.1%"
+msgstr ""
+
+#: gtk2_ardour/editor_actions.cc:416
+msgid "+ 0.1%"
+msgstr ""
+
+#: gtk2_ardour/editor_actions.cc:418
+msgid "- 0.1%"
+msgstr ""
+
+#: gtk2_ardour/editor_actions.cc:419
+#, c-format
+msgid "-4.1667% + 0.1%"
+msgstr ""
+
+#: gtk2_ardour/editor_actions.cc:420
+msgid "-4.1667%"
+msgstr ""
+
+#: gtk2_ardour/editor_actions.cc:421
+#, c-format
+msgid "-4.1667% - 0.1%"
+msgstr ""
+
+#: gtk2_ardour/editor_audio_import.cc:75
 #, fuzzy
 msgid "You can't import or embed an audiofile until you have a session loaded."
 msgstr "Вы не можете импортировать аудиофайл пока сессия не загружена."
 
-#: editor_audio_import.cc:77
+#: gtk2_ardour/editor_audio_import.cc:80
 #, fuzzy
 msgid "Add existing audio to session"
 msgstr "использовать имеющийся шаблон"
 
-#: editor_audio_import.cc:142
+#: gtk2_ardour/editor_audio_import.cc:145
 #, fuzzy
 msgid "ardour: importing %1"
 msgstr "ardour: экспорт"
 
-#: editor_audio_import.cc:146
+#: gtk2_ardour/editor_audio_import.cc:149
 msgid "Cancel Import"
 msgstr "Отменить импорт"
 
-#: editor_audio_import.cc:224
+#: gtk2_ardour/editor_audio_import.cc:227
 #, fuzzy
 msgid "Editor: cannot open file \"%1\", (%2)"
 msgstr "Редактор: не удалось открыть файл \"%1\" (%2)"
 
-#: editor_audio_import.cc:232
+#: gtk2_ardour/editor_audio_import.cc:235
 #, fuzzy
 msgid "Cancel entire import"
 msgstr "Отменить импорт"
 
-#: editor_audio_import.cc:233
+#: gtk2_ardour/editor_audio_import.cc:236
 #, fuzzy
 msgid "Don't embed it"
 msgstr "Отмена"
 
-#: editor_audio_import.cc:234
+#: gtk2_ardour/editor_audio_import.cc:237
 msgid "Embed all without questions"
 msgstr ""
 
-#: editor_audio_import.cc:239
+#: gtk2_ardour/editor_audio_import.cc:242
 msgid "Embed it anyway"
 msgstr ""
 
-#: editor_audio_import.cc:242
+#: gtk2_ardour/editor_audio_import.cc:245
 #, fuzzy
 msgid ""
 "%1\n"
@@ -3480,284 +3359,283 @@ msgstr ""
 "Выбранный аудиофайл имеет частоту дискретизации данных\n"
 "отличную от текущей сессии!"
 
-#: editor_audio_import.cc:275
+#: gtk2_ardour/editor_audio_import.cc:278
 msgid "could not open %1"
 msgstr "не удалось открыть %1"
 
-#: editor_audio_import.cc:320
+#: gtk2_ardour/editor_audio_import.cc:323
 #, fuzzy
 msgid "insert sndfile"
 msgstr "Вставить внешний аудиофайл"
 
-#. stuff for the verbose canvas cursor
-#: editor_canvas.cc:118
+#: gtk2_ardour/editor_canvas.cc:119
 msgid "VerboseCanvasCursor"
 msgstr ""
 
-#: editor_edit_groups.cc:53 mixer_ui.cc:736
+#: gtk2_ardour/editor_edit_groups.cc:53 gtk2_ardour/mixer_ui.cc:754
 #, fuzzy
 msgid "Activate All"
 msgstr "Активировать"
 
-#: editor_edit_groups.cc:54 mixer_ui.cc:737
+#: gtk2_ardour/editor_edit_groups.cc:54 gtk2_ardour/mixer_ui.cc:755
 #, fuzzy
 msgid "Disable All"
 msgstr "Отсоединить"
 
-#: editor_edit_groups.cc:56 mixer_ui.cc:739
+#: gtk2_ardour/editor_edit_groups.cc:56 gtk2_ardour/mixer_ui.cc:757
 #, fuzzy
 msgid "Add group"
 msgstr "Нет группы"
 
-#: editor_edit_groups.cc:229 mixer_ui.cc:970
+#: gtk2_ardour/editor_edit_groups.cc:229 gtk2_ardour/mixer_ui.cc:988
 #, fuzzy
 msgid "unnamed"
 msgstr "Переименовать"
 
-#: editor_edit_groups.cc:258 mixer_ui.cc:834
+#: gtk2_ardour/editor_edit_groups.cc:258 gtk2_ardour/mixer_ui.cc:852
 msgid "-all-"
 msgstr "-все-"
 
-#: editor_export_audio.cc:65
+#: gtk2_ardour/editor_export_audio.cc:67
 msgid ""
 "There is no selection to export.\n"
 "\n"
 "Select a selection using the range mouse mode"
 msgstr ""
 
-#: editor_export_audio.cc:110
+#: gtk2_ardour/editor_export_audio.cc:112
 msgid ""
 "There are no ranges to export.\n"
 "\n"
 "Create 1 or more ranges by dragging the mouse in the range bar"
 msgstr ""
 
-#: editor_imageframe.cc:625 editor_imageframe.cc:655
+#: gtk2_ardour/editor_imageframe.cc:625 gtk2_ardour/editor_imageframe.cc:655
 msgid "programming error: no ImageFrameView selected"
 msgstr "ошибка в программе: no ImageFrameView selected"
 
-#: editor_imageframe.cc:848 editor_imageframe.cc:870
+#: gtk2_ardour/editor_imageframe.cc:848 gtk2_ardour/editor_imageframe.cc:870
 msgid "programming error: no MarkerView selected"
 msgstr "ошибка в программе: no MarkerView selected"
 
-#: editor_keyboard.cc:104
+#: gtk2_ardour/editor_keyboard.cc:105
 #, fuzzy
 msgid "mute region"
 msgstr "отключить воспроизведение этой области"
 
-#: editor_keys.cc:46
+#: gtk2_ardour/editor_keys.cc:46
 #, fuzzy
 msgid "keyboard selection"
 msgstr "Выделить по интервалу"
 
-#: editor_markers.cc:292 editor_ops.cc:1290 editor_ops.cc:1303
-#: editor_ops.cc:1321 location_ui.cc:774
+#: gtk2_ardour/editor_markers.cc:293 gtk2_ardour/editor_ops.cc:1297
+#: gtk2_ardour/editor_ops.cc:1311 gtk2_ardour/editor_ops.cc:1330
+#: gtk2_ardour/location_ui.cc:776
 msgid "add marker"
 msgstr "добавить маркер"
 
-#: editor_markers.cc:307 editor_markers.cc:380 editor_markers.cc:552
-#: editor_markers.cc:570 editor_markers.cc:589 editor_markers.cc:608
-#: editor_markers.cc:638 editor_markers.cc:666 editor_markers.cc:694
-#: editor_markers.cc:732 editor_markers.cc:759 editor_markers.cc:782
-#: editor_markers.cc:801 editor_mouse.cc:2015 editor_mouse.cc:4275
+#: gtk2_ardour/editor_markers.cc:309 gtk2_ardour/editor_markers.cc:383
+#: gtk2_ardour/editor_markers.cc:555 gtk2_ardour/editor_markers.cc:573
+#: gtk2_ardour/editor_markers.cc:592 gtk2_ardour/editor_markers.cc:611
+#: gtk2_ardour/editor_markers.cc:641 gtk2_ardour/editor_markers.cc:669
+#: gtk2_ardour/editor_markers.cc:697 gtk2_ardour/editor_markers.cc:735
+#: gtk2_ardour/editor_markers.cc:762 gtk2_ardour/editor_markers.cc:785
+#: gtk2_ardour/editor_markers.cc:804 gtk2_ardour/editor_mouse.cc:2027
+#: gtk2_ardour/editor_mouse.cc:4322
 msgid "programming error: marker canvas item has no marker object pointer!"
 msgstr "ошибка в программе: marker canvas item has no marker object pointer!"
 
-#: editor_markers.cc:331 location_ui.cc:656
+#: gtk2_ardour/editor_markers.cc:333 gtk2_ardour/location_ui.cc:657
 msgid "remove marker"
 msgstr ""
 
-#: editor_markers.cc:458
+#: gtk2_ardour/editor_markers.cc:461
 #, fuzzy
 msgid "Locate to Mark"
 msgstr "Маркеры интервалов"
 
-#: editor_markers.cc:459
-#, fuzzy
+#: gtk2_ardour/editor_markers.cc:462
 msgid "Play from Mark"
-msgstr "Воспроизвести с ��ачала"
+msgstr "Воспроизвести с ��аркера"
 
-#: editor_markers.cc:460
-#, fuzzy
+#: gtk2_ardour/editor_markers.cc:463
 msgid "Set Mark from Playhead"
-msgstr "��оспроизвести от указателя"
+msgstr "��становить маркер на указатель"
 
-#: editor_markers.cc:464
-#, fuzzy
+#: gtk2_ardour/editor_markers.cc:467
 msgid "Rename Mark"
-msgstr "Переименовать"
+msgstr "Переименовать маркер"
 
-#: editor_markers.cc:465
-#, fuzzy
+#: gtk2_ardour/editor_markers.cc:468
 msgid "Hide Mark"
-msgstr "Скрыть трек"
+msgstr "Скрыть маркер"
 
-#: editor_markers.cc:466
-#, fuzzy
+#: gtk2_ardour/editor_markers.cc:469
 msgid "Remove Mark"
-msgstr "Удалить ��оле"
+msgstr "Удалить ��аркер"
 
-#: editor_markers.cc:479 editor_markers.cc:535
+#: gtk2_ardour/editor_markers.cc:482 gtk2_ardour/editor_markers.cc:538
 #, fuzzy
 msgid "Locate to Range Mark"
 msgstr "Маркеры интервалов"
 
-#: editor_markers.cc:480 editor_markers.cc:536
+#: gtk2_ardour/editor_markers.cc:483 gtk2_ardour/editor_markers.cc:539
 #, fuzzy
 msgid "Play from Range Mark"
 msgstr "Воспроизвести \"кольцо\""
 
-#: editor_markers.cc:481
+#: gtk2_ardour/editor_markers.cc:484
 #, fuzzy
 msgid "Loop Range"
 msgstr "Воспроизвести \"кольцо\""
 
-#: editor_markers.cc:482 editor_markers.cc:537
+#: gtk2_ardour/editor_markers.cc:485 gtk2_ardour/editor_markers.cc:540
 #, fuzzy
 msgid "Set Range Mark from Playhead"
 msgstr "Воспроизвести от указателя"
 
-#: editor_markers.cc:483 editor_markers.cc:538
+#: gtk2_ardour/editor_markers.cc:486 gtk2_ardour/editor_markers.cc:541
 #, fuzzy
 msgid "Set Range from Range Selection"
 msgstr "Воспроизвести выделенное"
 
-#: editor_markers.cc:487
+#: gtk2_ardour/editor_markers.cc:490
 #, fuzzy
 msgid "Rename Range"
 msgstr "Переименовать"
 
-#: editor_markers.cc:488 editor_markers.cc:540
+#: gtk2_ardour/editor_markers.cc:491 gtk2_ardour/editor_markers.cc:543
 #, fuzzy
 msgid "Hide Range"
 msgstr "выделять"
 
-#: editor_markers.cc:489
+#: gtk2_ardour/editor_markers.cc:492
 #, fuzzy
 msgid "Remove Range"
 msgstr "Удалить поле"
 
-#: editor_markers.cc:493 editor_markers.cc:542
+#: gtk2_ardour/editor_markers.cc:496 gtk2_ardour/editor_markers.cc:545
 #, fuzzy
 msgid "Separate Regions in Range"
 msgstr "Создать область из выделенного"
 
-#: editor_markers.cc:494 editor_markers.cc:543
+#: gtk2_ardour/editor_markers.cc:497 gtk2_ardour/editor_markers.cc:546
 #, fuzzy
 msgid "Select All in Range"
 msgstr "Выделить всё"
 
-#: editor_markers.cc:520
+#: gtk2_ardour/editor_markers.cc:523
 msgid "Set Loop Range"
 msgstr ""
 
-#: editor_markers.cc:521
+#: gtk2_ardour/editor_markers.cc:524
 msgid "Set Punch Range"
 msgstr ""
 
-#: editor_markers.cc:815
+#: gtk2_ardour/editor_markers.cc:818
 #, fuzzy
 msgid "New Name:"
 msgstr "новое имя: "
 
-#: editor_markers.cc:818
+#: gtk2_ardour/editor_markers.cc:821
 msgid "ardour: rename mark"
 msgstr "ardour: переименовать маркер"
 
-#: editor_markers.cc:820
+#: gtk2_ardour/editor_markers.cc:823
 #, fuzzy
 msgid "ardour: rename range"
 msgstr "ardour: переименовать область"
 
-#: editor_markers.cc:840
+#: gtk2_ardour/editor_markers.cc:843
 #, fuzzy
 msgid "rename marker"
 msgstr "добавить маркер"
 
-#: editor_markers.cc:865
+#: gtk2_ardour/editor_markers.cc:869
 #, fuzzy
 msgid "set loop range"
 msgstr "выбрать окно просмотра"
 
-#: editor_markers.cc:891
+#: gtk2_ardour/editor_markers.cc:897
 #, fuzzy
 msgid "set punch range"
 msgstr "Выбрать текущий интервал"
 
-#: editor_mouse.cc:103
+#: gtk2_ardour/editor_mouse.cc:105
 msgid "Editor::event_frame() used on unhandled event type %1"
 msgstr "Editor::event_frame() used on unhandled event type %1"
 
-#: editor_mouse.cc:313
+#: gtk2_ardour/editor_mouse.cc:315
 #, fuzzy
 msgid "select on click"
 msgstr "Использовать как щелчок метронома"
 
-#: editor_mouse.cc:1590
+#: gtk2_ardour/editor_mouse.cc:1596
 msgid "programming error: start_grab called without drag item"
 msgstr "ошибка в программе: start_grab called without drag item"
 
-#: editor_mouse.cc:1814
+#: gtk2_ardour/editor_mouse.cc:1820
 #, fuzzy
 msgid "change fade in length"
 msgstr "редактировать введение в уровень"
 
-#: editor_mouse.cc:1832
+#: gtk2_ardour/editor_mouse.cc:1841
 #, fuzzy
 msgid "programming error: fade out canvas item has no regionview data pointer!"
 msgstr "ошибка в программе: cursor canvas item has no cursor data pointer!"
 
-#: editor_mouse.cc:1906
+#: gtk2_ardour/editor_mouse.cc:1915
 #, fuzzy
 msgid "change fade out length"
 msgstr "редактировать сведение в ноль"
 
-#: editor_mouse.cc:1925
+#: gtk2_ardour/editor_mouse.cc:1937
 msgid "programming error: cursor canvas item has no cursor data pointer!"
 msgstr "ошибка в программе: cursor canvas item has no cursor data pointer!"
 
-#: editor_mouse.cc:2142
+#: gtk2_ardour/editor_mouse.cc:2162
 #, fuzzy
 msgid "move marker"
 msgstr "Удалить поле"
 
-#: editor_mouse.cc:2165 editor_mouse.cc:2196 editor_tempodisplay.cc:459
-msgid ""
-"programming error: meter marker canvas item has no marker object pointer!"
-msgstr ""
-"ошибка в программе: meter marker canvas item has no marker object pointer!"
+#: gtk2_ardour/editor_mouse.cc:2190 gtk2_ardour/editor_mouse.cc:2221
+#: gtk2_ardour/editor_tempodisplay.cc:490
+msgid "programming error: meter marker canvas item has no marker object pointer!"
+msgstr "ошибка в программе: meter marker canvas item has no marker object pointer!"
 
-#: editor_mouse.cc:2264
+#: gtk2_ardour/editor_mouse.cc:2289
 #, fuzzy
 msgid "copy meter mark"
 msgstr "добавить маркер"
 
-#: editor_mouse.cc:2274
+#: gtk2_ardour/editor_mouse.cc:2300
 msgid "move meter mark"
 msgstr ""
 
-#: editor_mouse.cc:2289 editor_mouse.cc:2322 editor_tempodisplay.cc:331
-#: editor_tempodisplay.cc:409 editor_tempodisplay.cc:428
-msgid ""
-"programming error: tempo marker canvas item has no marker object pointer!"
-msgstr ""
-"ошибка в программе: tempo marker canvas item has no marker object pointer!"
+#: gtk2_ardour/editor_mouse.cc:2316 gtk2_ardour/editor_mouse.cc:2349
+#: gtk2_ardour/editor_tempodisplay.cc:353
+#: gtk2_ardour/editor_tempodisplay.cc:437
+#: gtk2_ardour/editor_tempodisplay.cc:456
+msgid "programming error: tempo marker canvas item has no marker object pointer!"
+msgstr "ошибка в программе: tempo marker canvas item has no marker object pointer!"
 
-#: editor_mouse.cc:2294 editor_mouse.cc:2327 editor_tempodisplay.cc:336
-#: editor_tempodisplay.cc:414
+#: gtk2_ardour/editor_mouse.cc:2321 gtk2_ardour/editor_mouse.cc:2354
+#: gtk2_ardour/editor_tempodisplay.cc:358
+#: gtk2_ardour/editor_tempodisplay.cc:442
 msgid "programming error: marker for tempo is not a tempo marker!"
 msgstr "ошибка в программе: marker for tempo is not a tempo marker!"
 
-#: editor_mouse.cc:2394
+#: gtk2_ardour/editor_mouse.cc:2421
 #, fuzzy
 msgid "copy tempo mark"
 msgstr "добавить маркер"
 
-#: editor_mouse.cc:2404
+#: gtk2_ardour/editor_mouse.cc:2432
 msgid "move tempo mark"
 msgstr ""
 
-#: editor_mouse.cc:2418 editor_mouse.cc:2437 editor_mouse.cc:2450
+#: gtk2_ardour/editor_mouse.cc:2447 gtk2_ardour/editor_mouse.cc:2466
+#: gtk2_ardour/editor_mouse.cc:2479
 msgid ""
 "programming error: control point canvas item has no control point object "
 "pointer!"
@@ -3765,349 +3643,344 @@ msgstr ""
 "ошибка в программе: control point canvas item has no control point object "
 "pointer!"
 
-#: editor_mouse.cc:2555
+#: gtk2_ardour/editor_mouse.cc:2585
 msgid "programming error: line canvas item has no line pointer!"
 msgstr "ошибка в программе: line canvas item has no line pointer!"
 
-#: editor_mouse.cc:2664
+#: gtk2_ardour/editor_mouse.cc:2694
 #, fuzzy
 msgid "move region(s)"
 msgstr "Создать область"
 
-#: editor_mouse.cc:2727
+#: gtk2_ardour/editor_mouse.cc:2757
 #, fuzzy
 msgid "Drag region brush"
 msgstr "прослушать область"
 
-#. don't copy again
-#. this is committed in the grab finished callback.
-#: editor_mouse.cc:2751
+#: gtk2_ardour/editor_mouse.cc:2781
 msgid "Drag region copy"
 msgstr ""
 
-#. A selection grab currently creates two undo/redo operations, one for
-#. creating the new region and another for moving it.
-#.
-#: editor_mouse.cc:3609
+#: gtk2_ardour/editor_mouse.cc:3641
 #, fuzzy
 msgid "selection grab"
 msgstr "Выделенное"
 
-#: editor_mouse.cc:3650
+#: gtk2_ardour/editor_mouse.cc:3683
 #, fuzzy
 msgid "cancel selection"
 msgstr "Воспроизвести выделенное"
 
-#: editor_mouse.cc:3760
+#: gtk2_ardour/editor_mouse.cc:3793
 #, fuzzy
 msgid "range selection"
 msgstr "Воспроизвести выделенное"
 
-#: editor_mouse.cc:3776
+#: gtk2_ardour/editor_mouse.cc:3809
 #, fuzzy
 msgid "trim selection start"
 msgstr "Выделить по интервалу"
 
-#: editor_mouse.cc:3792
+#: gtk2_ardour/editor_mouse.cc:3825
 #, fuzzy
 msgid "trim selection end"
 msgstr "Выделить по интервалу"
 
-#: editor_mouse.cc:3809
+#: gtk2_ardour/editor_mouse.cc:3842
 #, fuzzy
 msgid "move selection"
 msgstr "Свести выделенное"
 
-#: editor_mouse.cc:4195
+#: gtk2_ardour/editor_mouse.cc:4231
 #, fuzzy
 msgid "Start point trim"
 msgstr "От начала до курсора"
 
-#: editor_mouse.cc:4223
+#: gtk2_ardour/editor_mouse.cc:4263
 msgid "End point trim"
 msgstr ""
 
-#: editor_mouse.cc:4262
+#: gtk2_ardour/editor_mouse.cc:4306
 msgid "trimmed region"
 msgstr ""
 
-#: editor_mouse.cc:4400
-#, fuzzy
+#: gtk2_ardour/editor_mouse.cc:4448
 msgid "new range marker"
-msgstr "��аркеры интервалов"
+msgstr "��овый маркер области"
 
-#: editor_mouse.cc:4642
+#: gtk2_ardour/editor_mouse.cc:4692
 #, fuzzy
 msgid "select regions"
 msgstr "Воспроизвести выделенную область"
 
-#: editor_mouse.cc:4671
+#: gtk2_ardour/editor_mouse.cc:4721
 msgid "Name for region:"
 msgstr "Имя области: "
 
-#: editor_mouse.cc:4735
+#: gtk2_ardour/editor_mouse.cc:4785
 #, fuzzy
 msgid "timestretch"
 msgstr "ardour: эффект timestretch"
 
-#: editor_ops.cc:195
+#: gtk2_ardour/editor_ops.cc:196
 #, fuzzy
 msgid "split"
 msgstr "Склеить"
 
-#: editor_ops.cc:231
+#: gtk2_ardour/editor_ops.cc:235
 #, fuzzy
 msgid "remove region"
 msgstr "Создать область"
 
-#: editor_ops.cc:250
+#: gtk2_ardour/editor_ops.cc:255
 msgid ""
 " This is destructive, will possibly delete audio files\n"
 "It cannot be undone\n"
 "Do you really want to destroy %1 ?"
 msgstr ""
 
-#: editor_ops.cc:254
+#: gtk2_ardour/editor_ops.cc:259
 #, fuzzy
 msgid "these regions"
 msgstr "Воспроизвести выделенную область"
 
-#: editor_ops.cc:254
+#: gtk2_ardour/editor_ops.cc:259
 #, fuzzy
 msgid "this region"
 msgstr "отключить воспроизведение этой области"
 
-#: editor_ops.cc:256 editor_ops.cc:3318 route_ui.cc:707
-#: visual_time_axis.cc:278
+#: gtk2_ardour/editor_ops.cc:261 gtk2_ardour/editor_ops.cc:3364
+#: gtk2_ardour/route_ui.cc:715 gtk2_ardour/visual_time_axis.cc:278
 msgid "No, do nothing."
 msgstr "Нет"
 
-#: editor_ops.cc:259
+#: gtk2_ardour/editor_ops.cc:264
 #, fuzzy
 msgid "Yes, destroy them."
 msgstr "Да"
 
-#: editor_ops.cc:261 editor_ops.cc:3319
+#: gtk2_ardour/editor_ops.cc:266 gtk2_ardour/editor_ops.cc:3365
 msgid "Yes, destroy it."
 msgstr "Да"
 
-#: editor_ops.cc:352 editor_ops.cc:380
+#: gtk2_ardour/editor_ops.cc:355 gtk2_ardour/editor_ops.cc:383
 #, fuzzy
 msgid "extend selection"
 msgstr "Выделить по интервалу"
 
-#: editor_ops.cc:396 editor_ops.cc:430 editor_ops.cc:474 editor_ops.cc:500
+#: gtk2_ardour/editor_ops.cc:399 gtk2_ardour/editor_ops.cc:434
+#: gtk2_ardour/editor_ops.cc:479 gtk2_ardour/editor_ops.cc:506
 msgid "nudge forward"
 msgstr ""
 
-#: editor_ops.cc:564
+#: gtk2_ardour/editor_ops.cc:571
 msgid "build_region_boundary_cache called with snap_type = %1"
 msgstr "build_region_boundary_cache called with snap_type = %1"
 
-#: editor_ops.cc:1420
+#: gtk2_ardour/editor_ops.cc:1430
 #, fuzzy
 msgid "select all within"
 msgstr "Выделить всё"
 
-#: editor_ops.cc:1452
+#: gtk2_ardour/editor_ops.cc:1462
 #, fuzzy
 msgid "set selection from region"
 msgstr "Создать область из выделенного"
 
-#: editor_ops.cc:1485
+#: gtk2_ardour/editor_ops.cc:1495
 #, fuzzy
 msgid "set selection from range"
 msgstr "Создать область из выделенного"
 
-#: editor_ops.cc:1515
+#: gtk2_ardour/editor_ops.cc:1525
 #, fuzzy
 msgid "select all from range"
 msgstr "выбрать окно просмотра"
 
-#: editor_ops.cc:1537
+#: gtk2_ardour/editor_ops.cc:1547
 #, fuzzy
 msgid "select all from punch"
 msgstr "Выделить всё"
 
-#: editor_ops.cc:1559
+#: gtk2_ardour/editor_ops.cc:1569
 #, fuzzy
 msgid "select all from loop"
 msgstr "Выделить всё"
 
-#: editor_ops.cc:1573
+#: gtk2_ardour/editor_ops.cc:1583
 #, fuzzy
 msgid "select all after cursor"
 msgstr "От начала до курсора"
 
-#: editor_ops.cc:1578
+#: gtk2_ardour/editor_ops.cc:1588
 #, fuzzy
 msgid "select all before cursor"
 msgstr "Воспроизвести от курсора"
 
-#: editor_ops.cc:1608
+#: gtk2_ardour/editor_ops.cc:1618
 #, fuzzy
 msgid "select all between cursors"
 msgstr "Воспроизвести от курсора"
 
-#: editor_ops.cc:1739
+#: gtk2_ardour/editor_ops.cc:1749
 msgid "clear markers"
 msgstr "очистить маркеры"
 
-#: editor_ops.cc:1751
+#: gtk2_ardour/editor_ops.cc:1762
 msgid "clear ranges"
 msgstr ""
 
-#: editor_ops.cc:1770
+#: gtk2_ardour/editor_ops.cc:1782
 msgid "clear locations"
 msgstr "очистить интервалы"
 
-#: editor_ops.cc:1820
+#: gtk2_ardour/editor_ops.cc:1833
 #, fuzzy
 msgid "insert dragged region"
 msgstr "Вставить область"
 
-#: editor_ops.cc:1856
+#: gtk2_ardour/editor_ops.cc:1869
 #, fuzzy
 msgid "insert region"
 msgstr "Вставить область"
 
-#: editor_ops.cc:2047 io_selector.cc:58 io_selector.cc:792
+#: gtk2_ardour/editor_ops.cc:2060 gtk2_ardour/io_selector.cc:60
+#: gtk2_ardour/io_selector.cc:794 gtk2_ardour/connection_editor.cc:86
 msgid "OK"
 msgstr "ОК"
 
-#: editor_ops.cc:2054
+#: gtk2_ardour/editor_ops.cc:2067
 msgid "ardour: rename region"
 msgstr "ardour: переименовать область"
 
-#: editor_ops.cc:2277 editor_ops.cc:2326
+#: gtk2_ardour/editor_ops.cc:2292 gtk2_ardour/editor_ops.cc:2345
 #, fuzzy
 msgid "separate"
 msgstr "Разделить область"
 
-#: editor_ops.cc:2388
+#: gtk2_ardour/editor_ops.cc:2410
 #, fuzzy
 msgid "trim to selection"
 msgstr "Выделить по интервалу"
 
-#: editor_ops.cc:2428
+#: gtk2_ardour/editor_ops.cc:2451
 msgid "region fill"
 msgstr ""
 
-#: editor_ops.cc:2487
+#: gtk2_ardour/editor_ops.cc:2515
 #, fuzzy
 msgid "fill selection"
 msgstr "Закольцевать выделенное"
 
-#: editor_ops.cc:2508
+#: gtk2_ardour/editor_ops.cc:2536
 #, fuzzy
 msgid "Programming error. that region doesn't cover that position"
 msgstr "ошибка в программе: location/marker map does not contain location!"
 
-#: editor_ops.cc:2511
+#: gtk2_ardour/editor_ops.cc:2539
 #, fuzzy
 msgid "set region sync position"
 msgstr "Области/положение"
 
-#: editor_ops.cc:2526
+#: gtk2_ardour/editor_ops.cc:2555
 msgid "Place the edit cursor at the desired sync point"
 msgstr "Поместите курсор на точку синхронизации"
 
-#: editor_ops.cc:2531
+#: gtk2_ardour/editor_ops.cc:2560
 #, fuzzy
 msgid "set sync from edit cursor"
 msgstr "Воспроизвести от курсора"
 
-#: editor_ops.cc:2543
+#: gtk2_ardour/editor_ops.cc:2573
 msgid "remove sync"
 msgstr ""
 
-#: editor_ops.cc:2557
+#: gtk2_ardour/editor_ops.cc:2588
 msgid "naturalize"
 msgstr ""
 
-#: editor_ops.cc:2621
+#: gtk2_ardour/editor_ops.cc:2653
 #, fuzzy
 msgid "align selection (relative)"
 msgstr "Выровнять относительно"
 
-#: editor_ops.cc:2649
+#: gtk2_ardour/editor_ops.cc:2682
 #, fuzzy
 msgid "align selection"
 msgstr "Свести выделенное"
 
-#: editor_ops.cc:2661
+#: gtk2_ardour/editor_ops.cc:2694
 #, fuzzy
 msgid "align region"
 msgstr "прослушать область"
 
-#: editor_ops.cc:2708 editor_ops.cc:2733
+#: gtk2_ardour/editor_ops.cc:2742 gtk2_ardour/editor_ops.cc:2768
 #, fuzzy
 msgid "trim to edit"
 msgstr "От начала до курсора"
 
-#: editor_ops.cc:2784
+#: gtk2_ardour/editor_ops.cc:2820
 #, fuzzy
 msgid "ardour: freeze"
 msgstr "ardour: "
 
-#: editor_ops.cc:2789
+#: gtk2_ardour/editor_ops.cc:2825
 #, fuzzy
 msgid "Cancel Freeze"
 msgstr "Отмена"
 
-#: editor_ops.cc:2826
+#: gtk2_ardour/editor_ops.cc:2862
 #, fuzzy
 msgid "bounce range"
 msgstr "Выбрать текущий интервал"
 
-#: editor_ops.cc:2879
+#: gtk2_ardour/editor_ops.cc:2916
 msgid "cut"
 msgstr "вырезать"
 
-#: editor_ops.cc:2882
+#: gtk2_ardour/editor_ops.cc:2919
 msgid "copy"
 msgstr "копировать"
 
-#: editor_ops.cc:2895
+#: gtk2_ardour/editor_ops.cc:2932
 msgid " objects"
 msgstr "объекты"
 
-#: editor_ops.cc:2921
+#: gtk2_ardour/editor_ops.cc:2958
 msgid " range"
 msgstr ""
 
-#: editor_ops.cc:3078
+#: gtk2_ardour/editor_ops.cc:3121
 #, fuzzy
 msgid "paste"
 msgstr "Вставить"
 
-#: editor_ops.cc:3116
+#: gtk2_ardour/editor_ops.cc:3159
 #, fuzzy
 msgid "paste chunk"
 msgstr "Создать фрагмент"
 
-#. clear (below) will clear the argument list
-#: editor_ops.cc:3157
+#: gtk2_ardour/editor_ops.cc:3200
 #, fuzzy
 msgid "duplicate region"
 msgstr "Разделить область"
 
-#: editor_ops.cc:3202
+#: gtk2_ardour/editor_ops.cc:3245
 #, fuzzy
 msgid "duplicate selection"
 msgstr "Свести выделенное"
 
-#: editor_ops.cc:3259
+#: gtk2_ardour/editor_ops.cc:3303
 #, fuzzy
 msgid "clear playlist"
 msgstr "Имя снимка"
 
-#: editor_ops.cc:3288
+#: gtk2_ardour/editor_ops.cc:3333
 #, fuzzy
 msgid "nudge track"
 msgstr "Скрыть трек"
 
-#: editor_ops.cc:3315
+#: gtk2_ardour/editor_ops.cc:3361
 msgid ""
 "Do you really want to destroy the last capture?\n"
 "(This is destructive and cannot be undone)"
@@ -4115,714 +3988,712 @@ msgstr ""
 "Последнюю запись будет удалена. Вы уверены?\n"
 "(отмена операции невозможна)"
 
-#: editor_ops.cc:3343
+#: gtk2_ardour/editor_ops.cc:3389
 #, fuzzy
 msgid "normalize"
 msgstr "Норм."
 
-#: editor_ops.cc:3390
+#: gtk2_ardour/editor_ops.cc:3442
 msgid "reverse regions"
 msgstr ""
 
-#: editor_region_list.cc:98 editor_region_list.cc:103
-#: editor_region_list.cc:106 location_ui.cc:56
+#: gtk2_ardour/editor_region_list.cc:98 gtk2_ardour/editor_region_list.cc:103
+#: gtk2_ardour/editor_region_list.cc:106 gtk2_ardour/location_ui.cc:57
 msgid "Hidden"
 msgstr "Скрытый"
 
-#. added a new fresh one at the end
-#: editor_route_list.cc:102 editor_route_list.cc:103 editor_route_list.cc:247
+#: gtk2_ardour/editor_route_list.cc:100 gtk2_ardour/editor_route_list.cc:101
+#: gtk2_ardour/editor_route_list.cc:246
 msgid "editor"
 msgstr "редактор"
 
-#: editor_route_list.cc:310 mixer_ui.cc:699
+#: gtk2_ardour/editor_route_list.cc:313 gtk2_ardour/mixer_ui.cc:717
 msgid "Show All"
 msgstr "Показать всё"
 
-#: editor_route_list.cc:311 mixer_ui.cc:700
+#: gtk2_ardour/editor_route_list.cc:314 gtk2_ardour/mixer_ui.cc:718
 msgid "Hide All"
 msgstr "Скрыть всё"
 
-#: editor_route_list.cc:312 mixer_ui.cc:701
+#: gtk2_ardour/editor_route_list.cc:315 gtk2_ardour/mixer_ui.cc:719
 #, fuzzy
 msgid "Show All Audio Tracks"
 msgstr "Показать все аудиошины"
 
-#: editor_route_list.cc:313 mixer_ui.cc:702
+#: gtk2_ardour/editor_route_list.cc:316 gtk2_ardour/mixer_ui.cc:720
 #, fuzzy
 msgid "Hide All Audio Tracks"
 msgstr "Скрыть все аудиошины"
 
-#: editor_route_list.cc:314 mixer_ui.cc:703
+#: gtk2_ardour/editor_route_list.cc:317 gtk2_ardour/mixer_ui.cc:721
 #, fuzzy
 msgid "Show All Audio Busses"
 msgstr "Показать все аудиошины"
 
-#: editor_route_list.cc:315 mixer_ui.cc:704
+#: gtk2_ardour/editor_route_list.cc:318 gtk2_ardour/mixer_ui.cc:722
 #, fuzzy
 msgid "Hide All Audio Busses"
 msgstr "Скрыть все аудиошины"
 
-#: editor_rulers.cc:312
+#: gtk2_ardour/editor_rulers.cc:311
 #, fuzzy
 msgid "New location marker"
 msgstr "Маркеры интервалов"
 
-#: editor_rulers.cc:313
+#: gtk2_ardour/editor_rulers.cc:312
 #, fuzzy
 msgid "Clear all locations"
 msgstr "очистить интервалы"
 
-#. ruler_items.push_back (MenuElem (_("New Range")));
-#: editor_rulers.cc:318
-#, fuzzy
+#: gtk2_ardour/editor_rulers.cc:317
 msgid "Clear all ranges"
-msgstr "��оспроизвести \"кольцо\""
+msgstr "��чистить все области"
 
-#: editor_rulers.cc:327
+#: gtk2_ardour/editor_rulers.cc:326
 #, fuzzy
 msgid "New Tempo"
 msgstr "Новый темп"
 
-#: editor_rulers.cc:328
-#, fuzzy
+#: gtk2_ardour/editor_rulers.cc:327
 msgid "Clear tempo"
-msgstr "��овый темп"
+msgstr "��чистить темп"
 
-#: editor_rulers.cc:333
-#, fuzzy
+#: gtk2_ardour/editor_rulers.cc:332
 msgid "New Meter"
-msgstr "Размер"
+msgstr ""
 
-#: editor_rulers.cc:334
-#, fuzzy
+#: gtk2_ardour/editor_rulers.cc:333
 msgid "Clear meter"
-msgstr "очистить маркеры"
+msgstr ""
 
-#: editor_rulers.cc:342
-#, fuzzy
+#: gtk2_ardour/editor_rulers.cc:341
 msgid "Min:Secs"
-msgstr "Мин:Сек"
+msgstr "Мин:С"
 
-#: editor_selection_list.cc:108
-#, fuzzy
+#: gtk2_ardour/editor_selection_list.cc:108
 msgid "Name for Chunk:"
-msgstr "�мя фрагмента:"
+msgstr "�мя фрагмента:"
 
-#: editor_selection_list.cc:111
-#, fuzzy
+#: gtk2_ardour/editor_selection_list.cc:111
 msgid "Create Chunk"
 msgstr "Создать фрагмент"
 
-#: editor_selection_list.cc:111
+#: gtk2_ardour/editor_selection_list.cc:111
 msgid "Forget it"
 msgstr "Забыть"
 
-#: editor_tempodisplay.cc:253 editor_tempodisplay.cc:293
+#: gtk2_ardour/editor_tempodisplay.cc:270
+#: gtk2_ardour/editor_tempodisplay.cc:313
 msgid "add"
 msgstr "добавить"
 
-#: editor_tempodisplay.cc:275
+#: gtk2_ardour/editor_tempodisplay.cc:292
 #, fuzzy
 msgid "add tempo mark"
 msgstr "добавить маркер"
 
-#: editor_tempodisplay.cc:315
+#: gtk2_ardour/editor_tempodisplay.cc:335
 #, fuzzy
 msgid "add meter mark"
 msgstr "добавить маркер"
 
-#: editor_tempodisplay.cc:348 editor_tempodisplay.cc:376
+#: gtk2_ardour/editor_tempodisplay.cc:370
+#: gtk2_ardour/editor_tempodisplay.cc:401
 msgid "done"
 msgstr "готово"
 
-#: editor_tempodisplay.cc:366 editor_tempodisplay.cc:394
+#: gtk2_ardour/editor_tempodisplay.cc:388
+#: gtk2_ardour/editor_tempodisplay.cc:419
 msgid "replace tempo mark"
 msgstr ""
 
-#: editor_tempodisplay.cc:433 editor_tempodisplay.cc:464
+#: gtk2_ardour/editor_tempodisplay.cc:461
+#: gtk2_ardour/editor_tempodisplay.cc:495
 msgid "programming error: marker for meter is not a meter marker!"
 msgstr "ошибка в программе: marker for meter is not a meter marker!"
 
-#: editor_tempodisplay.cc:443 editor_tempodisplay.cc:476
+#: gtk2_ardour/editor_tempodisplay.cc:471
+#: gtk2_ardour/editor_tempodisplay.cc:507
 #, fuzzy
 msgid "remove tempo mark"
 msgstr "Да, удалить всё"
 
-#: editor_timefx.cc:51
+#: gtk2_ardour/editor_timefx.cc:52
 msgid "Quick but Ugly"
 msgstr "Быстро и грубо"
 
-#: editor_timefx.cc:52
+#: gtk2_ardour/editor_timefx.cc:53
 msgid "Skip Anti-aliasing"
 msgstr "Без фильтрации"
 
-#: editor_timefx.cc:56
+#: gtk2_ardour/editor_timefx.cc:57
 msgid "ardour: timestretch"
 msgstr "ardour: эффект timestretch"
 
-#: editor_timefx.cc:57
+#: gtk2_ardour/editor_timefx.cc:58
 msgid "TimeStretchDialog"
 msgstr "TimeStretchDialog"
 
-#: editor_timefx.cc:70
+#: gtk2_ardour/editor_timefx.cc:71
 msgid "Stretch/Shrink it"
 msgstr "Растянуть/Сжать"
 
-#: editor_timefx.cc:73 editor_timefx.cc:74
+#: gtk2_ardour/editor_timefx.cc:74 gtk2_ardour/editor_timefx.cc:75
 msgid "TimeStretchButton"
 msgstr "TimeStretchButton"
 
-#: editor_timefx.cc:75
+#: gtk2_ardour/editor_timefx.cc:76
 msgid "TimeStretchProgress"
 msgstr "TimeStretchProgress"
 
-#: editor_timefx.cc:139
+#: gtk2_ardour/editor_timefx.cc:140
 msgid "timestretch cannot be started - thread creation error"
 msgstr ""
 
-#: export_dialog.cc:59 export_dialog.cc:399 export_dialog.cc:1027
-#: export_dialog.cc:1195
+#: gtk2_ardour/export_dialog.cc:59 gtk2_ardour/export_dialog.cc:399
+#: gtk2_ardour/export_dialog.cc:1027 gtk2_ardour/export_dialog.cc:1195
 msgid "22.05kHz"
 msgstr "22.05кГц"
 
-#: export_dialog.cc:60 export_dialog.cc:402 export_dialog.cc:417
-#: export_dialog.cc:1029 export_dialog.cc:1197
+#: gtk2_ardour/export_dialog.cc:60 gtk2_ardour/export_dialog.cc:402
+#: gtk2_ardour/export_dialog.cc:417 gtk2_ardour/export_dialog.cc:1029
+#: gtk2_ardour/export_dialog.cc:1197
 msgid "44.1kHz"
 msgstr "44.1кГц"
 
-#: export_dialog.cc:61 export_dialog.cc:405 export_dialog.cc:1031
-#: export_dialog.cc:1199
+#: gtk2_ardour/export_dialog.cc:61 gtk2_ardour/export_dialog.cc:405
+#: gtk2_ardour/export_dialog.cc:1031 gtk2_ardour/export_dialog.cc:1199
 msgid "48kHz"
 msgstr "48кГц"
 
-#: export_dialog.cc:62 export_dialog.cc:408 export_dialog.cc:1033
-#: export_dialog.cc:1201
+#: gtk2_ardour/export_dialog.cc:62 gtk2_ardour/export_dialog.cc:408
+#: gtk2_ardour/export_dialog.cc:1033 gtk2_ardour/export_dialog.cc:1201
 msgid "88.2kHz"
 msgstr "88.2кГц"
 
-#: export_dialog.cc:63 export_dialog.cc:411 export_dialog.cc:1035
-#: export_dialog.cc:1203
+#: gtk2_ardour/export_dialog.cc:63 gtk2_ardour/export_dialog.cc:411
+#: gtk2_ardour/export_dialog.cc:1035 gtk2_ardour/export_dialog.cc:1203
 msgid "96kHz"
 msgstr "96кГц"
 
-#: export_dialog.cc:64 export_dialog.cc:414 export_dialog.cc:1037
-#: export_dialog.cc:1205
+#: gtk2_ardour/export_dialog.cc:64 gtk2_ardour/export_dialog.cc:414
+#: gtk2_ardour/export_dialog.cc:1037 gtk2_ardour/export_dialog.cc:1205
 msgid "192kHz"
 msgstr "192кГц"
 
-#: export_dialog.cc:69
+#: gtk2_ardour/export_dialog.cc:69
 msgid "best"
 msgstr "высокое"
 
-#: export_dialog.cc:70 export_dialog.cc:1212
+#: gtk2_ardour/export_dialog.cc:70 gtk2_ardour/export_dialog.cc:1212
 msgid "fastest"
 msgstr "быстрое"
 
-#: export_dialog.cc:71 export_dialog.cc:1214
+#: gtk2_ardour/export_dialog.cc:71 gtk2_ardour/export_dialog.cc:1214
 msgid "linear"
 msgstr "линейное"
 
-#: export_dialog.cc:72 export_dialog.cc:1216
+#: gtk2_ardour/export_dialog.cc:72 gtk2_ardour/export_dialog.cc:1216
 msgid "better"
 msgstr "нормальное"
 
-#: export_dialog.cc:73 export_dialog.cc:1218
+#: gtk2_ardour/export_dialog.cc:73 gtk2_ardour/export_dialog.cc:1218
 msgid "intermediate"
 msgstr "среднее"
 
-#: export_dialog.cc:79 export_dialog.cc:1227
+#: gtk2_ardour/export_dialog.cc:79 gtk2_ardour/export_dialog.cc:1227
 msgid "Rectangular"
 msgstr "Rectangular"
 
-#: export_dialog.cc:80
+#: gtk2_ardour/export_dialog.cc:80
 msgid "Shaped Noise"
 msgstr "Shaped Noise"
 
-#: export_dialog.cc:81 export_dialog.cc:1229
+#: gtk2_ardour/export_dialog.cc:81 gtk2_ardour/export_dialog.cc:1229
 msgid "Triangular"
 msgstr "Triangular"
 
-#: export_dialog.cc:86
+#: gtk2_ardour/export_dialog.cc:86
 msgid "stereo"
 msgstr "стерео"
 
-#. default is to use all
-#: export_dialog.cc:87 export_dialog.cc:486 export_dialog.cc:1055
-#: export_dialog.cc:1177
+#: gtk2_ardour/export_dialog.cc:87 gtk2_ardour/export_dialog.cc:486
+#: gtk2_ardour/export_dialog.cc:1055 gtk2_ardour/export_dialog.cc:1177
 msgid "mono"
 msgstr "моно"
 
-#: export_dialog.cc:93
+#: gtk2_ardour/export_dialog.cc:93
 msgid "CUE"
 msgstr ""
 
-#: export_dialog.cc:94
+#: gtk2_ardour/export_dialog.cc:94
 msgid "TOC"
 msgstr ""
 
-#: export_dialog.cc:102
+#: gtk2_ardour/export_dialog.cc:102
 #, fuzzy
 msgid "Format"
 msgstr "Норм."
 
-#: export_dialog.cc:103
+#: gtk2_ardour/export_dialog.cc:103
 msgid "CD Marker File Type"
 msgstr ""
 
-#: export_dialog.cc:104
+#: gtk2_ardour/export_dialog.cc:104
 #, fuzzy
 msgid "Channels"
 msgstr "отмена"
 
-#: export_dialog.cc:105
+#: gtk2_ardour/export_dialog.cc:105
 #, fuzzy
 msgid "File Type"
 msgstr "Тип"
 
-#: export_dialog.cc:106
+#: gtk2_ardour/export_dialog.cc:106
 #, fuzzy
 msgid "Sample Format"
 msgstr "Разделить область"
 
-#: export_dialog.cc:107
+#: gtk2_ardour/export_dialog.cc:107
 msgid "Sample Endianness"
 msgstr ""
 
-#: export_dialog.cc:108
+#: gtk2_ardour/export_dialog.cc:108
 #, fuzzy
 msgid "Sample Rate"
 msgstr "Разделить область"
 
-#: export_dialog.cc:109
+#: gtk2_ardour/export_dialog.cc:109
 msgid "Conversion Quality"
 msgstr ""
 
-#: export_dialog.cc:110
+#: gtk2_ardour/export_dialog.cc:110
 msgid "Dither Type"
 msgstr ""
 
-#: export_dialog.cc:111
+#: gtk2_ardour/export_dialog.cc:111
 msgid "Export CD Marker File Only"
 msgstr ""
 
-#: export_dialog.cc:112
+#: gtk2_ardour/export_dialog.cc:112
 #, fuzzy
 msgid "Export to File"
 msgstr "Экспорт на CD"
 
-#: export_dialog.cc:113 option_editor.cc:83 option_editor.cc:84
+#: gtk2_ardour/export_dialog.cc:113 gtk2_ardour/option_editor.cc:82
+#: gtk2_ardour/option_editor.cc:83
 msgid "Browse"
 msgstr "Обзор"
 
-#: export_dialog.cc:114
+#: gtk2_ardour/export_dialog.cc:114
 msgid "Specific tracks ..."
 msgstr ""
 
-#: export_dialog.cc:125
+#: gtk2_ardour/export_dialog.cc:125
 msgid "ardour: export"
 msgstr "ardour: экспорт"
 
-#: export_dialog.cc:126
+#: gtk2_ardour/export_dialog.cc:126
 msgid "ardour_export"
 msgstr "ardour_экспорт"
 
-#: export_dialog.cc:139 export_dialog.cc:155 mixer_strip.cc:124
-#: mixer_strip.cc:767
-#, fuzzy
+#: gtk2_ardour/export_dialog.cc:139 gtk2_ardour/export_dialog.cc:155
+#: gtk2_ardour/mixer_strip.cc:121 gtk2_ardour/mixer_strip.cc:727
 msgid "Output"
-msgstr "Выходов"
+msgstr "Выход"
+
+#: gtk2_ardour/export_dialog.cc:140 gtk2_ardour/export_dialog.cc:156
+#: gtk2_ardour/export_dialog.cc:1068 gtk2_ardour/export_dialog.cc:1072
+msgid "Left"
+msgstr "Левый"
+
+#: gtk2_ardour/export_dialog.cc:141 gtk2_ardour/export_dialog.cc:157
+msgid "Right"
+msgstr "Правый"
 
-#: export_dialog.cc:633
+#: gtk2_ardour/export_dialog.cc:633
 #, fuzzy
 msgid "Editor: cannot open \"%1\" as export file for CD toc file"
-msgstr ""
-"Редакор: не могу открыть \"%1\" как файл экспорта маркеров для CD-треков"
+msgstr "Редакор: не могу открыть \"%1\" как файл экспорта маркеров для CD-треков"
 
-#: export_dialog.cc:759
+#: gtk2_ardour/export_dialog.cc:759
 #, fuzzy
 msgid "Editor: cannot open \"%1\" as export file for CD cue file"
-msgstr ""
-"Редакор: не могу открыть \"%1\" как файл экспорта маркеров для CD-треков"
+msgstr "Редакор: не могу открыть \"%1\" как файл экспорта маркеров для CD-треков"
 
-#: export_dialog.cc:778
+#: gtk2_ardour/export_dialog.cc:778
 msgid "WAV"
-msgstr ""
+msgstr "WAV"
 
-#: export_dialog.cc:912
+#: gtk2_ardour/export_dialog.cc:912
 msgid "Stop Export"
 msgstr "Остановить экспорт"
 
-#: export_dialog.cc:1131
+#: gtk2_ardour/export_dialog.cc:1131
 msgid "Please enter a valid filename."
-msgstr ""
+msgstr "Введите корректное имя файла"
 
-#: export_dialog.cc:1141
+#: gtk2_ardour/export_dialog.cc:1141
 msgid "Please specify a complete filename for the audio file."
-msgstr ""
+msgstr "Укажите полное имя звукового файла"
 
-#: export_dialog.cc:1147
+#: gtk2_ardour/export_dialog.cc:1147
 msgid "File already exists, do you want to overwrite it?"
-msgstr ""
+msgstr "Файл с таким именем уже есть. Перезаписать его?"
 
-#: export_dialog.cc:1159 export_range_markers_dialog.cc:153
+#: gtk2_ardour/export_dialog.cc:1159
+#: gtk2_ardour/export_range_markers_dialog.cc:153
 msgid "Cannot write file in: "
-msgstr ""
+msgstr "Невозможно записать файлв в:"
 
-#. warning dialog
-#: export_range_markers_dialog.cc:135
+#: gtk2_ardour/export_range_markers_dialog.cc:135
 msgid "Please enter a valid target directory."
-msgstr ""
+msgstr "Введите корректный конечный каталог."
 
-#: export_range_markers_dialog.cc:143
+#: gtk2_ardour/export_range_markers_dialog.cc:143
 msgid ""
 "Please select an existing target directory. Files\n"
 "are not allowed!"
 msgstr ""
 
-#: gain_automation_time_axis.cc:62
+#: gtk2_ardour/gain_automation_time_axis.cc:65
 #, fuzzy
 msgid "add gain automation event"
 msgstr "автомат"
 
-#: gain_meter.cc:67
+#: gtk2_ardour/gain_meter.cc:67
 msgid "cannot find images for fader slider"
 msgstr ""
 
-#: gain_meter.cc:74
+#: gtk2_ardour/gain_meter.cc:74
 msgid "cannot find images for fader rail"
 msgstr ""
 
-#: gain_meter.cc:130 gain_meter.cc:339 gain_meter.cc:494 gain_meter.cc:539
+#: gtk2_ardour/gain_meter.cc:125 gtk2_ardour/gain_meter.cc:334
+#: gtk2_ardour/gain_meter.cc:489 gtk2_ardour/gain_meter.cc:534
 #, fuzzy
 msgid "-inf"
 msgstr "в"
 
-#: gain_meter.cc:140
-#, fuzzy
+#: gtk2_ardour/gain_meter.cc:135
 msgid "Fader automation mode"
-msgstr "��втомат"
+msgstr "��ежим автоматизации фейдера"
 
-#: gain_meter.cc:141
-#, fuzzy
+#: gtk2_ardour/gain_meter.cc:136
 msgid "Fader automation type"
-msgstr "��втомат"
+msgstr "��ип автоматизации фейдера"
 
-#. XXX it might different in different languages
-#: gain_meter.cc:182 gain_meter.cc:817 panner_ui.cc:99 panner_ui.cc:807
+#: gtk2_ardour/gain_meter.cc:177 gtk2_ardour/gain_meter.cc:812
+#: gtk2_ardour/panner_ui.cc:97 gtk2_ardour/panner_ui.cc:797
 msgid "Abs"
-msgstr ""
+msgstr "Абс"
 
-#: gain_meter.cc:472
-#, fuzzy
+#: gtk2_ardour/gain_meter.cc:467
 msgid "-Inf"
-msgstr "в"
+msgstr "-Inf"
 
-#: gain_meter.cc:781 mixer_strip.cc:770 panner_ui.cc:771
-#, fuzzy
+#: gtk2_ardour/gain_meter.cc:776 gtk2_ardour/mixer_strip.cc:730
+#: gtk2_ardour/panner_ui.cc:761
 msgid "O"
-msgstr "ИЛИ"
+msgstr "O"
 
-#: gain_meter.cc:784 panner_ui.cc:774
+#: gtk2_ardour/gain_meter.cc:779 gtk2_ardour/panner_ui.cc:764
 msgid "P"
-msgstr ""
+msgstr "P"
 
-#: gain_meter.cc:787 panner_ui.cc:777
+#: gtk2_ardour/gain_meter.cc:782 gtk2_ardour/panner_ui.cc:767
 msgid "T"
-msgstr ""
+msgstr "T"
 
-#: gain_meter.cc:790 panner_ui.cc:780
+#: gtk2_ardour/gain_meter.cc:785 gtk2_ardour/panner_ui.cc:770
 msgid "W"
-msgstr ""
+msgstr "W"
 
-#: gtk-custom-ruler.c:126
-#, fuzzy
+#: gtk2_ardour/gtk-custom-ruler.c:126
 msgid "Lower"
-msgstr "��лой"
+msgstr "��иже"
 
-#: gtk-custom-ruler.c:127
+#: gtk2_ardour/gtk-custom-ruler.c:127
 #, fuzzy
 msgid "Lower limit of ruler"
 msgstr "Опустить область в нижний слой"
 
-#: gtk-custom-ruler.c:136
+#: gtk2_ardour/gtk-custom-ruler.c:136
 msgid "Upper"
-msgstr ""
+msgstr "Выше"
 
-#: gtk-custom-ruler.c:137
+#: gtk2_ardour/gtk-custom-ruler.c:137
 msgid "Upper limit of ruler"
 msgstr ""
 
-#: gtk-custom-ruler.c:146
-#, fuzzy
+#: gtk2_ardour/gtk-custom-ruler.c:146
 msgid "Position"
-msgstr "��удит"
+msgstr "��оложение"
 
-#: gtk-custom-ruler.c:147
+#: gtk2_ardour/gtk-custom-ruler.c:147
 msgid "Position of mark on the ruler"
-msgstr ""
+msgstr "Положение маркера на линейке"
 
-#: gtk-custom-ruler.c:156
+#: gtk2_ardour/gtk-custom-ruler.c:156
 msgid "Max Size"
-msgstr ""
+msgstr "Макс. размер"
 
-#: gtk-custom-ruler.c:157
+#: gtk2_ardour/gtk-custom-ruler.c:157
 msgid "Maximum size of the ruler"
-msgstr ""
+msgstr "Макс. размер линейки"
 
-#: gtk-custom-ruler.c:166
-#, fuzzy
+#: gtk2_ardour/gtk-custom-ruler.c:166
 msgid "Show Position"
-msgstr "��о расположению области"
+msgstr "��оказать положение"
 
-#: gtk-custom-ruler.c:167
+#: gtk2_ardour/gtk-custom-ruler.c:167
 msgid "Draw current ruler position"
-msgstr ""
+msgstr "Нарисовать текущее положение на линейке"
 
-#. end-of-file, other end closed or shutdown?
-#: imageframe_socket_handler.cc:127
+#: gtk2_ardour/imageframe_socket_handler.cc:127
 msgid "Image Compositor Socket has been shutdown/closed"
 msgstr ""
 
-#: imageframe_time_axis.cc:286
-#, fuzzy
+#: gtk2_ardour/imageframe_time_axis.cc:286
 msgid "0.5 seconds"
-msgstr "Минуты:Секунды"
+msgstr "0,5 секунды"
 
-#: imageframe_time_axis.cc:287 marker_time_axis.cc:242
-#, fuzzy
+#: gtk2_ardour/imageframe_time_axis.cc:287 gtk2_ardour/marker_time_axis.cc:242
 msgid "1 seconds"
-msgstr "Минуты:Секунды"
+msgstr "1 секунда"
 
-#: imageframe_time_axis.cc:288 marker_time_axis.cc:243
-#, fuzzy
+#: gtk2_ardour/imageframe_time_axis.cc:288 gtk2_ardour/marker_time_axis.cc:243
 msgid "1.5 seconds"
-msgstr "Минуты:Секунды"
+msgstr "1,5 секунды"
 
-#: imageframe_time_axis.cc:289 marker_time_axis.cc:244
-#, fuzzy
+#: gtk2_ardour/imageframe_time_axis.cc:289 gtk2_ardour/marker_time_axis.cc:244
 msgid "2 seconds"
-msgstr "Минуты:Секунды"
+msgstr "2 секунды"
 
-#: imageframe_time_axis.cc:290 marker_time_axis.cc:245
-#, fuzzy
+#: gtk2_ardour/imageframe_time_axis.cc:290 gtk2_ardour/marker_time_axis.cc:245
 msgid "2.5 seconds"
-msgstr "Минуты:Секунды"
+msgstr "2,5 секунды"
 
-#: imageframe_time_axis.cc:291 marker_time_axis.cc:246
-#, fuzzy
+#: gtk2_ardour/imageframe_time_axis.cc:291 gtk2_ardour/marker_time_axis.cc:246
 msgid "3 seconds"
-msgstr "Минуты:Секунды"
+msgstr "3 секунды"
 
-#. duration_items.push_back(SeparatorElem()) ;
-#. duration_items.push_back(MenuElem (_("custom"), mem_fun(*this, &ImageFrameTimeAxis::set_marker_duration_custom))) ;
-#: imageframe_time_axis.cc:296 marker_time_axis.cc:251
+#: gtk2_ardour/imageframe_time_axis.cc:296 gtk2_ardour/marker_time_axis.cc:251
 msgid "Duration (sec)"
-msgstr ""
+msgstr "Длительность (с)"
 
-#: imageframe_time_axis.cc:301
+#: gtk2_ardour/imageframe_time_axis.cc:301
 #, fuzzy
 msgid "Remove Frame"
 msgstr "Удалить поле"
 
-#: imageframe_time_axis.cc:304
+#: gtk2_ardour/imageframe_time_axis.cc:304
 #, fuzzy
 msgid "Image Frame"
 msgstr "Кадр"
 
-#: imageframe_time_axis.cc:305 marker_time_axis.cc:257
-#, fuzzy
+#: gtk2_ardour/imageframe_time_axis.cc:305 gtk2_ardour/marker_time_axis.cc:257
 msgid "Rename Track"
-msgstr "Переименовать"
+msgstr "Переименовать дорожку"
 
-#: io_selector.cc:60 io_selector.cc:794
-#, fuzzy
+#: gtk2_ardour/io_selector.cc:62 gtk2_ardour/io_selector.cc:796
+#: gtk2_ardour/connection_editor.cc:61 gtk2_ardour/connection_editor.cc:110
 msgid "Rescan"
-msgstr "обновить"
+msgstr ""
 
-#: io_selector.cc:68
+#: gtk2_ardour/io_selector.cc:70
 msgid "%1 input"
 msgstr "%1 вход"
 
-#: io_selector.cc:70
+#: gtk2_ardour/io_selector.cc:72
 msgid "%1 output"
 msgstr "%1 выход"
 
-#: io_selector.cc:142 route_params_ui.cc:107
+#: gtk2_ardour/io_selector.cc:144 gtk2_ardour/route_params_ui.cc:103
 msgid "Inputs"
 msgstr "Входов"
 
-#: io_selector.cc:142 route_params_ui.cc:108
+#: gtk2_ardour/io_selector.cc:144 gtk2_ardour/route_params_ui.cc:104
 msgid "Outputs"
 msgstr "Выходов"
 
-#: io_selector.cc:143
-#, fuzzy
+#: gtk2_ardour/io_selector.cc:145
 msgid "Add Input"
-msgstr "�обавить вход"
+msgstr "�обавить вход"
 
-#: io_selector.cc:143
-#, fuzzy
+#: gtk2_ardour/io_selector.cc:145
 msgid "Add Output"
-msgstr "�обавить выход"
+msgstr "�обавить выход"
 
-#: io_selector.cc:144
-#, fuzzy
+#: gtk2_ardour/io_selector.cc:146
 msgid "Remove Input"
-msgstr "Удалить"
+msgstr "Удалить вход"
 
-#: io_selector.cc:144
-#, fuzzy
+#: gtk2_ardour/io_selector.cc:146
 msgid "Remove Output"
-msgstr "# Выходов"
+msgstr "Удалить выход"
 
-#: io_selector.cc:145
-#, fuzzy
+#: gtk2_ardour/io_selector.cc:147
 msgid "Disconnect All"
-msgstr "Отсоединить"
+msgstr "Отсоединить все"
 
-#: io_selector.cc:159
+#: gtk2_ardour/io_selector.cc:161
 msgid "Available connections"
 msgstr "Доступные соединения"
 
-#: io_selector.cc:555 io_selector.cc:574
+#: gtk2_ardour/io_selector.cc:557 gtk2_ardour/io_selector.cc:576
 msgid "There are no more JACK ports available."
 msgstr ""
 
-#: io_selector.cc:649 io_selector.cc:676 io_selector.cc:729
+#: gtk2_ardour/io_selector.cc:651 gtk2_ardour/io_selector.cc:678
+#: gtk2_ardour/io_selector.cc:731
 msgid "port"
 msgstr "порт"
 
-#: io_selector.cc:798
+#: gtk2_ardour/io_selector.cc:800
 msgid "ardour: "
 msgstr "ardour: "
 
-#: keyboard.cc:299
+#: gtk2_ardour/keyboard.cc:299
 msgid "KeyboardTarget: keyname \"%1\" is unknown."
 msgstr "KeyboardTarget: \"%1\" - неизвестное имя."
 
-#: keyboard.cc:525
+#: gtk2_ardour/keyboard.cc:525
 msgid ""
 "Your system is completely broken - NumLock uses \"%1\"as its modifier. This "
 "is madness - see the man page for xmodmap to find out how to fix this."
 msgstr ""
 
-#: keyboard.cc:533
+#: gtk2_ardour/keyboard.cc:533
 msgid ""
 "Your system generates \"%1\" when the NumLock key is pressed. This can cause "
 "problems when editing so Ardour will use %2 to mean Meta rather than %1"
 msgstr ""
 
-#: keyboard.cc:594
+#: gtk2_ardour/keyboard.cc:594
 msgid "You have %1 keys bound to \"mod1\""
 msgstr "Для \"mod1\" назначено кнопок: %1"
 
-#: keyboard.cc:609
+#: gtk2_ardour/keyboard.cc:609
 msgid "You have %1 keys bound to \"mod2\""
 msgstr "Для \"mod2\" назначено кнопок: %1"
 
-#: keyboard.cc:624
+#: gtk2_ardour/keyboard.cc:624
 msgid "You have %1 keys bound to \"mod3\""
 msgstr "Для \"mod3\" назначено кнопок: %1"
 
-#: keyboard.cc:639
+#: gtk2_ardour/keyboard.cc:639
 msgid "You have %1 keys bound to \"mod4\""
 msgstr "Для \"mod4\" назначено кнопок: %1"
 
-#: keyboard.cc:654
+#: gtk2_ardour/keyboard.cc:654
 msgid "You have %1 keys bound to \"mod5\""
 msgstr "Для \"mod5\" назначено кнопок: %1"
 
-#: location_ui.cc:48 location_ui.cc:51
-msgid "Set"
+#: gtk2_ardour/ladspa_pluginui.cc:77
+msgid "<span size=\"large\">Presets</span>"
 msgstr ""
 
-#: location_ui.cc:49 location_ui.cc:52
+#: gtk2_ardour/ladspa_pluginui.cc:168
+msgid "Controls"
+msgstr "Управление"
+
+#: gtk2_ardour/ladspa_pluginui.cc:205
+msgid "Plugin Editor: could not build control element for port %1"
+msgstr "Редактор модулей: невозможно создать эффект для порта %1"
+
+#: gtk2_ardour/ladspa_pluginui.cc:296
+msgid "Automation control"
+msgstr "Контроль атовматизации"
+
+#: gtk2_ardour/location_ui.cc:49 gtk2_ardour/location_ui.cc:52
+msgid "Set"
+msgstr "Установить"
+
+#: gtk2_ardour/location_ui.cc:50 gtk2_ardour/location_ui.cc:53
 msgid "Go"
 msgstr ""
 
-#: location_ui.cc:55
+#: gtk2_ardour/location_ui.cc:56
 msgid "CD"
 msgstr "CD"
 
-#: location_ui.cc:58
+#: gtk2_ardour/location_ui.cc:59
 msgid "SCMS"
 msgstr ""
 
-#: location_ui.cc:59
+#: gtk2_ardour/location_ui.cc:60
 msgid "Pre-Emphasis"
 msgstr ""
 
-#: location_ui.cc:570
+#: gtk2_ardour/location_ui.cc:571
 msgid "Add New Location"
 msgstr "Добавить новый интервал"
 
-#: location_ui.cc:571
+#: gtk2_ardour/location_ui.cc:572
 msgid "Add New Range"
 msgstr ""
 
-#: location_ui.cc:575
+#: gtk2_ardour/location_ui.cc:576
 msgid "ardour: locations"
 msgstr "ardour: интервалы"
 
-#: location_ui.cc:576
+#: gtk2_ardour/location_ui.cc:577
 msgid "ardour_locations"
 msgstr "ardour_интервалы"
 
-#: location_ui.cc:604
+#: gtk2_ardour/location_ui.cc:605
 #, fuzzy
 msgid "Location (CD Index) Markers"
 msgstr "Маркеры интервалов"
 
-#: location_ui.cc:624
+#: gtk2_ardour/location_ui.cc:625
 msgid "Range (CD Track) Markers"
 msgstr ""
 
-#: location_ui.cc:790
+#: gtk2_ardour/location_ui.cc:793
 msgid "add range marker"
-msgstr ""
+msgstr "Добавить маркер области"
 
-#: main.cc:72
+#: gtk2_ardour/main.cc:72
 msgid "ardour is killing itself for a clean exit\n"
 msgstr "ardour: принудительное завершение работы\n"
 
-#: main.cc:81
+#: gtk2_ardour/main.cc:81
 msgid "stopping user interface\n"
 msgstr "завершение работы...\n"
 
-#. XXX its doubtful that snprintf() is async-safe
-#: main.cc:100
-#, fuzzy, c-format
+#: gtk2_ardour/main.cc:100
+#, c-format
 msgid "%d(%d): received signal %d\n"
-msgstr "%d: принят сигнал %d\n"
+msgstr "%d(%d): принят сигнал %d\n"
 
-#: main.cc:180
+#: gtk2_ardour/main.cc:180
 msgid "cannot become new process group leader (%1)"
 msgstr ""
 
-#: main.cc:207
+#: gtk2_ardour/main.cc:207
 msgid "cannot setup signal handling for %1"
 msgstr "cannot setup signal handling for %1"
 
-#: main.cc:218
+#: gtk2_ardour/main.cc:218
 msgid "cannot set default signal mask (%1)"
 msgstr "cannot set default signal mask (%1)"
 
-#: main.cc:248
-#, fuzzy
+#: gtk2_ardour/main.cc:248
 msgid ""
 "Without a UI style file, ardour will look strange.\n"
 " Please set ARDOUR2_UI_RC to point to a valid UI style file"
 msgstr ""
-"Графичесий интерфейс Ardour будет выглядеть необычно\n"
-"без файла определяющего стиль отображения.\n"
-"Пожалуйста, укажите его (файл) в переменной окружения ARDOUR_UI_RC"
+"Графичес����й интерфейс Ardour будет выглядеть необычно\n"
+"без файла, определяющего стиль оформления.\n"
+"Пожалуйста, укажите его [файл] в переменной окружения ARDOUR_UI_RC"
 
-#: main.cc:270
-#, fuzzy
+#: gtk2_ardour/main.cc:270
 msgid "Ardour could not connect to JACK."
-msgstr "Не удалось соединиться с сервером JACK как \"%1\""
+msgstr "Не удалось соединиться с сервером JACK."
 
-#: main.cc:274
+#: gtk2_ardour/main.cc:274
 #, fuzzy
 msgid ""
 "There are several possible reasons:\n"
@@ -4842,20 +4713,11 @@ msgstr ""
 "\n"
 "Пожалуйста, проверьте все варианты, возможно потребуется (пере)запуск JACK."
 
-#: main.cc:304
+#: gtk2_ardour/main.cc:316
 msgid "could not load command line session \"%1\""
 msgstr "не удалось загрузить сессию \"%1\", указанную в командной строке"
 
-#. it wasn't new, but we require a new session
-#: main.cc:324
-msgid ""
-"\n"
-"\n"
-"A session named \"%1\" already exists.\n"
-"To avoid this message, start ardour as \"ardour %1"
-msgstr ""
-
-#: main.cc:335
+#: gtk2_ardour/main.cc:324
 msgid ""
 "\n"
 "\n"
@@ -4863,515 +4725,426 @@ msgid ""
 "To create it from the command line, start ardour as \"ardour --new %1"
 msgstr ""
 
-#: main.cc:399
+#: gtk2_ardour/main.cc:383
 msgid "Ardour/GTK "
 msgstr "Ardour/GTK "
 
-#: main.cc:401
+#: gtk2_ardour/main.cc:385
 msgid ""
 "\n"
 "   (built using "
 msgstr ""
 
-#: main.cc:405
-#, fuzzy
+#: gtk2_ardour/main.cc:389
 msgid " with libardour "
-msgstr " ��аботает �� libardour "
+msgstr " с libardour "
 
-#: main.cc:410
+#: gtk2_ardour/main.cc:394
 msgid " and GCC version "
-msgstr ""
+msgstr " и версией GCC "
 
-#: main.cc:420
-#, fuzzy
+#: gtk2_ardour/main.cc:404
 msgid "Copyright (C) 1999-2006 Paul Davis"
-msgstr "Авторск��е право 1999-2004 Paul Davis"
+msgstr "Авторск��е права © 1999-2006 Paul Davis"
 
-#: main.cc:421
+#: gtk2_ardour/main.cc:405
 msgid ""
 "Some portions Copyright (C) Steve Harris, Ari Johnson, Brett Viren, Joel "
 "Baker"
-msgstr ""
+msgstr "Частичные авторские права © Steve Harris, Ari Johnson, Brett Viren, Joel Baker"
 
-#: main.cc:423
+#: gtk2_ardour/main.cc:407
 msgid "Ardour comes with ABSOLUTELY NO WARRANTY"
-msgstr "Ardour распространяется БЕЗ ВСЯКИХ ГАРАНТИЙ"
+msgstr "Ardour распространяется БЕЗО ВСЯКИХ ГАРАНТИЙ"
 
-#: main.cc:424
+#: gtk2_ardour/main.cc:408
 msgid "not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
 msgstr ""
 
-#: main.cc:425
+#: gtk2_ardour/main.cc:409
 msgid "This is free software, and you are welcome to redistribute it "
 msgstr "Это свободное программное обеспечение, Вы можете распространять его"
 
-#: main.cc:426
+#: gtk2_ardour/main.cc:410
 #, fuzzy
 msgid "under certain conditions; see the source for copying conditions."
 msgstr "на определённых условиях; подробнее об этом читайте в файле COPYING."
 
-#: main.cc:435
+#: gtk2_ardour/main.cc:420
 msgid "could not create ARDOUR GUI"
 msgstr "не удалось создать графический интерфейс для ARDOUR"
 
-#: main.cc:453
+#: gtk2_ardour/main.cc:437
 msgid "Could not connect to JACK server as  \"%1\""
 msgstr "Не удалось соединиться с сервером JACK как \"%1\""
 
-#: main.cc:456
+#: gtk2_ardour/main.cc:446
 msgid "could not initialize Ardour."
 msgstr "не удалось запустить Ardour."
 
-#: marker.cc:244
-#, fuzzy
+#: gtk2_ardour/marker.cc:244
 msgid "MarkerText"
-msgstr "��аркерам"
+msgstr "��екстМаркера"
 
-#: marker_time_axis.cc:254
+#: gtk2_ardour/marker_time_axis.cc:254
 #, fuzzy
 msgid "Remove Marker"
 msgstr "Удалить поле"
 
-#: marker_time_axis.cc:256
-#, fuzzy
+#: gtk2_ardour/marker_time_axis.cc:256
 msgid "Marker"
-msgstr "��аркерам"
+msgstr "��аркер"
 
-#: meter_bridge.cc:78
-msgid "ardour: meter bridge"
-msgstr "ardour: индикатор уровня"
-
-#: meter_bridge.cc:79
-msgid "ardour_meter_bridge"
-msgstr "ardour_индикатор_уровня"
-
-#: meter_bridge_strip.cc:80 meter_bridge_strip.cc:94
-#, c-format
-msgid "# of %u-sample overs"
-msgstr ""
-
-#: meter_bridge_strip.cc:222
-#, fuzzy
-msgid "New Name for Meter:"
-msgstr "Новое имя индикатора:"
-
-#: mixer_strip.cc:95 mixer_strip.cc:140 mixer_strip.cc:1227
+#: gtk2_ardour/mixer_strip.cc:92 gtk2_ardour/mixer_strip.cc:137
+#: gtk2_ardour/mixer_strip.cc:1191
 msgid "pre"
 msgstr ""
 
-#: mixer_strip.cc:96 mixer_strip.cc:822
+#: gtk2_ardour/mixer_strip.cc:93 gtk2_ardour/mixer_strip.cc:782
 msgid "Comments"
-msgstr ""
+msgstr "Комментарии"
 
-#: mixer_strip.cc:119
-#, fuzzy
+#: gtk2_ardour/mixer_strip.cc:116
 msgid "Input"
-msgstr "Входов"
+msgstr "Вход"
 
-#: mixer_strip.cc:136 mixer_strip.cc:1223
-#, fuzzy
+#: gtk2_ardour/mixer_strip.cc:133 gtk2_ardour/mixer_strip.cc:1187
 msgid "input"
-msgstr "%1 вход"
+msgstr "вход"
 
-#: mixer_strip.cc:144 mixer_strip.cc:1231
-#, fuzzy
+#: gtk2_ardour/mixer_strip.cc:141 gtk2_ardour/mixer_strip.cc:1195
 msgid "post"
-msgstr "порт"
+msgstr ""
 
-#. TRANSLATORS: this string should be longest of the strings
-#. used to describe meter points. In english, its "input".
-#.
-#: mixer_strip.cc:152
+#: gtk2_ardour/mixer_strip.cc:149
 msgid "tupni"
 msgstr ""
 
-#: mixer_strip.cc:207
+#: gtk2_ardour/mixer_strip.cc:205
 msgid "Varispeed"
 msgstr ""
 
-#: mixer_strip.cc:233 mixer_strip.cc:836
+#: gtk2_ardour/mixer_strip.cc:231 gtk2_ardour/mixer_strip.cc:796
 msgid "Click to Add/Edit Comments"
-msgstr ""
+msgstr "Нажмите для добавления/правки комментариев"
 
-#: mixer_strip.cc:374
+#: gtk2_ardour/mixer_strip.cc:371
 msgid "unknown strip width \"%1\" in XML GUI information"
 msgstr "неизвестная ширина трека \"%1\" в XML описании"
 
-#: mixer_strip.cc:417
+#: gtk2_ardour/mixer_strip.cc:415
 #, fuzzy
 msgid "record"
 msgstr "Запись"
 
-#: mixer_strip.cc:418 region_editor.cc:47
+#: gtk2_ardour/mixer_strip.cc:417 gtk2_ardour/audio_region_editor.cc:46
 msgid "mute"
 msgstr "тихо"
 
-#: mixer_strip.cc:419
+#: gtk2_ardour/mixer_strip.cc:418
 msgid "solo"
 msgstr "соло"
 
-#: mixer_strip.cc:422
+#: gtk2_ardour/mixer_strip.cc:421
 msgid "comments"
-msgstr ""
+msgstr "комментарии"
 
-#: mixer_strip.cc:424
+#: gtk2_ardour/mixer_strip.cc:423
 msgid "*comments*"
-msgstr ""
+msgstr "*комментарии*"
 
-#: mixer_strip.cc:438
-#, fuzzy
+#: gtk2_ardour/mixer_strip.cc:438
 msgid "Rec"
-msgstr "��бновить"
+msgstr "��ап"
 
-#: mixer_strip.cc:439
+#: gtk2_ardour/mixer_strip.cc:440
 msgid "M"
-msgstr ""
+msgstr "M"
 
-#: mixer_strip.cc:440
+#: gtk2_ardour/mixer_strip.cc:441
 msgid "S"
-msgstr ""
+msgstr "S"
 
-#: mixer_strip.cc:443 mixer_strip.cc:830
-#, fuzzy
+#: gtk2_ardour/mixer_strip.cc:444 gtk2_ardour/mixer_strip.cc:790
 msgid "Cmt"
-msgstr "вырезать"
+msgstr ""
 
-#: mixer_strip.cc:445 mixer_strip.cc:828
+#: gtk2_ardour/mixer_strip.cc:446 gtk2_ardour/mixer_strip.cc:788
 msgid "*Cmt*"
 msgstr ""
 
-#: mixer_strip.cc:483 mixer_strip.cc:549 redirect_box.cc:1006
+#: gtk2_ardour/mixer_strip.cc:484 gtk2_ardour/mixer_strip.cc:550
+#: gtk2_ardour/redirect_box.cc:1021
 msgid "Not connected to JACK - no I/O changes are possible"
 msgstr ""
 
-#: mixer_strip.cc:560
-msgid "Track"
-msgstr "Трек"
-
-#: mixer_strip.cc:588 mixer_strip.cc:604
+#: gtk2_ardour/mixer_strip.cc:584 gtk2_ardour/mixer_strip.cc:600
 msgid "could not register new ports required for that connection"
-msgstr ""
+msgstr "Не удалось зарегистрировать новые порты для этого соединения"
 
-#: mixer_strip.cc:747
-#, fuzzy
+#: gtk2_ardour/mixer_strip.cc:707
 msgid " Input"
-msgstr "# Входов"
+msgstr " Вход"
 
-#: mixer_strip.cc:750
-#, fuzzy
+#: gtk2_ardour/mixer_strip.cc:710
 msgid "I"
 msgstr "ВХ"
 
-#: mixer_strip.cc:820
+#: gtk2_ardour/mixer_strip.cc:780
 msgid "*Comments*"
-msgstr ""
+msgstr "*Комментарии*"
 
-#: mixer_strip.cc:859
-#, fuzzy
+#: gtk2_ardour/mixer_strip.cc:819
 msgid ": comment editor"
-msgstr "Интерфейс: не удалось инициализировать редактор"
+msgstr ": редактор комментариев"
 
-#: mixer_strip.cc:953
+#: gtk2_ardour/mixer_strip.cc:913
 msgid "Grp"
 msgstr ""
 
-#: mixer_strip.cc:956
+#: gtk2_ardour/mixer_strip.cc:916
 msgid "~G"
 msgstr "нГр"
 
-#: mixer_strip.cc:1004
-#, fuzzy
+#: gtk2_ardour/mixer_strip.cc:964
 msgid "Invert Polarity"
-msgstr "полярность"
+msgstr "��азвернуть ��олярность"
 
-#: mixer_ui.cc:85
+#: gtk2_ardour/mixer_ui.cc:83
 msgid "Strips"
 msgstr "Каналы"
 
-#: mixer_ui.cc:110
-#, fuzzy
+#: gtk2_ardour/mixer_ui.cc:108
 msgid "Group"
-msgstr "Mix группы"
+msgstr "Группа"
 
-#: mixer_ui.cc:211 mixer_ui.cc:370
+#: gtk2_ardour/mixer_ui.cc:209 gtk2_ardour/mixer_ui.cc:389
 msgid "ardour: mixer"
 msgstr "ardour: микшер"
 
-#: mixer_ui.cc:212
+#: gtk2_ardour/mixer_ui.cc:210
 msgid "ardour_mixer"
 msgstr "ardour_микшер"
 
-#: mixer_ui.cc:346
+#: gtk2_ardour/mixer_ui.cc:361
 msgid "ardour: mixer: "
 msgstr "ardour: микшер: "
 
-#: mixer_ui.cc:573
+#: gtk2_ardour/mixer_ui.cc:592
 msgid "signal"
 msgstr "сигнал"
 
-#: mixer_ui.cc:723
+#: gtk2_ardour/mixer_ui.cc:741
 msgid "track display list item for renamed strip not found!"
 msgstr ""
 
-#: new_session_dialog.cc:39
-#, fuzzy
+#: gtk2_ardour/new_session_dialog.cc:41
 msgid "New Session Name :"
-msgstr "Имя сессии:"
+msgstr "Имя новой сессии:"
 
-#: new_session_dialog.cc:41
+#: gtk2_ardour/new_session_dialog.cc:45
 msgid "Create Session Directory In :"
-msgstr ""
+msgstr "Создать каталог сессии в:"
 
-#: new_session_dialog.cc:43
-#, fuzzy
+#: gtk2_ardour/new_session_dialog.cc:47
 msgid "Use Session Template :"
-msgstr "��спользовать имеющийся шаблон"
+msgstr "��спользовать шаблон:"
 
-#: new_session_dialog.cc:45
-#, fuzzy
+#: gtk2_ardour/new_session_dialog.cc:49
 msgid "Channel Count"
-msgstr "��тменить импорт"
+msgstr "��исло каналов"
 
-#: new_session_dialog.cc:46
-#, fuzzy
+#: gtk2_ardour/new_session_dialog.cc:50
 msgid "Create Monitor Bus"
-msgstr "��онтрольные выходы"
+msgstr "��оздать контрольную шину"
 
-#: new_session_dialog.cc:53
-#, fuzzy
+#: gtk2_ardour/new_session_dialog.cc:57
 msgid "Create Master Bus"
-msgstr "��спользовать мастер-выходы"
+msgstr "��оздать мастер-шину"
 
-#: new_session_dialog.cc:55
-#, fuzzy
+#: gtk2_ardour/new_session_dialog.cc:59
 msgid "Automatically Connect Inputs"
-msgstr "��втоматическое подключение треков ко входам"
+msgstr "��втоматическое подключение ко входам"
 
-#: new_session_dialog.cc:56 new_session_dialog.cc:67
-#, fuzzy
+#: gtk2_ardour/new_session_dialog.cc:60 gtk2_ardour/new_session_dialog.cc:71
 msgid "Port Limit"
-msgstr "��абыть"
+msgstr "��ортов не более чем"
 
-#: new_session_dialog.cc:64
-#, fuzzy
+#: gtk2_ardour/new_session_dialog.cc:68
 msgid "<b>Track/Bus Inputs</b>"
-msgstr "Треки/Шины"
+msgstr "<b>Входы дорожек/шин</b>"
 
-#: new_session_dialog.cc:66
-#, fuzzy
+#: gtk2_ardour/new_session_dialog.cc:70
 msgid "Automatically Connect Outputs"
-msgstr "ручное подключение треков к выходам"
+msgstr "Автоматическое подключение к выходам"
 
-#: new_session_dialog.cc:75
+#: gtk2_ardour/new_session_dialog.cc:79
 msgid "Connect to Master Bus"
-msgstr ""
+msgstr "Соединиться с мастер-шиной"
 
-#: new_session_dialog.cc:76
+#: gtk2_ardour/new_session_dialog.cc:80
 msgid "Connect to Physical Outputs"
-msgstr ""
+msgstr "Соединиться с физическими выходами"
 
-#: new_session_dialog.cc:80
-#, fuzzy
+#: gtk2_ardour/new_session_dialog.cc:84
 msgid "<b>Track/Bus Outputs</b>"
-msgstr "Выходов"
+msgstr "<b>Выходы дорожек/шин</b>"
 
-#: new_session_dialog.cc:83
-#, fuzzy
+#: gtk2_ardour/new_session_dialog.cc:87
 msgid "Advanced Options"
-msgstr "Р��дактор параметров"
+msgstr "Р��сширенные параметры"
 
-#: new_session_dialog.cc:91
-#, fuzzy
+#: gtk2_ardour/new_session_dialog.cc:95
 msgid "Open Recent Session"
-msgstr "��ткрыть сессию"
+msgstr "��ткрыть недавнюю сессию"
 
-#: new_session_dialog.cc:127
-#, fuzzy
+#: gtk2_ardour/new_session_dialog.cc:131
 msgid "Open Session File :"
-msgstr "��ткрыть сессию"
+msgstr "��ткрыть файл сессии:"
 
-#: new_session_dialog.cc:274
-#, fuzzy
+#: gtk2_ardour/new_session_dialog.cc:281
 msgid "New Session"
-msgstr "С��ссия"
+msgstr "С��здать сессию"
 
-#: new_session_dialog.cc:276
-#, fuzzy
+#: gtk2_ardour/new_session_dialog.cc:283
 msgid "Open Session"
-msgstr "�ткрыть сессию"
+msgstr "�ткрыть сессию"
 
-#: new_session_dialog.cc:281
-#, fuzzy
+#: gtk2_ardour/new_session_dialog.cc:288
 msgid "ardour: session control"
-msgstr "ardour_новая_сессия"
+msgstr "Сессии Ardour"
 
-#: new_session_dialog.cc:310
-#, fuzzy
+#: gtk2_ardour/new_session_dialog.cc:317
 msgid "select template"
-msgstr "-шаблон"
+msgstr "Выберите шаблон"
 
-#: new_session_dialog.cc:316
-#, fuzzy
+#: gtk2_ardour/new_session_dialog.cc:323
 msgid "select session file"
-msgstr "Воспроизвести выделенную область"
+msgstr "Выберите файл сессии"
 
-#: new_session_dialog.cc:325
-#, fuzzy
+#: gtk2_ardour/new_session_dialog.cc:332
 msgid "select directory"
-msgstr "Воспроизвести выделенную область"
+msgstr "Выберите каталог"
 
-#: option_editor.cc:76
-#, fuzzy
+#: gtk2_ardour/option_editor.cc:75
 msgid "SMPTE offset is negative"
-msgstr "Смещение SMPTE"
+msgstr "Смещение SMPTE отрицательно"
 
-#: option_editor.cc:102
+#: gtk2_ardour/option_editor.cc:101
 msgid "ardour: options editor"
-msgstr "adour: редактор параметров"
+msgstr "Редактор параметров"
 
-#: option_editor.cc:103
+#: gtk2_ardour/option_editor.cc:102
 msgid "ardour_option_editor"
-msgstr "adour_редактор_параметров"
+msgstr "ardour_редактор_параметров"
 
-#: option_editor.cc:127
+#: gtk2_ardour/option_editor.cc:126
 msgid "Paths/Files"
 msgstr "Пути/Файлы"
 
-#: option_editor.cc:128
+#: gtk2_ardour/option_editor.cc:127
 msgid "Kbd/Mouse"
 msgstr "Клавиатура/Мышь"
 
-#: option_editor.cc:131
+#: gtk2_ardour/option_editor.cc:130
 msgid "Layers & Fades"
-msgstr ""
+msgstr "Слои и фейды"
 
-#: option_editor.cc:135
+#: gtk2_ardour/option_editor.cc:134
 msgid "MIDI"
 msgstr "MIDI"
 
-#: option_editor.cc:177
-msgid "24 FPS"
-msgstr ""
-
-#: option_editor.cc:179
-msgid "25 FPS"
-msgstr ""
-
-#: option_editor.cc:181
-msgid "30 FPS"
-msgstr ""
-
-#: option_editor.cc:187
-msgid "30 FPS drop"
-msgstr ""
-
-#: option_editor.cc:244
+#: gtk2_ardour/option_editor.cc:222
 msgid "session RAID path"
-msgstr "��уть к файлам RAID сессий"
+msgstr "��уть к файлам RAID-сессий"
 
-#: option_editor.cc:249
-#, fuzzy
+#: gtk2_ardour/option_editor.cc:227
 msgid "Soundfile Search Paths"
-msgstr "��удио-библиотека"
+msgstr "��уть к звуковым файлам"
 
-#: option_editor.cc:254
-#, fuzzy
-msgid "Paths"
-msgstr "Пути/Файлы"
-
-#: option_editor.cc:268 option_editor.cc:274 option_editor.cc:723
-#: option_editor.cc:750
+#: gtk2_ardour/option_editor.cc:252 gtk2_ardour/option_editor.cc:258
+#: gtk2_ardour/option_editor.cc:670 gtk2_ardour/option_editor.cc:697
 msgid "internal"
 msgstr "внутренний"
 
-#: option_editor.cc:287
+#: gtk2_ardour/option_editor.cc:271
 msgid "Short crossfade length (msecs)"
 msgstr ""
 
-#: option_editor.cc:299
+#: gtk2_ardour/option_editor.cc:283
 msgid "Destructive crossfade length (msecs)"
 msgstr ""
 
-#: option_editor.cc:367
-msgid "SMPTE Frames/second"
-msgstr "SMPTE Кадры/Секунды"
-
-#: option_editor.cc:368
+#: gtk2_ardour/option_editor.cc:342
 msgid "SMPTE Offset"
 msgstr "Смещение SMPTE"
 
-#: option_editor.cc:462 option_editor.cc:469 option_editor.cc:472
-#: option_editor.cc:618
-#, fuzzy
+#: gtk2_ardour/option_editor.cc:409 gtk2_ardour/option_editor.cc:416
+#: gtk2_ardour/option_editor.cc:419 gtk2_ardour/option_editor.cc:565
 msgid "online"
-msgstr "линейное"
+msgstr ""
 
-#. remember, we have to handle the i18n case where the relative
-#. lengths of the strings in language N is different than in english.
-#.
-#: option_editor.cc:469 option_editor.cc:470 option_editor.cc:615
-#, fuzzy
+#: gtk2_ardour/option_editor.cc:416 gtk2_ardour/option_editor.cc:417
+#: gtk2_ardour/option_editor.cc:562
 msgid "offline"
-msgstr "линейное"
+msgstr ""
 
-#: option_editor.cc:670
+#: gtk2_ardour/option_editor.cc:617
 msgid "Choose Click"
-msgstr ""
+msgstr "Выберите щелчок метронома"
 
-#: option_editor.cc:689
-#, fuzzy
+#: gtk2_ardour/option_editor.cc:636
 msgid "Choose Click Emphasis"
-msgstr "��спользовать как акцентирующий щелчок метронома"
+msgstr "��ыберите акцентирующий щелчок метронома"
 
-#: option_editor.cc:803
+#: gtk2_ardour/option_editor.cc:750
 msgid "Click audio file"
 msgstr "Файл щелчков метронома"
 
-#: option_editor.cc:809
+#: gtk2_ardour/option_editor.cc:756
 msgid "Click emphasis audiofile"
 msgstr "Файл акцентирующих щелчков метронома"
 
-#: option_editor.cc:846
+#: gtk2_ardour/option_editor.cc:793
 msgid ""
 "The auditioner is a dedicated mixer strip used\n"
 "for listening to specific regions outside the context\n"
 "of the overall mix. It can be connected just like any\n"
 "other mixer strip."
 msgstr ""
-"Контрольный канал - это специальный канал микшера\n"
-"предназначенный для прослушивания определённых областей\n"
-"вне общего контекста микса. Его можно соединить как любой\n"
-"другой канал микшера."
+"Контрольный канал — это специальный канал микшера предназначенный \n"
+"для прослушивания определённых областей вне общего контекста микса. \n"
+"Его можно соединить как любой другой канал микшера."
 
-#: option_editor.cc:919
+#: gtk2_ardour/option_editor.cc:866
 msgid "Edit using"
-msgstr "Редактировать сочетание"
+msgstr "Редактировать с"
 
-#: option_editor.cc:926 option_editor.cc:953
+#: gtk2_ardour/option_editor.cc:873 gtk2_ardour/option_editor.cc:900
 msgid "+ button"
 msgstr "+ клавиша"
 
-#: option_editor.cc:946
+#: gtk2_ardour/option_editor.cc:893
 msgid "Delete using"
-msgstr "Удалить сочетание"
+msgstr "Удалять с"
 
-#: option_editor.cc:973
+#: gtk2_ardour/option_editor.cc:920
 msgid "Ignore snap using"
-msgstr "��е использовать \"снимки\""
+msgstr "��гнорировать привязку с"
 
-#: opts.cc:46
+#: gtk2_ardour/opts.cc:46
 msgid "Usage: "
 msgstr "Использование: "
 
-#: opts.cc:47
+#: gtk2_ardour/opts.cc:47
 msgid "  -v, --version                    Show version information\n"
 msgstr "  -v, --version                    Информация о версии программы\n"
 
-#: opts.cc:48
+#: gtk2_ardour/opts.cc:48
 msgid "  -h, --help                       Print this message\n"
 msgstr "  -h, --help                       Показать это сообщение\n"
 
-#: opts.cc:49
+#: gtk2_ardour/opts.cc:49
 msgid ""
 "  -b, --bindings                   Print all possible keyboard binding "
 "names\n"
@@ -5379,234 +5152,198 @@ msgstr ""
 "  -b, --bindings                   Показать все доступные \"горячие\" "
 "клавиши\n"
 
-#: opts.cc:50
-#, fuzzy
+#: gtk2_ardour/opts.cc:50
 msgid "  -n, --show-splash                Show splash screen\n"
 msgstr "  -n, --no-splash                  Не показывать заставку\n"
 
-#: opts.cc:51
-#, fuzzy
+#: gtk2_ardour/opts.cc:51
 msgid ""
 "  -c, --name  name                 Use a specific jack client name, default "
 "is ardour\n"
 msgstr ""
-"  -c, --jack-client-name  имя     Использовать другое имя jack-клиента, "
-"ardour по умолчанию\n"
+"  -c, --jack-client-name  имя     Использовать другое имя клиента к JACK, "
+"по умолчанию — Ardour\n"
 
-#: opts.cc:52
-#, fuzzy
+#: gtk2_ardour/opts.cc:52
 msgid ""
 "  -N, --new session-name           Create a new session from the command "
 "line\n"
-msgstr ""
-"  [имя-сессии]                     Загрузить сессию с указанным именем\n"
+msgstr "  -N, --new имя-сессии           Создать новую сессию из командной строки\n"
 
-#: opts.cc:53
-msgid ""
-"  -o, --use-hw-optimizations        Try to use h/w specific optimizations\n"
+#: gtk2_ardour/opts.cc:53
+msgid "  -o, --use-hw-optimizations        Try to use h/w specific optimizations\n"
 msgstr ""
 
-#: opts.cc:55
+#: gtk2_ardour/opts.cc:55
 #, fuzzy
 msgid "  -V, --novst                      Do not use VST support\n"
 msgstr "  -n, --no-splash                  Не показывать заставку\n"
 
-#: opts.cc:57
+#: gtk2_ardour/opts.cc:57
 msgid "  [session-name]                   Name of session to load\n"
-msgstr ""
-"  [имя-сессии]                     Загрузить сессию с указанным именем\n"
+msgstr "  [имя-сессии]                     Загрузить сессию с указанным именем\n"
 
-#: opts.cc:58
+#: gtk2_ardour/opts.cc:58
 msgid "  -C, --curvetest filename         Curve algorithm debugger\n"
 msgstr ""
 
-#: opts.cc:59
+#: gtk2_ardour/opts.cc:59
 #, fuzzy
 msgid "  -g, --gtktheme                   Allow GTK to load a theme\n"
 msgstr "  -h, --help                       Показать это сообщение\n"
 
-#: pan_automation_time_axis.cc:60
-msgid "You can't graphically edit panning of more than stream"
+#: gtk2_ardour/pan_automation_time_axis.cc:70
+msgid "You need to select which line to edit"
 msgstr ""
 
-#: pan_automation_time_axis.cc:80
-#, fuzzy
+#: gtk2_ardour/pan_automation_time_axis.cc:91
 msgid "add pan automation event"
-msgstr "��втомат"
+msgstr "��обавить автомат. событие панорамы"
 
-#: panner2d.cc:589 panner_ui.cc:435 plugin_ui.cc:834
-#, fuzzy
+#: gtk2_ardour/panner2d.cc:589 gtk2_ardour/panner_ui.cc:425
+#: gtk2_ardour/plugin_ui.cc:146
 msgid "Bypass"
-msgstr "�бход"
+msgstr "�бход"
 
-#: panner_ui.cc:58 panner_ui.cc:225
+#: gtk2_ardour/panner_ui.cc:56 gtk2_ardour/panner_ui.cc:223
 #, fuzzy
 msgid "link"
 msgstr "в"
 
-#: panner_ui.cc:69
-#, fuzzy
+#: gtk2_ardour/panner_ui.cc:67
 msgid "Pan automation mode"
-msgstr "��втомат"
+msgstr "��ежим автоматизации панорамы"
 
-#: panner_ui.cc:70
-#, fuzzy
+#: gtk2_ardour/panner_ui.cc:68
 msgid "Pan automation type"
-msgstr "��втомат"
+msgstr "��ип автоматизации панорамы"
 
-#: panner_ui.cc:81
+#: gtk2_ardour/panner_ui.cc:79
 msgid "panning link control"
 msgstr ""
 
-#: panner_ui.cc:83
+#: gtk2_ardour/panner_ui.cc:81
 msgid "panning link direction"
 msgstr ""
 
-#: panner_ui.cc:235
+#: gtk2_ardour/panner_ui.cc:233
 msgid "L"
-msgstr ""
-
-#: panner_ui.cc:335
-#, c-format
-msgid "panner for channel %lu"
-msgstr ""
+msgstr "L"
 
-#: panner_ui.cc:337
+#: gtk2_ardour/panner_ui.cc:328
 #, c-format
-msgid "panner for channel %u"
+msgid "panner for channel %zu"
 msgstr ""
 
-#: panner_ui.cc:445
-#, fuzzy
+#: gtk2_ardour/panner_ui.cc:435
 msgid "Reset all"
-msgstr "��громная"
+msgstr "��бросить все"
 
-#: playlist_selector.cc:52
-#, fuzzy
+#: gtk2_ardour/playlist_selector.cc:52
 msgid "ardour: playlists"
-msgstr "ardour: модули (plugins)"
+msgstr "Списки воспроизведения"
 
-#: playlist_selector.cc:59
+#: gtk2_ardour/playlist_selector.cc:59
 msgid "Playlists grouped by track"
-msgstr ""
+msgstr "Списки, сгруппированные по дорожке"
 
-#: playlist_selector.cc:98
-#, fuzzy
+#: gtk2_ardour/playlist_selector.cc:98
 msgid "ardour: playlist for "
-msgstr "ardour: ��едактор: "
+msgstr "ardour: ��писок воспроизведения для "
 
-#: playlist_selector.cc:114
-#, fuzzy
+#: gtk2_ardour/playlist_selector.cc:114
 msgid "Other tracks"
-msgstr "��крыть трек"
+msgstr "��ругие дорожки"
 
-#: playlist_selector.cc:130
+#: gtk2_ardour/playlist_selector.cc:130
 msgid "unassigned"
 msgstr ""
 
-#: plugin_selector.cc:43
+#: gtk2_ardour/plugin_selector.cc:43
 msgid "ardour: plugins"
-msgstr "ardour: модули (plugins)"
+msgstr "ardour: расширения"
 
-#: plugin_selector.cc:56
-#, fuzzy
+#: gtk2_ardour/plugin_selector.cc:56
 msgid "Available LADSPA Plugins"
-msgstr "Доступные LADSPA модули"
+msgstr "Доступные расширения LADSPA"
 
-#: plugin_selector.cc:57
+#: gtk2_ardour/plugin_selector.cc:57
 msgid "Type"
 msgstr "Тип"
 
-#: plugin_selector.cc:58 plugin_selector.cc:81
+#: gtk2_ardour/plugin_selector.cc:58 gtk2_ardour/plugin_selector.cc:81
+#: gtk2_ardour/plugin_selector.cc:99
 msgid "# Inputs"
-msgstr "# �ходов"
+msgstr "# �ходов"
 
-#: plugin_selector.cc:59 plugin_selector.cc:82
+#: gtk2_ardour/plugin_selector.cc:59 gtk2_ardour/plugin_selector.cc:82
+#: gtk2_ardour/plugin_selector.cc:100
 msgid "# Outputs"
-msgstr "# �ыходов"
+msgstr "# �ыходов"
 
-#: plugin_selector.cc:68
+#: gtk2_ardour/plugin_selector.cc:68
 msgid "Plugins to be Connected to Insert"
 msgstr ""
 
-#: plugin_selector.cc:80
-#, fuzzy
+#: gtk2_ardour/plugin_selector.cc:80 gtk2_ardour/plugin_selector.cc:98
 msgid "Available plugins"
-msgstr "Доступные LADSPA модули"
+msgstr "Доступные расширения"
 
-#: plugin_selector.cc:98
+#: gtk2_ardour/plugin_selector.cc:117
 msgid "Add a plugin to the effect list"
-msgstr "Добавить модуль в список эффектов"
+msgstr "Добавить расширение в список эффектов"
 
-#: plugin_selector.cc:102
+#: gtk2_ardour/plugin_selector.cc:121
 msgid "Remove a plugin from the effect list"
-msgstr "Удалить модуль из списка эффектов"
+msgstr "Удалить расширение из списка эффектов"
 
-#: plugin_selector.cc:104
+#: gtk2_ardour/plugin_selector.cc:123
 msgid "Update available plugins"
-msgstr "Обновить доступные модули"
+msgstr "Обновить доступные расширения"
 
-#: plugin_selector.cc:126
-#, fuzzy
+#: gtk2_ardour/plugin_selector.cc:146
 msgid "LADSPA"
-msgstr "ADAT"
+msgstr "LADSPA"
 
-#: plugin_selector.cc:129
-#, fuzzy
+#: gtk2_ardour/plugin_selector.cc:150
 msgid "VST"
-msgstr "УСТАНОВИТЬ"
+msgstr "VST"
+
+#: gtk2_ardour/plugin_selector.cc:155
+msgid "AudioUnit"
+msgstr "AudioUnit"
 
-#: plugin_ui.cc:84
+#: gtk2_ardour/plugin_ui.cc:85
 msgid ""
 "unknown type of editor-supplying plugin (note: no VST support in this "
 "version of ardour)"
 msgstr ""
 
-#: plugin_ui.cc:139
-msgid "<span size=\"large\">Presets</span>"
-msgstr ""
-
-#: plugin_ui.cc:230
-#, fuzzy
-msgid "Controls"
-msgstr "Контрольные выходы"
-
-#: plugin_ui.cc:267
-msgid "Plugin Editor: could not build control element for port %1"
-msgstr "Редактор модулей: невозможно создать эффект для порта %1"
-
-#: plugin_ui.cc:358
-#, fuzzy
-msgid "Automation control"
-msgstr "автомат"
-
-#: plugin_ui.cc:854
+#: gtk2_ardour/plugin_ui.cc:166
 msgid "Plugin preset %1 not found"
 msgstr ""
 
-#: plugin_ui.cc:864
-#, fuzzy
+#: gtk2_ardour/plugin_ui.cc:176
 msgid "Name of New Preset:"
-msgstr "Имя ново��о соединения:"
+msgstr "Имя ново�� предустановки:"
 
-#: redirect_automation_line.cc:54
+#: gtk2_ardour/redirect_automation_line.cc:54
 msgid "redirect automation created for non-plugin"
 msgstr ""
 
-#: redirect_automation_time_axis.cc:94
+#: gtk2_ardour/redirect_automation_time_axis.cc:96
 msgid "add automation event to "
 msgstr ""
 
-#: redirect_box.cc:223
+#: gtk2_ardour/redirect_box.cc:226
 msgid "New send"
-msgstr ""
+msgstr "Новый посыл"
 
-#: redirect_box.cc:224
-#, fuzzy
+#: gtk2_ardour/redirect_box.cc:227
 msgid "Show send controls"
-msgstr "использовать контрольные выходы"
+msgstr ""
 
-#: redirect_box.cc:383
+#: gtk2_ardour/redirect_box.cc:386
 msgid ""
 "You attempted to add a plugin (%1).\n"
 "The plugin has %2 inputs\n"
@@ -5617,7 +5354,7 @@ msgid ""
 "part of the signal."
 msgstr ""
 
-#: redirect_box.cc:395
+#: gtk2_ardour/redirect_box.cc:398
 msgid ""
 "You attempted to add a plugin (%1).\n"
 "The plugin has %2 inputs\n"
@@ -5629,7 +5366,7 @@ msgid ""
 "support this type of configuration."
 msgstr ""
 
-#: redirect_box.cc:408
+#: gtk2_ardour/redirect_box.cc:411
 msgid ""
 "You attempted to add a plugin (%1).\n"
 "\n"
@@ -5642,34 +5379,34 @@ msgid ""
 "Ardour does not understand what to do in such situations.\n"
 msgstr ""
 
-#: redirect_box.cc:495
+#: gtk2_ardour/redirect_box.cc:499
 msgid "Pre-fader inserts, sends & plugins:"
 msgstr ""
 
-#: redirect_box.cc:498
+#: gtk2_ardour/redirect_box.cc:502
 msgid "Post-fader inserts, sends & plugins:"
 msgstr ""
 
-#: redirect_box.cc:644
+#: gtk2_ardour/redirect_box.cc:650
 msgid ""
 "You cannot reorder this set of redirects\n"
 "in that way because the inputs and\n"
 "outputs do not work correctly."
 msgstr ""
 
-#: redirect_box.cc:749
+#: gtk2_ardour/redirect_box.cc:750
 #, fuzzy
 msgid "rename redirect"
 msgstr "ardour: переименовать область"
 
-#: redirect_box.cc:826 redirect_box.cc:874
+#: gtk2_ardour/redirect_box.cc:824 gtk2_ardour/redirect_box.cc:872
 msgid ""
 "Copying the set of redirects on the clipboard failed,\n"
 "probably because the I/O configuration of the plugins\n"
 "could not match the configuration of this track."
 msgstr ""
 
-#: redirect_box.cc:896
+#: gtk2_ardour/redirect_box.cc:894
 #, fuzzy
 msgid ""
 "Do you really want to remove all redirects from this track?\n"
@@ -5678,7 +5415,7 @@ msgstr ""
 "Вы действительно хотите удалить трек \"%1\" ?\n"
 "(отмена невозможна)"
 
-#: redirect_box.cc:899
+#: gtk2_ardour/redirect_box.cc:897
 #, fuzzy
 msgid ""
 "Do you really want to remove all redirects from this bus?\n"
@@ -5687,258 +5424,247 @@ msgstr ""
 "Вы действительно хотите удалить трек \"%1\" ?\n"
 "(отмена невозможна)"
 
-#: redirect_box.cc:904
-#, fuzzy
+#: gtk2_ardour/redirect_box.cc:902
 msgid "Yes, remove them all"
-msgstr "Да, удалить."
+msgstr "Да, удалить их все"
 
-#: redirect_box.cc:940
+#: gtk2_ardour/redirect_box.cc:938
 #, fuzzy
 msgid "ardour: %1"
 msgstr "ardour: "
 
-#: redirect_box.cc:982
+#: gtk2_ardour/redirect_box.cc:983
 #, fuzzy
 msgid "ardour: %1: %2 (by %3)"
 msgstr "ardour: "
 
-#. new stuff
-#: redirect_box.cc:1054
+#: gtk2_ardour/redirect_box.cc:1069
 msgid "New Plugin ..."
-msgstr ""
+msgstr "Новое расширение..."
 
-#: redirect_box.cc:1055
-#, fuzzy
+#: gtk2_ardour/redirect_box.cc:1070
 msgid "New Insert"
-msgstr "��овый вход"
+msgstr "��овый возврат"
 
-#: redirect_box.cc:1056
+#: gtk2_ardour/redirect_box.cc:1071
 msgid "New Send ..."
-msgstr ""
+msgstr "Новый посыл..."
 
-#: redirect_box.cc:1068
-#, fuzzy
+#: gtk2_ardour/redirect_box.cc:1083
 msgid "Deselect All"
-msgstr "��ыделить всё"
+msgstr "��нять все выделения"
 
-#: redirect_box.cc:1075
-#, fuzzy
+#: gtk2_ardour/redirect_box.cc:1090
 msgid "Activate all"
-msgstr "Активировать"
+msgstr "Активировать все"
 
-#: redirect_box.cc:1076
-#, fuzzy
+#: gtk2_ardour/redirect_box.cc:1091
 msgid "Deactivate all"
-msgstr "Деактивировать"
+msgstr "Деактивировать все"
 
-#: region_editor.cc:45
+#: gtk2_ardour/audio_region_editor.cc:44
 msgid "NAME:"
 msgstr "ИМЯ:"
 
-#: region_editor.cc:46
+#: gtk2_ardour/audio_region_editor.cc:45
 msgid "lock"
-msgstr "фикс."
+msgstr "запереть"
 
-#: region_editor.cc:48
+#: gtk2_ardour/audio_region_editor.cc:47
 msgid "opaque"
 msgstr "затенить"
 
-#: region_editor.cc:49 region_editor.cc:192 region_editor.cc:226
+#: gtk2_ardour/audio_region_editor.cc:48
+#: gtk2_ardour/audio_region_editor.cc:191
+#: gtk2_ardour/audio_region_editor.cc:225
 msgid "active"
 msgstr "активно"
 
-#: region_editor.cc:50
+#: gtk2_ardour/audio_region_editor.cc:49
 msgid "visible"
-msgstr "��тображать"
+msgstr "��идимы"
 
-#: region_editor.cc:53
+#: gtk2_ardour/audio_region_editor.cc:52
 msgid "Layer"
 msgstr "Слой"
 
-#: region_editor.cc:54
+#: gtk2_ardour/audio_region_editor.cc:53
 msgid "play"
 msgstr "воспроизвести"
 
-#: region_editor.cc:61
+#: gtk2_ardour/audio_region_editor.cc:60
 msgid "ENVELOPE"
 msgstr "ОГИБАЮЩАЯ"
 
-#: region_editor.cc:107
+#: gtk2_ardour/audio_region_editor.cc:106
 msgid "mute this region"
 msgstr "отключить воспроизведение этой области"
 
-#: region_editor.cc:108
+#: gtk2_ardour/audio_region_editor.cc:107
 msgid "regions underneath this one cannot be heard"
 msgstr "области ниже этой не могут быть прослушаны"
 
-#: region_editor.cc:109
+#: gtk2_ardour/audio_region_editor.cc:108
 msgid "prevent any changes to this region"
 msgstr "запретить любые изменения этой области"
 
-#: region_editor.cc:110
+#: gtk2_ardour/audio_region_editor.cc:109
 msgid "use the gain envelope during playback"
 msgstr "использовать огибающую при воспроизведении"
 
-#: region_editor.cc:111
+#: gtk2_ardour/audio_region_editor.cc:110
 msgid "show the gain envelope"
 msgstr "отображать огибающую"
 
-#: region_editor.cc:112
+#: gtk2_ardour/audio_region_editor.cc:111
 msgid "use fade in curve during playback"
 msgstr "использовать вводную кривую при воспроизведении"
 
-#: region_editor.cc:113
+#: gtk2_ardour/audio_region_editor.cc:112
 msgid "use fade out curve during playback"
 msgstr "использовать выводную кривую при воспроизведении"
 
-#: region_editor.cc:114
+#: gtk2_ardour/audio_region_editor.cc:113
 msgid "audition this region"
 msgstr "прослушать область"
 
-#: region_editor.cc:147
+#: gtk2_ardour/audio_region_editor.cc:146
 msgid "START:"
 msgstr "НАЧАЛО:"
 
-#: region_editor.cc:149
+#: gtk2_ardour/audio_region_editor.cc:148
 msgid "END:"
 msgstr "КОНЕЦ:"
 
-#: region_editor.cc:151
+#: gtk2_ardour/audio_region_editor.cc:150
 msgid "LENGTH:"
 msgstr "ДЛИНА:"
 
-#: region_editor.cc:191
+#: gtk2_ardour/audio_region_editor.cc:190
 msgid "FADE IN"
 msgstr "ВВЕДЕНИЕ В УРОВЕНЬ"
 
-#: region_editor.cc:193 region_editor.cc:227
+#: gtk2_ardour/audio_region_editor.cc:192
+#: gtk2_ardour/audio_region_editor.cc:226
 msgid "msecs"
-msgstr "мсек"
+msgstr "мс"
 
-#: region_editor.cc:225
+#: gtk2_ardour/audio_region_editor.cc:224
 msgid "FADE OUT"
 msgstr "СВЕДЕНИЕ В НОЛЬ"
 
-#: region_editor.cc:265
+#: gtk2_ardour/audio_region_editor.cc:264
 msgid "ardour: region "
 msgstr "ardour: область "
 
-#: region_editor.cc:402
+#: gtk2_ardour/audio_region_editor.cc:401
 msgid "fade in edit"
 msgstr "редактировать введение в уровень"
 
-#: region_editor.cc:414
+#: gtk2_ardour/audio_region_editor.cc:413
 msgid "fade out edit"
 msgstr "редактировать сведение в ноль"
 
-#: regionview.cc:1146
+#: gtk2_ardour/audio_region_view.cc:901
 #, fuzzy
 msgid "add gain control point"
 msgstr "использовать контрольные выходы"
 
-#: route_params_ui.cc:89
+#: gtk2_ardour/route_params_ui.cc:85
 msgid "Tracks/Buses"
-msgstr "��реки/Шины"
+msgstr "��орожи/Шины"
 
-#: route_params_ui.cc:109
+#: gtk2_ardour/route_params_ui.cc:105
 #, fuzzy
 msgid "Pre-fader Redirects"
 msgstr "Предобработка"
 
-#: route_params_ui.cc:110
+#: gtk2_ardour/route_params_ui.cc:106
 #, fuzzy
 msgid "Post-fader Redirects"
 msgstr "Постобработка"
 
-#: route_params_ui.cc:144
+#: gtk2_ardour/route_params_ui.cc:140
 #, fuzzy
 msgid "ardour: track/bus inspector"
 msgstr "ardour: добавить трек/шину"
 
-#: route_params_ui.cc:145
+#: gtk2_ardour/route_params_ui.cc:141
 msgid "ardour_route_parameters"
 msgstr "ardour_параметры_маршрутов"
 
-#: route_params_ui.cc:202
+#: gtk2_ardour/route_params_ui.cc:202
 msgid "route display list item for renamed route not found!"
 msgstr ""
 
-#: route_params_ui.cc:453
+#: gtk2_ardour/route_params_ui.cc:449
 msgid "NO TRACK"
 msgstr "НЕТ ТРЕКОВ"
 
-#: route_params_ui.cc:695
+#: gtk2_ardour/route_params_ui.cc:672
 #, fuzzy
 msgid "ardour: track/bus inspector: "
 msgstr "ardour: добавить трек/шину"
 
-#: route_params_ui.cc:699
+#: gtk2_ardour/route_params_ui.cc:676
 msgid "No Route Selected"
 msgstr "Нет выбранных маршрутов"
 
-#: route_params_ui.cc:700
+#: gtk2_ardour/route_params_ui.cc:677
 #, fuzzy
 msgid "ardour: track/bus/inspector: no route selected"
 msgstr "ardour: параметры маршрутов: нет выбранных маршрутов"
 
-#. ctrl-shift-click applies change to all routes
-#: route_ui.cc:134
+#: gtk2_ardour/route_ui.cc:131
 msgid "mute change"
 msgstr ""
 
-#. ctrl-shift-click applies change to all routes
-#. ctrl-alt-click: exclusively solo this track, not a toggle */
-#: route_ui.cc:209 route_ui.cc:219
+#: gtk2_ardour/route_ui.cc:207 gtk2_ardour/route_ui.cc:218
 msgid "solo change"
 msgstr ""
 
-#: route_ui.cc:282
+#: gtk2_ardour/route_ui.cc:282
 msgid "rec-enable change"
 msgstr ""
 
-#: route_ui.cc:479
+#: gtk2_ardour/route_ui.cc:480
 #, fuzzy
 msgid "Solo-safe"
 msgstr "Соло"
 
-#: route_ui.cc:487 route_ui.cc:530
-#, fuzzy
-msgid "MIDI Bind"
-msgstr "MIDI"
-
-#: route_ui.cc:501
+#: gtk2_ardour/route_ui.cc:502
 msgid "Pre Fader"
 msgstr "Пред фейдер"
 
-#: route_ui.cc:508
+#: gtk2_ardour/route_ui.cc:509
 msgid "Post Fader"
 msgstr "Пост фейдер"
 
-#: route_ui.cc:515
+#: gtk2_ardour/route_ui.cc:516
 msgid "Control Outs"
 msgstr "Контрольные выходы"
 
-#: route_ui.cc:522
+#: gtk2_ardour/route_ui.cc:523
 msgid "Main Outs"
 msgstr "Главные выходы"
 
-#: route_ui.cc:559
+#: gtk2_ardour/route_ui.cc:560
 msgid "mix group solo  change"
 msgstr ""
 
-#: route_ui.cc:593
+#: gtk2_ardour/route_ui.cc:599
 msgid "mix group mute change"
 msgstr ""
 
-#: route_ui.cc:609
+#: gtk2_ardour/route_ui.cc:616
 msgid "mix group rec-enable change"
 msgstr ""
 
-#: route_ui.cc:626 visual_time_axis.cc:237
+#: gtk2_ardour/route_ui.cc:634 gtk2_ardour/visual_time_axis.cc:237
 msgid "ardour: color selection"
 msgstr "ardour: выбор цвета"
 
-#: route_ui.cc:702
+#: gtk2_ardour/route_ui.cc:710
 #, fuzzy
 msgid ""
 "Do you really want to remove track \"%1\" ?\n"
@@ -5949,7 +5675,7 @@ msgstr ""
 "Вы действительно хотите удалить трек \"%1\" ?\n"
 "(отмена невозможна)"
 
-#: route_ui.cc:704
+#: gtk2_ardour/route_ui.cc:712
 msgid ""
 "Do you really want to remove bus \"%1\" ?\n"
 "(cannot be undone)"
@@ -5957,212 +5683,212 @@ msgstr ""
 "Вы действительно хотите удалить шину \"%1\" ?\n"
 "(отмена невозможна)"
 
-#: route_ui.cc:708 visual_time_axis.cc:279
+#: gtk2_ardour/route_ui.cc:716 gtk2_ardour/visual_time_axis.cc:279
 msgid "Yes, remove it."
 msgstr "Да, удалить."
 
-#: route_ui.cc:737
+#: gtk2_ardour/route_ui.cc:744
 #, fuzzy
 msgid "New Name: "
 msgstr "новое имя: "
 
-#: sfdb_ui.cc:58
+#: gtk2_ardour/sfdb_ui.cc:61
 msgid "Add Field..."
 msgstr "Добавить поле..."
 
-#: sfdb_ui.cc:59
+#: gtk2_ardour/sfdb_ui.cc:62
 msgid "Remove Field"
 msgstr "Удалить поле"
 
-#: sfdb_ui.cc:62
+#: gtk2_ardour/sfdb_ui.cc:65
 msgid "Soundfile Info"
 msgstr "Информация о файле"
 
-#: sfdb_ui.cc:80
+#: gtk2_ardour/sfdb_ui.cc:83
 msgid "Field"
 msgstr "Критерий"
 
-#: sfdb_ui.cc:81
+#: gtk2_ardour/sfdb_ui.cc:84
 msgid "Value"
 msgstr "Значение"
 
-#: sfdb_ui.cc:161
+#: gtk2_ardour/sfdb_ui.cc:167
 #, fuzzy
 msgid "channels"
 msgstr "отмена"
 
-#: sfdb_ui.cc:161
+#: gtk2_ardour/sfdb_ui.cc:167
 #, fuzzy
 msgid "samplerate"
 msgstr "Разделить область"
 
-#: sfdb_ui.cc:162
+#: gtk2_ardour/sfdb_ui.cc:168
 #, fuzzy
 msgid "resolution"
 msgstr "Воспроизвести выделенное"
 
-#: sfdb_ui.cc:162
+#: gtk2_ardour/sfdb_ui.cc:168
 #, fuzzy
 msgid "format"
 msgstr "Норм."
 
-#: sfdb_ui.cc:183
+#: gtk2_ardour/sfdb_ui.cc:189
 #, fuzzy
 msgid "Could not read file: %1 (%2)."
 msgstr "Редактор: не удалось открыть файл \"%1\" (%2)"
 
-#: sfdb_ui.cc:199
+#: gtk2_ardour/sfdb_ui.cc:205
 msgid "Could not access soundfile: "
 msgstr "Файл недоступен: "
 
-#: sfdb_ui.cc:236
+#: gtk2_ardour/sfdb_ui.cc:244
 #, fuzzy
 msgid "Name for Field"
 msgstr "Имя области: "
 
-#: sfdb_ui.cc:335
+#: gtk2_ardour/sfdb_ui.cc:356
 msgid "Split Channels"
 msgstr ""
 
-#: sfdb_ui.cc:342
+#: gtk2_ardour/sfdb_ui.cc:363
 msgid "Create a region for each channel"
 msgstr ""
 
-#: sfdb_ui.cc:344
+#: gtk2_ardour/sfdb_ui.cc:365
 msgid "Embed"
 msgstr ""
 
-#: sfdb_ui.cc:346
+#: gtk2_ardour/sfdb_ui.cc:367
 #, fuzzy
 msgid "Link to an external file"
 msgstr "Вставить внешний аудиофайл"
 
-#: sfdb_ui.cc:348
+#: gtk2_ardour/sfdb_ui.cc:369
 msgid "Import"
 msgstr "Импорт"
 
-#: sfdb_ui.cc:350
+#: gtk2_ardour/sfdb_ui.cc:371
 msgid "Copy a file to the session folder"
 msgstr ""
 
-#: sfdb_ui.cc:414
+#: gtk2_ardour/sfdb_ui.cc:438
 #, fuzzy
 msgid "programming error: %1"
 msgstr "ошибка в программе: "
 
-#: tempo_dialog.cc:18 tempo_dialog.cc:35
+#: gtk2_ardour/tempo_dialog.cc:18 gtk2_ardour/tempo_dialog.cc:35
 msgid "Beats per minute"
 msgstr "Ударов в минуту"
 
-#: tempo_dialog.cc:21 tempo_dialog.cc:38 tempo_dialog.cc:203
-#: tempo_dialog.cc:221
+#: gtk2_ardour/tempo_dialog.cc:21 gtk2_ardour/tempo_dialog.cc:38
+#: gtk2_ardour/tempo_dialog.cc:203 gtk2_ardour/tempo_dialog.cc:221
 msgid "Bar"
 msgstr "Такт"
 
-#: tempo_dialog.cc:22 tempo_dialog.cc:39 tempo_dialog.cc:204
-#: tempo_dialog.cc:222
+#: gtk2_ardour/tempo_dialog.cc:22 gtk2_ardour/tempo_dialog.cc:39
+#: gtk2_ardour/tempo_dialog.cc:204 gtk2_ardour/tempo_dialog.cc:222
 msgid "Beat"
 msgstr "Доля"
 
-#: tempo_dialog.cc:24 tempo_dialog.cc:41 tempo_dialog.cc:205
-#: tempo_dialog.cc:223
+#: gtk2_ardour/tempo_dialog.cc:24 gtk2_ardour/tempo_dialog.cc:41
+#: gtk2_ardour/tempo_dialog.cc:205 gtk2_ardour/tempo_dialog.cc:223
 msgid "Location"
 msgstr "Расположение"
 
-#: tempo_dialog.cc:199 tempo_dialog.cc:217
+#: gtk2_ardour/tempo_dialog.cc:199 gtk2_ardour/tempo_dialog.cc:217
 msgid "Meter denominator"
 msgstr "Знаменатель размера"
 
-#: tempo_dialog.cc:200 tempo_dialog.cc:218
+#: gtk2_ardour/tempo_dialog.cc:200 gtk2_ardour/tempo_dialog.cc:218
 msgid "Beats per bar"
 msgstr "Долей на такт"
 
-#: tempo_dialog.cc:236 tempo_dialog.cc:247
+#: gtk2_ardour/tempo_dialog.cc:236 gtk2_ardour/tempo_dialog.cc:247
 msgid "whole (1)"
 msgstr "целых (1)"
 
-#: tempo_dialog.cc:237 tempo_dialog.cc:249
+#: gtk2_ardour/tempo_dialog.cc:237 gtk2_ardour/tempo_dialog.cc:249
 msgid "second (2)"
 msgstr "половины (2)"
 
-#: tempo_dialog.cc:238 tempo_dialog.cc:251
+#: gtk2_ardour/tempo_dialog.cc:238 gtk2_ardour/tempo_dialog.cc:251
 msgid "third (3)"
 msgstr "трети (3)"
 
-#: tempo_dialog.cc:239 tempo_dialog.cc:253 tempo_dialog.cc:261
+#: gtk2_ardour/tempo_dialog.cc:239 gtk2_ardour/tempo_dialog.cc:253
+#: gtk2_ardour/tempo_dialog.cc:261
 msgid "quarter (4)"
 msgstr "четверти (4)"
 
-#: tempo_dialog.cc:240 tempo_dialog.cc:255
+#: gtk2_ardour/tempo_dialog.cc:240 gtk2_ardour/tempo_dialog.cc:255
 msgid "eighth (8)"
 msgstr "восьмых (8)"
 
-#: tempo_dialog.cc:241 tempo_dialog.cc:257
+#: gtk2_ardour/tempo_dialog.cc:241 gtk2_ardour/tempo_dialog.cc:257
 msgid "sixteenth (16)"
 msgstr "шестьнадцатых (16)"
 
-#: tempo_dialog.cc:242 tempo_dialog.cc:259
+#: gtk2_ardour/tempo_dialog.cc:242 gtk2_ardour/tempo_dialog.cc:259
 msgid "thirty-second (32)"
 msgstr "тридцать-вторых (32)"
 
-#: tempo_dialog.cc:420
+#: gtk2_ardour/tempo_dialog.cc:420
 msgid "garbaged note type entry (%1)"
 msgstr "неясное определение ноты (%1)"
 
-#: tempo_dialog.cc:430
+#: gtk2_ardour/tempo_dialog.cc:430
 msgid "incomprehensible note type entry (%1)"
 msgstr "некорректное определение ноты (%1)"
 
-#: time_axis_view.cc:112
+#: gtk2_ardour/time_axis_view.cc:112
 msgid "gTortnam"
 msgstr ""
 
-#: time_axis_view.cc:549
+#: gtk2_ardour/time_axis_view.cc:550
 msgid "Largest"
 msgstr "Огромная"
 
-#: time_axis_view.cc:550
+#: gtk2_ardour/time_axis_view.cc:551
 msgid "Large"
 msgstr "Большая"
 
-#: time_axis_view.cc:551
+#: gtk2_ardour/time_axis_view.cc:552
 msgid "Larger"
 msgstr "Больше"
 
-#: time_axis_view.cc:553
+#: gtk2_ardour/time_axis_view.cc:554
 msgid "Smaller"
 msgstr "Меньше"
 
-#: time_axis_view.cc:554
+#: gtk2_ardour/time_axis_view.cc:555
 msgid "Small"
 msgstr "Маленькая"
 
-#: time_axis_view.cc:870
+#: gtk2_ardour/time_axis_view.cc:869
 msgid "unknown track height name \"%1\" in XML GUI information"
 msgstr "неизвестное имя ширины трека \"%1\" в XML описании"
 
-#. first constructed item sets up font info
-#: time_axis_view_item.cc:79
+#: gtk2_ardour/time_axis_view_item.cc:79
 msgid "TimeAxisViewItemName"
 msgstr ""
 
-#: time_axis_view_item.cc:298
+#: gtk2_ardour/time_axis_view_item.cc:302
 msgid "new duration %1 frames is out of bounds for %2"
 msgstr ""
 
-#: time_selection.cc:41
+#: gtk2_ardour/time_selection.cc:41
 msgid "programming error: request for non-existent audio range (%1)!"
 msgstr "ошибка в программе: request for non-existent audio range (%1)!"
 
-#: utils.cc:107 utils.cc:150
+#: gtk2_ardour/utils.cc:107 gtk2_ardour/utils.cc:150
 msgid "bad XPM header %1"
 msgstr "ошибка в XPM заголовке %1"
 
-#: utils.cc:332
+#: gtk2_ardour/utils.cc:332
 msgid "missing RGBA style for \"%1\""
 msgstr ""
 
-#: visual_time_axis.cc:276
+#: gtk2_ardour/visual_time_axis.cc:276
 msgid ""
 "Do you really want to remove track \"%1\" ?\n"
 "(cannot be undone)"
@@ -6170,564 +5896,97 @@ msgstr ""
 "Вы действительно хотите удалить трек \"%1\" ?\n"
 "(отмена невозможна)"
 
-#: visual_time_axis.cc:325
+#: gtk2_ardour/visual_time_axis.cc:325
 msgid "new name: "
 msgstr "новое имя: "
 
-#: visual_time_axis.cc:336
+#: gtk2_ardour/visual_time_axis.cc:336
 msgid "A track already exists with that name"
 msgstr "Трек с таким именем уже существует"
 
-#, fuzzy
-#~ msgid "set selected trackview"
-#~ msgstr "Вставить выбранное"
-
-#, fuzzy
-#~ msgid "set selected control point"
-#~ msgstr "использовать контрольные выходы"
-
-#, fuzzy
-#~ msgid "set selected regionview"
-#~ msgstr "Воспроизвести выделенную область"
-
-#~ msgid "Start a new session\n"
-#~ msgstr "Начать новую сессию\n"
-
-#~ msgid "via Session menu"
-#~ msgstr "в меню \"Сессия\""
-
-#, fuzzy
-#~ msgid "<b>Advanced</b>"
-#~ msgstr "Дополнительно..."
-
-#, fuzzy
-#~ msgid "Select a File"
-#~ msgstr "Выделить всё"
-
-#, fuzzy
-#~ msgid "Track/Bus connection options"
-#~ msgstr "Треки/Шины"
-
-#~ msgid "RECORD"
-#~ msgstr "ЗАПИСЬ"
-
-#~ msgid "INPUT"
-#~ msgstr "ВХОД"
-
-#~ msgid "OUTPUT"
-#~ msgstr "ВЫХОД"
-
-#, fuzzy
-#~ msgid "Gain automation mode"
-#~ msgstr "автомат"
-
-#, fuzzy
-#~ msgid "Gain automation type"
-#~ msgstr "автомат"
-
-#, fuzzy
-#~ msgid "gain automation mode"
-#~ msgstr "автомат"
-
-#, fuzzy
-#~ msgid "gain automation state"
-#~ msgstr "автомат"
-
-#, fuzzy
-#~ msgid "pan automation state"
-#~ msgstr "автомат"
-
-#~ msgid "REC"
-#~ msgstr "ЗАП"
-
-#~ msgid "OUT"
-#~ msgstr "ВЫХ"
-
-#~ msgid "aplay"
-#~ msgstr "авоспр"
-
-#, fuzzy
-#~ msgid "awrite"
-#~ msgstr "запись"
-
-#~ msgid "no group"
-#~ msgstr "нет группы"
-
-#, fuzzy
-#~ msgid "normal"
-#~ msgstr "Норм."
-
-#~ msgid "Disk r:%5.1f w:%5.1f MB/s"
-#~ msgstr "Диск r:%5.1f w:%5.1f MB/сек"
-
-#, fuzzy
-#~ msgid "ardour cleanup"
-#~ msgstr "ardour: очистка"
-
-#~ msgid "close session"
-#~ msgstr "закрыть сессию"
-
-#, fuzzy
-#~ msgid "SetRegionLayerMode"
-#~ msgstr "оконч. областей"
-
-#, fuzzy
-#~ msgid "SetCrossfadeModel"
-#~ msgstr "Кроссфейд"
-
-#~ msgid "Play from"
-#~ msgstr "Воспроизвести от"
-
-#, fuzzy
-#~ msgid "Set from range"
-#~ msgstr "выбрать окно просмотра"
-
-#~ msgid "FORMAT"
-#~ msgstr "ФОРМАТ"
-
-#, fuzzy
-#~ msgid "CD MARKER FILE TYPE"
-#~ msgstr "ТИП ФАЙЛА"
-
-#~ msgid "CHANNELS"
-#~ msgstr "КАНАЛЫ"
-
-#~ msgid "FILE TYPE"
-#~ msgstr "ТИП ФАЙЛА"
-
-#~ msgid "SAMPLE FORMAT"
-#~ msgstr "РАЗРЯДНОСТЬ"
-
-#~ msgid "SAMPLE ENDIANNESS"
-#~ msgstr "СВОЙСТВА"
-
-#~ msgid "SAMPLE RATE"
-#~ msgstr "ЧАСТОТА ДИСКРЕТИЗАЦИИ"
-
-#~ msgid "CONVERSION QUALITY"
-#~ msgstr "КАЧЕСТВО ПРЕОБРАЗОВАНИЯ"
-
-#~ msgid "DITHER TYPE"
-#~ msgstr "ТИП ПОДМЕШИВАЕМОГО ШУМА"
-
-#, fuzzy
-#~ msgid "EXPORT CD MARKER FILE ONLY"
-#~ msgstr "ТИП ФАЙЛА"
-
-#~ msgid "EXPORT TO FILE"
-#~ msgstr "ЭКСПОРТ В ФАЙЛ"
-
-#~ msgid "ardour: unplugged"
-#~ msgstr "ardour: нет соединения"
-
-#~ msgid "pol"
-#~ msgstr "пол"
-
-#~ msgid "To be added"
-#~ msgstr "Добавлено"
-
-#~ msgid "Update"
-#~ msgstr "Обновить"
-
-#, fuzzy
-#~ msgid "save"
-#~ msgstr "Сохранить"
-
-#~ msgid "bypass"
-#~ msgstr "обход"
-
-#~ msgid "Name for plugin settings:"
-#~ msgstr "Имя настроек модулей:"
-
-#~ msgid "rescan"
-#~ msgstr "обновить"
-
-#~ msgid "UI: cannot setup meter_bridge"
-#~ msgstr "Интерфейс: не удалось инициализировать индикаторы"
-
-#, fuzzy
-#~ msgid "Enable/Disable follow playhead"
-#~ msgstr "Разрешить/запретить цикл"
-
-#~ msgid "Audio Library"
-#~ msgstr "Аудио-библиотека"
-
-#~ msgid "Meter Bridge"
-#~ msgstr "Индикаторы"
-
-#~ msgid "Input Connections"
-#~ msgstr "Входные соединения"
-
-#~ msgid "Output Connections"
-#~ msgstr "Выходные соединения"
-
-#, fuzzy
-#~ msgid "New Input"
-#~ msgstr "новый вход"
-
-#, fuzzy
-#~ msgid "New Output"
-#~ msgstr "новый выход"
-
-#, fuzzy
-#~ msgid "Add Port"
-#~ msgstr "добавить порт"
-
-#~ msgid "Available Ports"
-#~ msgstr "Доступные порты"
-
-#~ msgid "ardour: connections"
-#~ msgstr "ardour: соединения"
-
-#~ msgid "in %d"
-#~ msgstr "в %d"
-
-#, fuzzy
-#~ msgid "crossfade editor"
-#~ msgstr "редактировать введение в уровень"
-
-#~ msgid "Regions/name"
-#~ msgstr "Области/имя"
-
-#~ msgid ""
-#~ "editor\n"
-#~ "mixer"
-#~ msgstr ""
-#~ "редактор\n"
-#~ "микшер"
-
-#, fuzzy
-#~ msgid "Invert"
-#~ msgstr "Новый \"возврат\""
-
-#~ msgid "Edit:"
-#~ msgstr "Редактировать:"
-
-#, fuzzy
-#~ msgid "Cancel cleanup"
-#~ msgstr "Очистка"
-
-#~ msgid "programming error: line canvas item has no line object pointer!"
-#~ msgstr "ошибка в программе: line canvas item has no line object pointer!"
-
-#~ msgid ""
-#~ "programming error: no \"rect\" pointer associated with selection item"
-#~ msgstr ""
-#~ "ошибка в программе: no \"rect\" pointer associated with selection item"
+#: gtk2_ardour/connection_editor.cc:51
+msgid "ardour: connections"
+msgstr "ardour: соединения"
 
-#~ msgid "Name for new edit group"
-#~ msgstr "Имя новой группы"
+#: gtk2_ardour/connection_editor.cc:52
+msgid "Input Connections"
+msgstr "Входные соединения"
 
-#, fuzzy
-#~ msgid "Import selected as tracks"
-#~ msgstr ""
-#~ "Импортировать\n"
-#~ "выбранное"
-
-#~ msgid "ardour: audio import in progress"
-#~ msgstr "ardour: ... идёт импорт аудио"
-
-#~ msgid "You can't embed an audiofile until you have a session loaded."
-#~ msgstr "Вы не можете импортировать аудиофайл пока сессия не загружена."
-
-#, fuzzy
-#~ msgid "Insert selected as new tracks"
-#~ msgstr "Вставить выбранное"
-
-#~ msgid "Insert selected"
-#~ msgstr "Вставить выбранное"
-
-#, fuzzy
-#~ msgid "hidden"
-#~ msgstr "Скрытый"
-
-#~ msgid "Sorting"
-#~ msgstr "Сортировка"
-
-#~ msgid "Regions/length"
-#~ msgstr "Области/длина"
-
-#~ msgid "Regions/start"
-#~ msgstr "Области/начало"
-
-#~ msgid "Regions/end"
-#~ msgstr "Области/конец"
-
-#~ msgid "Regions/file name"
-#~ msgstr "Области/имя файла"
-
-#~ msgid "Regions/file size"
-#~ msgstr "Области/размер файла"
-
-#~ msgid "Regions/file date"
-#~ msgstr "Области/дата файла"
-
-#~ msgid "Regions/file system"
-#~ msgstr "Области/файловая система"
-
-#~ msgid "Show All AbstractTracks"
-#~ msgstr "Показать все треки"
-
-#~ msgid "Hide All AbstractTracks"
-#~ msgstr "Скрыть все треки"
-
-#~ msgid "slereg"
-#~ msgstr "slereg"
-
-#~ msgid "KeyboardTarget: no translation found for \"%1\""
-#~ msgstr "KeyboardTarget: для \"%1\" сопоставление не найдено"
-
-#~ msgid "KeyboardTarget: unknown action \"%1\""
-#~ msgstr "KeyboardTarget: \"%1\" - неизвестное событие"
-
-#~ msgid "misformed binding node - ignored"
-#~ msgstr "неверное определение связи - пропущено"
-
-#~ msgid "ardour: soundfile selector"
-#~ msgstr "ardour: выбор файлов"
-
-#~ msgid "Add to Library..."
-#~ msgstr ""
-#~ "Добавить\n"
-#~ "в библиотеку..."
-
-#~ msgid "Remove..."
-#~ msgstr "Удалить..."
-
-#~ msgid "Find..."
-#~ msgstr "Найти..."
-
-#~ msgid "Add Folder"
-#~ msgstr ""
-#~ "Создать\n"
-#~ "папку"
-
-#~ msgid "Add audio file or directory"
-#~ msgstr "Добавить аудиофайл или каталог"
-
-#~ msgid "Importing"
-#~ msgstr "Импорт"
-
-#~ msgid "%1 not added to database"
-#~ msgstr "%1 не добавлен в базу"
-
-#~ msgid "Folder name:"
-#~ msgstr "Имя папки:"
-
-#~ msgid "Should not be reached"
-#~ msgstr "Станет недоступен"
-
-#~ msgid "file \"%1\" could not be opened"
-#~ msgstr "не удалось открыть файл \"%1\" !"
-
-#~ msgid "Field name:"
-#~ msgstr "Имя поля:"
-
-#~ msgid "Field value:"
-#~ msgstr "Значение поля:"
-
-#~ msgid "Find"
-#~ msgstr "Найти"
-
-#~ msgid "AND"
-#~ msgstr "И"
-
-#~ msgid "ardour: locate soundfiles"
-#~ msgstr "ardour: расположение звуковых файлов"
-
-#~ msgid "Results"
-#~ msgstr "Результаты"
-
-#~ msgid "Uris"
-#~ msgstr "Uris"
-
-#~ msgid "Create multi-channel region"
-#~ msgstr ""
-#~ "Создать\n"
-#~ "многоканальный"
-
-#~ msgid "Ardour: Search Results"
-#~ msgstr "Ardour: Поиск результатов"
-
-#~ msgid "***"
-#~ msgstr "***"
-
-#~ msgid "Hide All AudioTrack MixerStrips"
-#~ msgstr "Скрыть все каналы аудиотреков"
-
-#~ msgid "Show All AudioBus MixerStrips"
-#~ msgstr "Показать все каналы аудиошин"
-
-#~ msgid "Hide All AudioBus MixerStrips"
-#~ msgstr "Скрыть все каналы аудиошин"
-
-#~ msgid "Name for new mix group"
-#~ msgstr "Имя новой mix группы"
+#: gtk2_ardour/connection_editor.cc:53
+msgid "Output Connections"
+msgstr "Выходные соединения"
 
-#~ msgid "Create"
-#~ msgstr "Создать"
+#: gtk2_ardour/connection_editor.cc:54
+msgid "New Input"
+msgstr "Новый вход"
 
-#~ msgid "use control outs"
-#~ msgstr "использовать контрольные выходы"
+#: gtk2_ardour/connection_editor.cc:55
+msgid "New Output"
+msgstr "Новый выход"
 
-#, fuzzy
-#~ msgid "automatically connect track outputs to master outs"
-#~ msgstr "автоматическое подключение треков к мастер-выходам"
-
-#, fuzzy
-#~ msgid "automatically connect track outputs to physical ports"
-#~ msgstr "автоматическое подключение треков к выходам"
-
-#~ msgid "new session setup"
-#~ msgstr "настройки новой сессии"
-
-#~ msgid "This session will playback and record at %1 Hz"
-#~ msgstr ""
-#~ "Эта сессия будет записываться и воспроизводиться\n"
-#~ "с частотой дискретизации %1 Гц"
-
-#~ msgid ""
-#~ "This rate is set by JACK and cannot be changed.\n"
-#~ "If you want to use a different sample rate\n"
-#~ "please exit and restart JACK"
-#~ msgstr ""
-#~ "Этот параметр устанавливается сервером JACK и не может быть изменён.\n"
-#~ "Если вы хотите использовать другую частоту дискретизации,\n"
-#~ "вам необходимо закрыть Ardour и перезапустить JACK"
-
-#~ msgid "blank"
-#~ msgstr "пустой"
-
-#, fuzzy
-#~ msgid "Slave to MTC"
-#~ msgstr "Передача MTC"
-
-#~ msgid "Narrow mixer strips"
-#~ msgstr "Узкие каналы микшера"
-
-#~ msgid "Debug keyboard events"
-#~ msgstr "Отладка настроек клавиатуры"
-
-#~ msgid "Misc"
-#~ msgstr "Прочее"
+#: gtk2_ardour/connection_editor.cc:58 gtk2_ardour/connection_editor.cc:101
+msgid "Add Port"
+msgstr "Добавить порт"
 
-#~ msgid "Display"
-#~ msgstr "Экран"
+#: gtk2_ardour/connection_editor.cc:106
+msgid "Available Ports"
+msgstr "Доступные порты"
 
-#~ msgid "Broadcast WAVE/floating point"
-#~ msgstr "Broadcast WAVE/плавающая точка"
+#: gtk2_ardour/connection_editor.cc:501
+msgid "Connection \""
+msgstr "Соединение \""
 
-#~ msgid "WAVE/floating point"
-#~ msgstr "WAVE/плавающая точка"
-
-#~ msgid "Native Format"
-#~ msgstr "Внутренний формат"
-
-#~ msgid "--unknown--"
-#~ msgstr "--неизвестный--"
-
-#~ msgid "in"
-#~ msgstr "в"
-
-#~ msgid "ins"
-#~ msgstr "вст"
-
-#~ msgid "out"
-#~ msgstr "выход"
-
-#~ msgid "outs"
-#~ msgstr "выходы"
-
-#, fuzzy
-#~ msgid "Select all"
-#~ msgstr "Выделить всё"
-
-#, fuzzy
-#~ msgid "Inserts"
-#~ msgstr "Новый \"возврат\""
-
-#, fuzzy
-#~ msgid "Sends"
-#~ msgstr "Минуты:Секунды"
+#: gtk2_ardour/connection_editor.cc:503
+msgid "\""
+msgstr "\""
 
-#, fuzzy
-#~ msgid "Select all ..."
-#~ msgstr "Выделить всё"
-
-#~ msgid "Pre Redirects"
-#~ msgstr "Предобработка"
-
-#~ msgid "Post Redirects"
-#~ msgstr "Постобработка"
-
-#~ msgid "No toggle button pixmaps found to match toggle-button-[0-9]*.xpm$"
-#~ msgstr "Файлы изображений toggle-button-[0-9]*.xpm$ не найдены"
-
-#~ msgid ""
-#~ "No small push button pixmaps found to match small-round-button-[0-9]*.xpm$"
-#~ msgstr "Файлы изображений small-round-button-[0-9]*.xpm$ не найдены"
-
-#~ msgid "No pixmaps found to match hslider[0-9]*.xpm$"
-#~ msgstr "Файлы изображений hslider[0-9]*.xpm$ не найдены"
-
-#~ msgid "No pixmaps found to match vslider[0-9]*.xpm$"
-#~ msgstr "Файлы изображений vslider[0-9]*.xpm$ не найдены"
-
-#~ msgid "Trace MIDI Input"
-#~ msgstr "Трассировка входа MIDI"
-
-#~ msgid "Trace MIDI Output"
-#~ msgstr "Трассировка выхода MIDI"
-
-#~ msgid "MTC Port"
-#~ msgstr "MTC порт"
-
-#~ msgid "attempt to timestretch a non-audio track!"
-#~ msgstr "попытка применить timestretch-эффект к неаудиотреку"
-
-#~ msgid "cannot create timestretch thread - operation not carried out"
-#~ msgstr "cannot create timestretch thread - operation not carried out"
+#: gtk2_ardour/connection_editor.cc:532
+#, c-format
+msgid "in %d"
+msgstr "вх %d"
 
-#~ msgid "ardour: tempo editor"
-#~ msgstr "ardour: редактор ритма"
+#: gtk2_ardour/connection_editor.cc:534
+#, c-format
+msgid "out %d"
+msgstr "вых %d"
 
-#~ msgid "ardour_add_track_bus"
-#~ msgstr "ardour_add_track_bus"
+#: gtk2_ardour/connection_editor.cc:658
+msgid "Name for new connection:"
+msgstr "Имя нового соединения: "
 
-#~ msgid "ok"
-#~ msgstr "ок"
+#: gtk2_ardour/analysis_window.cc:46
+msgid "analysis window"
+msgstr "Окно анализа"
 
-#, fuzzy
-#~ msgid "apply"
-#~ msgstr "авоспр"
+#: gtk2_ardour/analysis_window.cc:48
+msgid "Signal source"
+msgstr "Источник сигнала"
 
-#, fuzzy
-#~ msgid "fade"
-#~ msgstr "Затухание"
+#: gtk2_ardour/analysis_window.cc:49
+msgid "Selected ranges"
+msgstr "Выбранные диапазоны"
 
-#, fuzzy
-#~ msgid "Edit left"
-#~ msgstr "Режим редактирования"
+#: gtk2_ardour/analysis_window.cc:50
+msgid "Selected regions"
+msgstr "Выделенные области"
 
-#, fuzzy
-#~ msgid "Edit right"
-#~ msgstr "Редактировать сочетание"
+#: gtk2_ardour/analysis_window.cc:52
+msgid "Display model"
+msgstr "Модель отображения"
 
-#, fuzzy
-#~ msgid "Edit fade"
-#~ msgstr "Режим редактирования"
+#: gtk2_ardour/analysis_window.cc:53
+msgid "Composite graphs for each track"
+msgstr "Составной график для каждой дорожки"
 
-#~ msgid "clear connections"
-#~ msgstr "очистить соед."
+#: gtk2_ardour/analysis_window.cc:54
+msgid "Composite graph of all tracks"
+msgstr "Составной график для всех дорожек"
 
-#, fuzzy
-#~ msgid "Crossfades in use"
-#~ msgstr "Кроссфейд"
+#: gtk2_ardour/analysis_window.cc:63
+msgid "Track"
+msgstr "Дорожка"
 
-#, fuzzy
-#~ msgid "outside this computer"
-#~ msgstr "Скрыть трек"
+#: gtk2_ardour/analysis_window.cc:131
+msgid "Analyze data"
+msgstr "Проанализировать данные"
 
-#, fuzzy
-#~ msgid "inside this computer"
-#~ msgstr "Скрыть трек"
diff --git a/gtk2_ardour/po/sv_SE.po b/gtk2_ardour/po/sv_SE.po
new file mode 100644 (file)
index 0000000..6dbef3b
--- /dev/null
@@ -0,0 +1,5865 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: ardour-gtk 1.0.2\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2006-06-12 22:09+0200\n"
+"PO-Revision-Date: 2006-06-26 23:57+GMT+1\n"
+"Last-Translator: Petter Sundlöf <petter.sundlof@findus.dhs.org>\n"
+"Language-Team: Svenska <sv@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: ../about.cc:119
+msgid "Paul Davis"
+msgstr ""
+
+#: ../about.cc:120
+msgid "Jesse Chappell"
+msgstr ""
+
+#: ../about.cc:121
+msgid "Taybin Rutkin"
+msgstr ""
+
+#: ../about.cc:122
+msgid "Marcus Andersson"
+msgstr ""
+
+#: ../about.cc:123
+msgid "Jeremy Hall"
+msgstr ""
+
+#: ../about.cc:124
+msgid "Steve Harris"
+msgstr ""
+
+#: ../about.cc:125
+msgid "Tim Mayberry"
+msgstr ""
+
+#: ../about.cc:126
+msgid "Mark Stewart"
+msgstr ""
+
+#: ../about.cc:127
+msgid "Sam Chessman"
+msgstr ""
+
+#: ../about.cc:128
+msgid "Jack O'Quin"
+msgstr ""
+
+#: ../about.cc:129
+msgid "Matt Krai"
+msgstr ""
+
+#: ../about.cc:130
+msgid "Ben Bell"
+msgstr ""
+
+#: ../about.cc:131
+msgid "Gerard van Dongen"
+msgstr ""
+
+#: ../about.cc:132
+msgid "Thomas Charbonnel"
+msgstr ""
+
+#: ../about.cc:133
+msgid "Nick Mainsbridge"
+msgstr ""
+
+#: ../about.cc:134
+msgid "Colin Law"
+msgstr ""
+
+#: ../about.cc:135
+msgid "Sampo Savolainen"
+msgstr ""
+
+#: ../about.cc:136
+msgid "Joshua Leach"
+msgstr ""
+
+#: ../about.cc:137
+msgid "Rob Holland"
+msgstr ""
+
+#: ../about.cc:138
+msgid "Per Sigmond"
+msgstr ""
+
+#: ../about.cc:139
+msgid "Doug Mclain"
+msgstr ""
+
+#: ../about.cc:140
+msgid "Petter Sundlöf"
+msgstr ""
+
+#: ../about.cc:145
+msgid ""
+"French:\n"
+"\tAlain Fréhel <alain.frehel@free.fr>\n"
+msgstr ""
+
+#: ../about.cc:146
+msgid ""
+"German:\n"
+"\tKarsten Petersen <kapet@kapet.de>\n"
+msgstr ""
+
+#: ../about.cc:147
+msgid ""
+"Italian:\n"
+"\tFilippo Pappalardo <filippo@email.it>\n"
+msgstr ""
+
+#: ../about.cc:148
+msgid ""
+"Portuguese:\n"
+"\tRui Nuno Capela <rncbc@rncbc.org>\n"
+msgstr ""
+
+#: ../about.cc:149
+msgid ""
+"Brazilian Portuguese:\n"
+"\tAlexander da Franca Fernandes <alexander@nautae.eti.br>\n"
+"\tChris Ross <chris@tebibyte.org>\n"
+msgstr ""
+
+#: ../about.cc:151
+msgid ""
+"Spanish:\n"
+"\t Alex Krohn <alexkrohn@fastmail.fm>\n"
+msgstr ""
+
+#: ../about.cc:152
+msgid ""
+"Russian:\n"
+"\t Igor Blinov <pitstop@nm.ru>\n"
+msgstr ""
+
+#: ../about.cc:180
+msgid "Copyright (C) 1999-2005 Paul Davis\n"
+msgstr ""
+
+#: ../about.cc:181
+msgid ""
+"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"
+msgstr ""
+
+#: ../about.cc:187
+msgid ""
+"%1\n"
+"(built with ardour/gtk %2.%3.%4 libardour: %5.%6.%7)"
+msgstr ""
+"%1\n"
+"(kompilerat med ardour/gtk %2.%3.%4 libardour: %5.%6.%7)"
+
+#: ../actions.cc:260
+msgid "programmer error: %1 %2"
+msgstr ""
+
+#: ../add_route_dialog.cc:61
+msgid "ardour: add track/bus"
+msgstr "ardour: lägg till spår/buss(ar)"
+
+#. path = "1"
+#: ../add_route_dialog.cc:62 ../editor_route_list.cc:72
+msgid "Tracks"
+msgstr "Spår"
+
+#. path = "0"
+#: ../add_route_dialog.cc:63 ../editor_route_list.cc:69
+msgid "Busses"
+msgstr "Bussar"
+
+#: ../add_route_dialog.cc:95 ../plugin_ui.cc:832
+msgid "Add"
+msgstr "Lägg till"
+
+#: ../add_route_dialog.cc:113
+msgid "Name (template)"
+msgstr "Namn (mall)"
+
+#: ../add_route_dialog.cc:119
+msgid "Channel Configuration"
+msgstr "Kanalkonfiguration"
+
+#: ../add_route_dialog.cc:176 ../editor.cc:133 ../editor.cc:3687
+#: ../time_axis_view.cc:551
+msgid "Normal"
+msgstr ""
+
+#: gtk2_ardour/add_route_dialog.cc:179
+msgid "Tape"
+msgstr "Band"
+
+#: ../add_route_dialog.cc:195
+msgid "Mono"
+msgstr ""
+
+#: ../add_route_dialog.cc:197
+msgid "Stereo"
+msgstr ""
+
+#: gtk2_ardour/add_route_dialog.cc:43
+msgid "3 Channels"
+msgstr "3 Kanaler"
+
+#: gtk2_ardour/add_route_dialog.cc:44
+msgid "4 Channels"
+msgstr "4 Kanaler"
+
+#: gtk2_ardour/add_route_dialog.cc:45
+msgid "6 Channels"
+msgstr "6 Kanaler"
+
+#: gtk2_ardour/add_route_dialog.cc:46
+msgid "8 Channels"
+msgstr "8 Kanaler"
+
+#: gtk2_ardour/add_route_dialog.cc:47
+msgid "Manual Setup"
+msgstr "Manuellt"
+
+#. preroll stuff
+#: ../ardour_ui.cc:105
+msgid ""
+"pre\n"
+"roll"
+msgstr ""
+"för-\n"
+"roll"
+
+#: ../ardour_ui.cc:106
+msgid ""
+"post\n"
+"roll"
+msgstr ""
+"efter-\n"
+"roll"
+
+#. transport
+#: ../ardour_ui.cc:114
+msgid ""
+"time\n"
+"master"
+msgstr ""
+"huvud-\n"
+"klocka"
+
+#: ../ardour_ui.cc:116
+msgid "% "
+msgstr ""
+
+#: ../ardour_ui.cc:118
+msgid ""
+"punch\n"
+"in"
+msgstr ""
+"punch-\n"
+"in"
+
+#: ../ardour_ui.cc:119
+msgid ""
+"punch\n"
+"out"
+msgstr ""
+"punch-\n"
+"ut"
+
+#: ../ardour_ui.cc:120
+msgid ""
+"auto\n"
+"return"
+msgstr ""
+"auto-\n"
+"återvänd"
+
+#: ../ardour_ui.cc:121
+msgid ""
+"auto\n"
+"play"
+msgstr ""
+"auto-\n"
+"spela"
+
+#: ../ardour_ui.cc:122
+msgid ""
+"auto\n"
+"input"
+msgstr ""
+"auto-\n"
+"inljud"
+
+#: ../ardour_ui.cc:123
+msgid "click"
+msgstr "klick"
+
+#: gtk2_ardour/ardour_ui.cc:125
+msgid "AUDITION"
+msgstr "AVLYSSNING"
+
+#: gtk2_ardour/ardour_ui.cc:126
+msgid "SOLO"
+msgstr ""
+
+#: ../ardour_ui.cc:374
+msgid "quit"
+msgstr "avsluta"
+
+#: ../ardour_ui.cc:383
+msgid ""
+"Ardour was unable to save your session.\n"
+"\n"
+"If you still wish to quit, please use the\n"
+"\n"
+"\"Just quit\" option."
+msgstr ""
+"Ardour kunde inte spara din session.\n"
+"\n"
+"Om du fortfarande vill avsluta, välj\n"
+"\n"
+"\"Avsluta bara\"-alternativet."
+
+#: ../ardour_ui.cc:402
+msgid "ardour: save session?"
+msgstr "ardour: spara sessionen?"
+
+#: ../ardour_ui.cc:409
+msgid "Don't %1"
+msgstr "Stäng inte"
+
+#: ../ardour_ui.cc:411
+msgid "Just %1"
+msgstr "Stäng utan att spara"
+
+#: ../ardour_ui.cc:413
+msgid "Save and %1"
+msgstr "Spara och stäng"
+
+#: ../ardour_ui.cc:425
+msgid "session"
+msgstr "Sessionen"
+
+#: ../ardour_ui.cc:427
+msgid "snapshot"
+msgstr "ögonblickskopia"
+
+#: ../ardour_ui.cc:429
+msgid ""
+"The %1\"%2\"\n"
+"has not been saved.\n"
+"\n"
+"Any changes made this time\n"
+"will be lost unless you save it.\n"
+"\n"
+"What do you want to do?"
+msgstr ""
+"%1\n"
+"\"%2\"\n"
+"har ej sparats.\n"
+"\n"
+"Ändringar du gjort kommer\n"
+"att förloras ifall du inte sparar.\n"
+"\n"
+"Vad vill du göra?"
+
+#: ../ardour_ui.cc:443
+msgid "Prompter"
+msgstr "Fråga"
+
+#: ../ardour_ui.cc:502
+#, c-format
+msgid "disconnected"
+msgstr "frånkopplad"
+
+#: ../ardour_ui.cc:509
+#, c-format
+msgid "SR: %.1f kHz / %4.1f msecs"
+msgstr "Samplingsfrekvens: %.1f kHz / %4.1f msek"
+
+#: ../ardour_ui.cc:513
+#, c-format
+msgid "SR: %u kHz / %4.1f msecs"
+msgstr "Samplingsfrekvens: %u kHz / %4.1f msek"
+
+#: ../ardour_ui.cc:526
+#, c-format
+msgid "DSP Load: %.1f%%"
+msgstr "DSP-belastning: %.1f%%"
+
+#: ../ardour_ui.cc:536
+#, c-format
+msgid "Buffers p:%<PRIu32>%% c:%<PRIu32>%%"
+msgstr "Buffertar u-s:%<PRIu32>%% i-s:%<PRIu32>%%"
+
+#: ../ardour_ui.cc:563
+msgid "space: 24hrs+"
+msgstr "Utrymme: 24h+"
+
+#: ../ardour_ui.cc:593
+#, c-format
+msgid "space: %02dh:%02dm:%02ds"
+msgstr "Utrymme: %02dh:%02dm:%02ds"
+
+#: ../ardour_ui.cc:632
+msgid "programming error: impossible control method"
+msgstr "programmeringsfel: omöjlig kontroll-metod"
+
+#: ../ardour_ui.cc:740 ../new_session_dialog.cc:294
+msgid "Recent Sessions"
+msgstr "Tidigare Sessioner"
+
+#. ardour sessions are folders
+#: ../ardour_ui.cc:833
+msgid "open session"
+msgstr "öppna session"
+
+#: ../ardour_ui.cc:839
+msgid "Ardour sessions"
+msgstr "Sessioner"
+
+#: ../ardour_ui.cc:872
+msgid "Patience is a virtue.\n"
+msgstr "Tålamod är en dygd.\n"
+
+#: ../ardour_ui.cc:881
+msgid "You cannot add a track without a session already loaded."
+msgstr "Du kan inte lägga till ett spår utan en session laddad."
+
+#: ../ardour_ui.cc:888
+msgid "could not create new audio track"
+msgstr "kunde inte skapa nytt ljudspår"
+
+#: ../ardour_ui.cc:892
+msgid "could not create new audio bus"
+msgstr "kunde inte skapa ny ljudbuss"
+
+#: ../ardour_ui.cc:911
+msgid ""
+"There are insufficient JACK ports available\n"
+"to create a new track or bus.\n"
+"You should save Ardour, exit and\n"
+"restart JACK with more ports."
+msgstr ""
+"Det finns inte tillräckligt med JACK-portar\n"
+"för att skapa ett nytt spår eller en y buss.\n"
+"Du bör spara, avsluta och\n"
+"starta om JACK med fler portar."
+
+#: ../ardour_ui.cc:1035
+msgid ""
+"Please create 1 or more track\n"
+"before trying to record.\n"
+"Check the Session menu."
+msgstr ""
+"Skapa 1 eller fler spår\n"
+"innan du försöker spela in.\n"
+"Se Session-menyn."
+
+#: ../ardour_ui.cc:1264
+msgid ""
+"JACK has either been shutdown or it\n"
+"disconnected Ardour because Ardour\n"
+"was not fast enough. You can save the\n"
+"session and/or try to reconnect to JACK ."
+msgstr ""
+"JACK har stängts av eller så har\n"
+"det kopplat bort Ardour eftersom\n"
+"Ardour inte var snabb nog. Du kan spara\n"
+"och/eller försöka återansluta till JACK ."
+
+#: ../ardour_ui.cc:1281
+msgid "Unable to create all required ports"
+msgstr "Kan ej skapa alla nödvändiga portar"
+
+#: ../ardour_ui.cc:1289
+msgid "Unable to start the session running"
+msgstr "Kan ej starta sessionen"
+
+#: ../ardour_ui.cc:1425
+msgid "No Stream"
+msgstr "Ingen ljudström"
+
+#: ../ardour_ui.cc:1452 ../ardour_ui.cc:1471
+msgid "none"
+msgstr "ingen"
+
+#: ../ardour_ui.cc:1461 ../ardour_ui.cc:1480
+msgid "off"
+msgstr "av"
+
+#: ../ardour_ui.cc:1504
+msgid "Name of New Snapshot"
+msgstr "Namn för ögonblickskopia"
+
+#: ../ardour_ui.cc:1650
+msgid "Name for mix template:"
+msgstr "Namn för mixmall: "
+
+#: ../ardour_ui.cc:1651
+msgid "-template"
+msgstr "-mall"
+
+#: ../ardour_ui.cc:1808
+msgid ""
+"You do not have write access to this session.\n"
+"This prevents the session from being loaded."
+msgstr ""
+"Du har ej skrivrättigheter till denna session.\n"
+"Detta hindrar sessionen från att laddas."
+
+#: ../ardour_ui.cc:1821 ../ardour_ui.cc:1876
+msgid "Session \"%1 (snapshot %2)\" did not load successfully"
+msgstr "Session \"%1 (ögonblickskopia %2)\" kunde inte laddas"
+
+#: ../ardour_ui.cc:1932
+msgid "No audio files were ready for cleanup"
+msgstr "Inga ljudfiler var redo för rensning"
+
+#: ../ardour_ui.cc:1936
+msgid ""
+"If this seems suprising, \n"
+"check for any existing snapshots.\n"
+"These may still include regions that\n"
+"require some unused files to continue to exist."
+msgstr ""
+"Om detta är överraskande, sök efter existerande\n"
+"ögonblickskopior. Dessa kan använda regioner som\n"
+"använder oanvända filer för att kunna fungera."
+
+#: ../ardour_ui.cc:1945
+msgid "ardour: cleanup"
+msgstr "ardour: rensning"
+
+#: ../ardour_ui.cc:1981 ../ardour_ui.cc:1987
+msgid "files were"
+msgstr "filer"
+
+#: ../ardour_ui.cc:1983 ../ardour_ui.cc:1989
+msgid "file was"
+msgstr "fil"
+
+#: ../ardour_ui.cc:2030
+msgid "Are you sure you want to cleanup?"
+msgstr "Är du säker på att du vill göra en rensning?"
+
+#: ../ardour_ui.cc:2035
+msgid ""
+"Cleanup is a destructive operation.\n"
+"ALL undo/redo information will be lost if you cleanup.\n"
+"After cleanup, unused audio files will be moved to a \"dead sounds\" "
+"location."
+msgstr ""
+"Rensning är en destruktiv funktion.\n"
+"ALL ångra-/gör om-information kommer att förloras om du rensar.\n"
+"Oanvända filer kommer att flyttas till en \"döda ljud\"-plats."
+
+#: ../ardour_ui.cc:2041
+msgid "Clean Up"
+msgstr "Rensning"
+
+#: ../ardour_ui.cc:2044
+msgid "CleanupDialog"
+msgstr "Rensningsdialog"
+
+#: ../ardour_ui.cc:2045
+msgid "ardour_cleanup"
+msgstr "ardour_rensning"
+
+#: ../ardour_ui.cc:2064
+msgid "cleaned files"
+msgstr "rensade filer"
+
+#: ../ardour_ui.cc:2065
+msgid ""
+"The following %1 %2 not in use and \n"
+"have been moved to:\n"
+"%3. \n"
+"\n"
+"Flushing the wastebasket will \n"
+"release an additional\n"
+"%4 %5bytes of disk space.\n"
+msgstr ""
+"Följande %1 %2 användes inte \n"
+"och har flyttats till:\n"
+"%3. \n"
+"\n"
+"Tömma papperskorgen kommer att \n"
+"frigöra ytterligarel\n"
+"%4 %5byte diskutrymme.\n"
+
+#: ../ardour_ui.cc:2090
+msgid "deleted file"
+msgstr "raderad fil"
+
+#: ../ardour_ui.cc:2091
+msgid ""
+"The following %1 %2 deleted from\n"
+"%3,\n"
+"releasing %4 %5bytes of disk space"
+msgstr ""
+"Följande %1 %2 raderades från\n"
+"%3,\n"
+"vilket frigjorde %4 %5byte diskutrymme"
+
+#: ../ardour_ui.cc:2214
+msgid "Recording was stopped because your system could not keep up."
+msgstr "Inspelningen avstannades eftersom ditt system inte kunde hänga med."
+
+#: ../ardour_ui.cc:2237
+msgid ""
+"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"
+msgstr ""
+"Hårddisksystemet på din dator\n"
+"kunde inte matcha Ardour.\n"
+"\n"
+"Närmare bestämt, det kunde inte skriva data till disk\n"
+"snabbt nog för att matcha inspelningen.\n"
+
+#: ../ardour_ui.cc:2256
+msgid ""
+"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"
+msgstr ""
+"Hårddisksystemet på din dator\n"
+"kunde inte matcha Ardour.\n"
+"\n"
+"Närmare bestämt, det kunde inte läsa data från disk\n"
+"snabbt nog för att matcha uppspelningen.\n"
+
+#: ../ardour_ui.cc:2282
+msgid ""
+"This session appears to have been in\n"
+"middle of recording when ardour or\n"
+"the computer was shutdown.\n"
+"\n"
+"Ardour can recover any captured audio for\n"
+"you, or it can ignore it. Please decide\n"
+"what you would like to do.\n"
+msgstr ""
+"Denna session tycks ha varit\n"
+"mitt i inspelning när ardour eller\n"
+"datorn stängdes av.\n"
+"\n"
+"Ardour kan återhämta inspelade ljud åt\n"
+"dig, eller ignorera dem. Välj\n"
+"vad du vill göra.\n"
+
+#: ../ardour_ui.cc:2292
+msgid "Recover from crash"
+msgstr "Återhämta från krasch"
+
+#: ../ardour_ui.cc:2293
+msgid "Ignore crash data"
+msgstr "Ignorera kraschdata"
+
+#: ../ardour_ui.cc:2311
+msgid "Could not disconnect from JACK"
+msgstr "Kunde inte koppla loss från JACK"
+
+#: ../ardour_ui.cc:2324
+msgid "Could not reconnect to JACK"
+msgstr "Kunde inte återansluta till JACK"
+
+#: ../ardour_ui2.cc:59
+msgid "UI: cannot setup editor"
+msgstr "Gränssnitt: kan ej konfigurera editorn"
+
+#: ../ardour_ui2.cc:64
+msgid "UI: cannot setup mixer"
+msgstr "Gränssnitt: kan inte konfigurera mixern"
+
+#: ../ardour_ui2.cc:90
+msgid "MMC + Local"
+msgstr "MMC + Lokal"
+
+#: ../ardour_ui2.cc:91
+msgid "MMC"
+msgstr ""
+
+#: ../ardour_ui2.cc:92
+msgid "Local"
+msgstr "Lokal"
+
+#: ../ardour_ui2.cc:109
+msgid "MMC ID"
+msgstr "MMC-ID"
+
+#: ../ardour_ui2.cc:290
+msgid "Play from playhead"
+msgstr "Spela från startmarkören"
+
+#: ../ardour_ui2.cc:291
+msgid "Stop playback"
+msgstr "Stanna uppspelning"
+
+#: ../ardour_ui2.cc:292
+msgid "Play range/selection"
+msgstr "Spela omfång/markering"
+
+#: ../ardour_ui2.cc:293
+msgid "Go to start of session"
+msgstr "Gå till början av sessionen"
+
+#: ../ardour_ui2.cc:294
+msgid "Go to end of session"
+msgstr "Gå till slutet av sessionen"
+
+#: ../ardour_ui2.cc:295
+msgid "Play loop range"
+msgstr "Spela loop-omfång"
+
+#: ../ardour_ui2.cc:296
+msgid "Return to last playback start when stopped"
+msgstr "Återvänd till senaste startmarkörpunkten vid stopp"
+
+#: ../ardour_ui2.cc:297
+msgid "Start playback after any locate"
+msgstr "Starta uppspelning vid markörsplacering"
+
+#: ../ardour_ui2.cc:298
+msgid "Be sensible about input monitoring"
+msgstr "Rimlig inljudsmedhörning"
+
+#: ../ardour_ui2.cc:299
+msgid "Start recording at auto-punch start"
+msgstr "Starta inspelning vid auto-punch-start"
+
+#: ../ardour_ui2.cc:300
+msgid "Stop recording at auto-punch end"
+msgstr "Stanna inspelning vid auto-punch-slut"
+
+#: ../ardour_ui2.cc:301
+msgid "Enable/Disable audio click"
+msgstr "Slå på/av audio-klick"
+
+#: ../ardour_ui2.cc:302
+msgid "Positional sync source"
+msgstr "Källa till positionell synk."
+
+#: ../ardour_ui2.cc:303
+msgid "Does Ardour control the time?"
+msgstr "Är Ardour huvudklocka?"
+
+#: ../ardour_ui2.cc:304
+msgid "Shuttle speed control"
+msgstr "Shuttle-hastighetskontrol"
+
+#: ../ardour_ui2.cc:305
+#, c-format
+msgid "Select semitones or %%-age for speed display"
+msgstr "Välj halvtoner eller %% för hastighetsvisning"
+
+#: ../ardour_ui2.cc:306
+msgid "Current transport speed"
+msgstr "Nuvarande uppspelningshastighet"
+
+#: ../ardour_ui2.cc:329
+msgid "Primary clock"
+msgstr "Primär klocka"
+
+#: ../ardour_ui2.cc:330
+msgid "secondary clock"
+msgstr "sekundär klocka"
+
+#. XXX: this should really be saved in instant.xml or something similar and restored from there
+#. Combo's are stupid - they steal space from the entry for the button
+#: ../ardour_ui2.cc:387 ../ardour_ui2.cc:832 ../ardour_ui2.cc:845
+#: ../ardour_ui2.cc:908 ../ardour_ui2.cc:910
+msgid "sprung"
+msgstr "fjäder"
+
+#: ../ardour_ui2.cc:388 ../ardour_ui2.cc:834 ../ardour_ui2.cc:856
+msgid "wheel"
+msgstr "hjul"
+
+#: ../ardour_ui2.cc:450
+msgid "ardour: clock"
+msgstr "ardour: klocka"
+
+#: ../ardour_ui2.cc:595
+msgid "Maximum speed"
+msgstr "Maxhastighet"
+
+#: ../ardour_ui2.cc:822
+msgid "st"
+msgstr "halvtoner"
+
+#: ../ardour_ui2.cc:866 ../ardour_ui2.cc:889 ../ardour_ui2.cc:906
+msgid "stopped"
+msgstr "stannad"
+
+#: ../ardour_ui_dialogs.cc:152 ../playlist_selector.cc:69
+msgid "close"
+msgstr "stäng"
+
+#: ../ardour_ui_dialogs.cc:359 ../ardour_ui_ed.cc:183
+msgid "Sound File Browser"
+msgstr "Ljudfilsbibliotek"
+
+#. menus + submenus that need action items
+#: ../ardour_ui_ed.cc:71
+msgid "Session"
+msgstr ""
+
+#: ../ardour_ui_ed.cc:72 ../ardour_ui_ed.cc:129 ../editor.cc:1835
+#: ../export_dialog.cc:349 ../export_dialog.cc:1058 ../export_dialog.cc:1062
+msgid "Export"
+msgstr "Exportera"
+
+#: ../ardour_ui_ed.cc:73
+msgid "Cleanup"
+msgstr "Upprensning"
+
+#: ../ardour_ui_ed.cc:74 ../option_editor.cc:125
+msgid "Sync"
+msgstr "Synk."
+
+#: ../ardour_ui_ed.cc:75 ../ardour_ui_ed.cc:76
+msgid "Options"
+msgstr "Inställningar"
+
+#: ../ardour_ui_ed.cc:77
+msgid "Help"
+msgstr "Hjälp"
+
+#: ../ardour_ui_ed.cc:78
+msgid "KeyMouse Actions"
+msgstr "Tangent-/musåtgärder"
+
+#: ../ardour_ui_ed.cc:79
+msgid "Audio File Format"
+msgstr "Ljudfilsformat"
+
+#: ../ardour_ui_ed.cc:80
+msgid "Header"
+msgstr ""
+
+#: ../ardour_ui_ed.cc:81
+msgid "Data"
+msgstr ""
+
+#: ../ardour_ui_ed.cc:82
+msgid "Control Surfaces"
+msgstr "Kontrollytor"
+
+#. the real actions
+#: ../ardour_ui_ed.cc:86 ../audio_time_axis.cc:1853
+#: ../new_session_dialog.cc:524
+msgid "New"
+msgstr "Ny"
+
+#: ../ardour_ui_ed.cc:88 ../new_session_dialog.cc:512
+msgid "Open"
+msgstr "Öppna"
+
+#: ../ardour_ui_ed.cc:89
+msgid "Recent"
+msgstr "Tidigare"
+
+#: ../ardour_ui_ed.cc:90 ../io_selector.cc:57 ../io_selector.cc:791
+msgid "Close"
+msgstr "Stäng"
+
+#: ../ardour_ui_ed.cc:93 ../route_params_ui.cc:513
+msgid "Add Track/Bus"
+msgstr "Lägg till Spår/Buss"
+
+#: ../ardour_ui_ed.cc:104
+msgid "Connect"
+msgstr "Anslut"
+
+#. </CMT Additions>
+#: ../ardour_ui_ed.cc:112
+msgid "Snapshot"
+msgstr "Ögonblickskopia"
+
+#: ../ardour_ui_ed.cc:115
+msgid "Save Template..."
+msgstr "Spara mall..."
+
+#: ../ardour_ui_ed.cc:118
+msgid "Export session to audiofile..."
+msgstr "Exportera sessionen till ljudfil"
+
+#: ../ardour_ui_ed.cc:121
+msgid "Export selection to audiofile..."
+msgstr "Exportera markeringen till ljudfil"
+
+#: ../ardour_ui_ed.cc:125
+msgid "Export range markers to audiofile..."
+msgstr "Exportera omfånget till ljudfil"
+
+#: ../ardour_ui_ed.cc:132
+msgid "Cleanup unused sources"
+msgstr "Rensa oanvända källor"
+
+#: ../ardour_ui_ed.cc:134
+msgid "Flush wastebasket"
+msgstr "Töm papperskorgen"
+
+#: ../ardour_ui_ed.cc:140 ../ardour_ui_options.cc:409
+#: ../ardour_ui_options.cc:418 ../ardour_ui_options.cc:490
+msgid "JACK"
+msgstr ""
+
+#: ../ardour_ui_ed.cc:141
+msgid "Latency"
+msgstr "Fördröjning"
+
+#: ../ardour_ui_ed.cc:143
+msgid "Reconnect"
+msgstr "Återanslut"
+
+#: ../ardour_ui_ed.cc:146 ../mixer_strip.cc:497 ../mixer_strip.cc:565
+msgid "Disconnect"
+msgstr "Koppla ifrån"
+
+#: ../ardour_ui_ed.cc:173
+msgid "Windows"
+msgstr "Fönster"
+
+#: ../ardour_ui_ed.cc:174
+msgid "start prefix"
+msgstr "start-prefix"
+
+#: ../ardour_ui_ed.cc:175
+msgid "Quit"
+msgstr "Avsluta"
+
+#. windows visibility actions
+#: ../ardour_ui_ed.cc:179
+msgid "Maximise Editor Space"
+msgstr "Fullskärmsläge"
+
+#: ../ardour_ui_ed.cc:181
+msgid "Show Editor"
+msgstr "Visa Redigerare"
+
+#: ../ardour_ui_ed.cc:182
+msgid "Show Mixer"
+msgstr "Visa Mixer"
+
+#: ../ardour_ui_ed.cc:184
+msgid "Options Editor"
+msgstr "Inställningar"
+
+#: ../ardour_ui_ed.cc:185
+msgid "Track/Bus Inspector"
+msgstr "Spår/Buss-inspektör"
+
+#: ../ardour_ui_ed.cc:187
+msgid "Connections"
+msgstr "Anslutningar"
+
+#: ../ardour_ui_ed.cc:189
+msgid "Locations"
+msgstr "Platser"
+
+#: ../ardour_ui_ed.cc:191
+msgid "Big Clock"
+msgstr "Stor klocka"
+
+#: ../ardour_ui_ed.cc:193
+msgid "About"
+msgstr "Om"
+
+#: ../ardour_ui_ed.cc:194
+msgid "Colors"
+msgstr "Färger"
+
+#: ../ardour_ui_ed.cc:196
+msgid "Add Audio Track"
+msgstr "Lägg till spår"
+
+#: ../ardour_ui_ed.cc:198
+msgid "Add Audio Bus"
+msgstr "Lägg till buss"
+
+#: ../ardour_ui_ed.cc:200
+msgid "Save"
+msgstr "Spara"
+
+#: ../ardour_ui_ed.cc:202 ../editor_actions.cc:254
+msgid "Remove Last Capture"
+msgstr "Ta bort senaste inspelningen"
+
+#. do-nothing action for the "transport" menu bar item
+#: ../ardour_ui_ed.cc:209
+msgid "Transport"
+msgstr "Uppspelning"
+
+#. these two are not used by key bindings, instead use ToggleRoll for that. these two do show up in
+#. menus and via button proxies.
+#.
+#: ../ardour_ui_ed.cc:215 ../sfdb_ui.cc:56
+msgid "Stop"
+msgstr "Stopp"
+
+#: ../ardour_ui_ed.cc:218
+msgid "Roll"
+msgstr ""
+
+#: ../ardour_ui_ed.cc:222
+msgid "Start/Stop"
+msgstr "Start/Stopp"
+
+#: ../ardour_ui_ed.cc:225
+msgid "Stop + Forget Capture"
+msgstr "Stanna + Glöm inspelning"
+
+#: ../ardour_ui_ed.cc:228
+msgid "Play Loop Range"
+msgstr "Spela loop-omfång"
+
+#: ../ardour_ui_ed.cc:231
+msgid "Play Selection"
+msgstr "Spela markering"
+
+#: ../ardour_ui_ed.cc:235
+msgid "Enable Record"
+msgstr "Tillåt inspelning"
+
+#: ../ardour_ui_ed.cc:238
+msgid "Rewind"
+msgstr "Bakåtspolning"
+
+#: ../ardour_ui_ed.cc:241
+msgid "Rewind (Slow)"
+msgstr "Bakåtspolning (långsam)"
+
+#: ../ardour_ui_ed.cc:244
+msgid "Rewind (Fast)"
+msgstr "Bakåtspolning (snabb)"
+
+#: ../ardour_ui_ed.cc:247
+msgid "Forward"
+msgstr "Framspolning"
+
+#: ../ardour_ui_ed.cc:250
+msgid "Forward (Slow)"
+msgstr "Framspolning (långsam)"
+
+#: ../ardour_ui_ed.cc:253
+msgid "Forward (Fast)"
+msgstr "Framspolning (snabb)"
+
+#: ../ardour_ui_ed.cc:256
+msgid "Goto Zero"
+msgstr "Gå till noll"
+
+#: ../ardour_ui_ed.cc:259
+msgid "Goto Start"
+msgstr "Gå till början"
+
+#: ../ardour_ui_ed.cc:262
+msgid "Goto End"
+msgstr "Gå till slutet"
+
+#. XXX the newline in the displayed names of these action is really wrong, but its because we want the button
+#. that proxies for these action to be more compact. It would be nice to find a way to override the action
+#. name appearance on the buttons.
+#.
+
+#: gtk2_ardour/ardour_ui.cc:119 gtk2_ardour/ardour_ui_ed.cc:267
+msgid "Punch In"
+msgstr "Punch-in"
+
+#: gtk2_ardour/ardour_ui.cc:120 gtk2_ardour/ardour_ui_ed.cc:270
+msgid "Punch Out"
+msgstr "Punch-ut"
+
+#: gtk2_ardour/ardour_ui.cc:121 gtk2_ardour/ardour_ui_ed.cc:282
+msgid "Auto Return"
+msgstr "Autoåtervänd"
+
+#: gtk2_ardour/ardour_ui.cc:122
+msgid "Auto Play"
+msgstr "Autospela"
+
+#: gtk2_ardour/ardour_ui.cc:123 gtk2_ardour/ardour_ui_ed.cc:276
+msgid "Auto Input"
+msgstr "Autoinljud"
+
+#: gtk2_ardour/ardour_ui.cc:124 gtk2_ardour/ardour_ui_ed.cc:273
+#: gtk2_ardour/option_editor.cc:128
+msgid "Click"
+msgstr "Klick"
+
+#: gtk2_ardour/ardour_ui_ed.cc:287
+msgid "Time master"
+msgstr "Huvudklocka"
+
+#: gtk2_ardour/ardour_ui_ed.cc:290
+msgid "Sync startup to video"
+msgstr "Synka start till video"
+
+#: ../ardour_ui_ed.cc:293
+msgid "Toggle Record Enable Track1"
+msgstr "Ändra inspelningsläge för Spår1"
+
+#: ../ardour_ui_ed.cc:295
+msgid "Toggle Record Enable Track2"
+msgstr "Ändra inspelningsläge för Spår2"
+
+#: ../ardour_ui_ed.cc:297
+msgid "Toggle Record Enable Track3"
+msgstr "Ändra inspelningsläge för Spår3"
+
+#: ../ardour_ui_ed.cc:299
+msgid "Toggle Record Enable Track4"
+msgstr "Ändra inspelningsläge för Spår4"
+
+#: ../ardour_ui_ed.cc:301
+msgid "Toggle Record Enable Track5"
+msgstr "Ändra inspelningsläge för Spår5"
+
+#: ../ardour_ui_ed.cc:303
+msgid "Toggle Record Enable Track6"
+msgstr "Ändra inspelningsläge för Spår6"
+
+#: ../ardour_ui_ed.cc:305
+msgid "Toggle Record Enable Track7"
+msgstr "Ändra inspelningsläge för Spår7"
+
+#: ../ardour_ui_ed.cc:307
+msgid "Toggle Record Enable Track8"
+msgstr "Ändra inspelningsläge för Spår8"
+
+#: ../ardour_ui_ed.cc:309
+msgid "Toggle Record Enable Track9"
+msgstr "Ändra inspelningsläge för Spår9"
+
+#: ../ardour_ui_ed.cc:311
+msgid "Toggle Record Enable Track10"
+msgstr "Ändra inspelningsläge för Spår10"
+
+#: ../ardour_ui_ed.cc:313
+msgid "Toggle Record Enable Track11"
+msgstr "Ändra inspelningsläge för Spår11"
+
+#: ../ardour_ui_ed.cc:315
+msgid "Toggle Record Enable Track12"
+msgstr "Ändra inspelningsläge för Spår12"
+
+#: ../ardour_ui_ed.cc:317
+msgid "Toggle Record Enable Track13"
+msgstr "Ändra inspelningsläge för Spår13"
+
+#: ../ardour_ui_ed.cc:319
+msgid "Toggle Record Enable Track14"
+msgstr "Ändra inspelningsläge för Spår14"
+
+#: ../ardour_ui_ed.cc:321
+msgid "Toggle Record Enable Track15"
+msgstr "Ändra inspelningsläge för Spår15"
+
+#: ../ardour_ui_ed.cc:323
+msgid "Toggle Record Enable Track16"
+msgstr "Ändra inspelningsläge för Spår16"
+
+#: ../ardour_ui_ed.cc:325
+msgid "Toggle Record Enable Track17"
+msgstr "Ändra inspelningsläge för Spår17"
+
+#: ../ardour_ui_ed.cc:327
+msgid "Toggle Record Enable Track18"
+msgstr "Ändra inspelningsläge för Spår18"
+
+#: ../ardour_ui_ed.cc:329
+msgid "Toggle Record Enable Track19"
+msgstr "Ändra inspelningsläge för Spår19"
+
+#: ../ardour_ui_ed.cc:331
+msgid "Toggle Record Enable Track20"
+msgstr "Ändra inspelningsläge för Spår20"
+
+#: ../ardour_ui_ed.cc:333
+msgid "Toggle Record Enable Track21"
+msgstr "Ändra inspelningsläge för Spår21"
+
+#: ../ardour_ui_ed.cc:335
+msgid "Toggle Record Enable Track22"
+msgstr "Ändra inspelningsläge för Spår22"
+
+#: ../ardour_ui_ed.cc:337
+msgid "Toggle Record Enable Track23"
+msgstr "Ändra inspelningsläge för Spår23"
+
+#: ../ardour_ui_ed.cc:339
+msgid "Toggle Record Enable Track24"
+msgstr "Ändra inspelningsläge för Spår24"
+
+#: ../ardour_ui_ed.cc:341
+msgid "Toggle Record Enable Track25"
+msgstr "Ändra inspelningsläge för Spår25"
+
+#: ../ardour_ui_ed.cc:343
+msgid "Toggle Record Enable Track26"
+msgstr "Ändra inspelningsläge för Spår26"
+
+#: ../ardour_ui_ed.cc:345
+msgid "Toggle Record Enable Track27"
+msgstr "Ändra inspelningsläge för Spår27"
+
+#: ../ardour_ui_ed.cc:347
+msgid "Toggle Record Enable Track28"
+msgstr "Ändra inspelningsläge för Spår28"
+
+#: ../ardour_ui_ed.cc:349
+msgid "Toggle Record Enable Track29"
+msgstr "Ändra inspelningsläge för Spår29"
+
+#: ../ardour_ui_ed.cc:351
+msgid "Toggle Record Enable Track30"
+msgstr "Ändra inspelningsläge för Spår30"
+
+#: ../ardour_ui_ed.cc:353
+msgid "Toggle Record Enable Track31"
+msgstr "Ändra inspelningsläge för Spår31"
+
+#: ../ardour_ui_ed.cc:355
+msgid "Toggle Record Enable Track32"
+msgstr "Ändra inspelningsläge för Spår32"
+
+#: ../ardour_ui_ed.cc:360
+msgid "Percentage"
+msgstr "Procent"
+
+#: ../ardour_ui_ed.cc:361
+msgid "Semitones"
+msgstr "Halvtoner"
+
+#: ../ardour_ui_ed.cc:365
+msgid "Send MTC"
+msgstr "Skicka MTC"
+
+#: ../ardour_ui_ed.cc:367
+msgid "Send MMC"
+msgstr "Skicka MMC"
+
+#: ../ardour_ui_ed.cc:369
+msgid "Use MMC"
+msgstr "Använd MMC"
+
+#: ../ardour_ui_ed.cc:371
+msgid "Send MIDI feedback"
+msgstr "Skicka MIDI-gensvar"
+
+#: ../ardour_ui_ed.cc:373
+msgid "Use MIDI control"
+msgstr "Använd MIDI-kontroll"
+
+#: gtk2_ardour/ardour_ui_ed.cc:437
+msgid "Auto-connect inputs to physical inputs"
+msgstr "Anslut automatiskt ingångar till fysiska ingångar"
+
+#: gtk2_ardour/ardour_ui_ed.cc:439
+msgid "Manually connect inputs"
+msgstr "Anslut ingångar manuellt"
+
+#: gtk2_ardour/ardour_ui_ed.cc:444
+msgid "Auto-connect outputs to physical outs"
+msgstr "Anslut automatiskt utgångar till fysiska utgångar"
+
+#: gtk2_ardour/ardour_ui_ed.cc:446
+msgid "Auto-connect outputs to master bus"
+msgstr "Ansluta automatiskt utgångar till master-bussen"
+
+#: gtk2_ardour/ardour_ui_ed.cc:448
+msgid "Manually connect outputs"
+msgstr "Anslut utgångar manuellt"
+
+#: ../ardour_ui_ed.cc:376
+msgid "Connect new track inputs to hardware"
+msgstr "Koppla nya ingångar till hårdvara"
+
+#: ../ardour_ui_ed.cc:394
+msgid "Connect new track outputs to hardware"
+msgstr "Koppla nya utgångar till hårdvara"
+
+#: ../ardour_ui_ed.cc:396
+msgid "Connect new track outputs to master"
+msgstr "Koppla nya utgångar till master"
+
+#: ../ardour_ui_ed.cc:398
+msgid "Manually connect new track outputs"
+msgstr "Manuell koppling av nya utgångar"
+
+#: ../ardour_ui_ed.cc:403
+msgid "Hardware monitoring"
+msgstr "Hårdvarumedhörning"
+
+#: ../ardour_ui_ed.cc:404
+msgid "Software monitoring"
+msgstr "Mjukvarumedhörning"
+
+#: ../ardour_ui_ed.cc:405
+msgid "External monitoring"
+msgstr "Extern medhörning"
+
+#. Configuration object options (i.e. not session specific)
+#: ../ardour_ui_ed.cc:409
+msgid "Stop plugins with transport"
+msgstr "Stoppa insticksprogram vid stopp"
+
+#: ../ardour_ui_ed.cc:410
+msgid "Verify remove last capture"
+msgstr "Bekräfta borttagning av senaste inspelade ljudet"
+
+#: ../ardour_ui_ed.cc:411
+msgid "Stop recording on xrun"
+msgstr "Stanna inspelning vid xrun-förekomst"
+
+#: ../ardour_ui_ed.cc:412
+msgid "Stop transport at session end"
+msgstr "Stanna uppspelning vid slutet av sessionen"
+
+#: ../ardour_ui_ed.cc:413
+msgid "-12dB gain reduce ffwd/rewind"
+msgstr "-12dB volymreduktion för snabbspolning"
+
+#: ../ardour_ui_ed.cc:414
+msgid "Rec-enable stays engaged at stop"
+msgstr "Inspelningsläge ändras ej vid stopp"
+
+#. session options
+#: ../ardour_ui_ed.cc:418
+msgid "Do not run plugins while recording"
+msgstr "Kör ej insticksprogram vid inspelning"
+
+#: ../ardour_ui_ed.cc:421
+msgid "Latched solo"
+msgstr "Låst solo"
+
+#: ../ardour_ui_ed.cc:426
+msgid "Solo in-place"
+msgstr "In place-solo "
+
+#: ../ardour_ui_ed.cc:428
+msgid "Solo via bus"
+msgstr "Solo via buss"
+
+#: ../ardour_ui_ed.cc:431
+msgid "Automatically create crossfades"
+msgstr "Skapa övertoningar automatiskt"
+
+#: ../ardour_ui_ed.cc:433
+msgid "Unmute new full crossfades"
+msgstr "Nya fulla övertoningar är påslagna"
+
+#: gtk2_ardour/ardour_ui_options.cc:490
+msgid "ST"
+msgstr "HT"
+
+#: ../ardour_ui_options.cc:407 ../ardour_ui_options.cc:417
+#: ../ardour_ui_options.cc:484
+msgid "Internal"
+msgstr "Intern"
+
+#: ../ardour_ui_options.cc:408 ../ardour_ui_options.cc:487
+msgid "MTC"
+msgstr ""
+
+#: ../audio_clock.cc:1720 ../editor.cc:187
+msgid "SMPTE"
+msgstr ""
+
+#: ../audio_clock.cc:1721 ../editor.cc:186 ../editor_rulers.cc:359
+msgid "Bars:Beats"
+msgstr "Takt:Slag"
+
+#: ../audio_clock.cc:1722
+msgid "Minutes:Seconds"
+msgstr "Minuter:Sekunder"
+
+#: ../audio_clock.cc:1723
+msgid "Audio Frames"
+msgstr ""
+
+#.
+#. Slowest = 6.6dB/sec falloff at update rate of 40ms
+#. Slow    = 6.8dB/sec falloff at update rate of 40ms
+#.
+#: ../audio_clock.cc:1724 ../editor_actions.cc:374 ../editor_actions.cc:382
+#: ../gain_meter.cc:171 ../panner_ui.cc:88 ../plugin_ui.cc:391
+#: ../plugin_ui.cc:634
+msgid "Off"
+msgstr "Av"
+
+#: ../audio_clock.cc:1726
+msgid "Mode"
+msgstr "Visningsläge"
+
+#: ../audio_time_axis.cc:90
+msgid "m"
+msgstr ""
+
+#: ../audio_time_axis.cc:90
+msgid "s"
+msgstr ""
+
+#: ../audio_time_axis.cc:90
+msgid "r"
+msgstr ""
+
+#: ../audio_time_axis.cc:94
+msgid "g"
+msgstr ""
+
+#. group
+#: ../audio_time_axis.cc:95
+msgid "p"
+msgstr ""
+
+#: ../audio_time_axis.cc:96 ../automation_time_axis.cc:31
+#: ../visual_time_axis.cc:73
+msgid "h"
+msgstr ""
+
+#. height
+#: ../audio_time_axis.cc:97
+msgid "a"
+msgstr ""
+
+#: ../audio_time_axis.cc:98 ../visual_time_axis.cc:72
+msgid "v"
+msgstr ""
+
+#: ../audio_time_axis.cc:167 ../mixer_strip.cc:85
+msgid "Record"
+msgstr "Spela in"
+
+#: ../audio_time_axis.cc:168 ../editor_actions.cc:36 ../mixer_strip.cc:85
+msgid "Solo"
+msgstr ""
+
+#: ../audio_time_axis.cc:169 ../editor.cc:1759 ../editor.cc:1858
+#: ../mixer_strip.cc:85 ../panner_ui.cc:426
+msgid "Mute"
+msgstr "Tysta"
+
+#: ../audio_time_axis.cc:170
+msgid "Edit Group"
+msgstr "Redigera Grupp"
+
+#: ../audio_time_axis.cc:171 ../visual_time_axis.cc:91
+msgid "Display Height"
+msgstr "Visningshöjd"
+
+#: ../audio_time_axis.cc:172
+msgid "Playlist"
+msgstr "Spellista"
+
+#: ../audio_time_axis.cc:173 ../audio_time_axis.cc:740
+msgid "Automation"
+msgstr "Automatisering"
+
+#: ../audio_time_axis.cc:174 ../visual_time_axis.cc:92
+msgid "Visual options"
+msgstr "Visuella inställningar"
+
+#: ../audio_time_axis.cc:175 ../visual_time_axis.cc:93
+msgid "Hide this track"
+msgstr "Dölj detta spår"
+
+#: ../audio_time_axis.cc:332 ../mixer_strip.cc:927
+msgid "No group"
+msgstr "Ingen grupp"
+
+#: ../audio_time_axis.cc:701 ../automation_time_axis.cc:449
+#: ../imageframe_time_axis.cc:254 ../marker_time_axis.cc:210
+msgid "Height"
+msgstr "Höjd"
+
+#: ../audio_time_axis.cc:702 ../color_manager.cc:40
+#: ../imageframe_time_axis.cc:255 ../marker_time_axis.cc:211
+msgid "Color"
+msgstr "Färg"
+
+#: ../audio_time_axis.cc:706
+msgid "Hide all crossfades"
+msgstr "Dölj alla övertoningar"
+
+#: ../audio_time_axis.cc:707
+msgid "Show all crossfades"
+msgstr "Visa alla övertoningar"
+
+#: ../audio_time_axis.cc:711 ../mixer_strip.cc:1011
+msgid "Remote Control ID"
+msgstr "Fjärrstyrnings-ID"
+
+#: ../audio_time_axis.cc:717
+msgid "Show all automation"
+msgstr "Visa all automatisering"
+
+#: ../audio_time_axis.cc:720
+msgid "Show existing automation"
+msgstr "Visa existerande automatisering"
+
+#: ../audio_time_axis.cc:723
+msgid "Hide all automation"
+msgstr "Göm all automatisering"
+
+#: ../audio_time_axis.cc:728
+msgid "Fader"
+msgstr "Volym"
+
+#: ../audio_time_axis.cc:733
+msgid "Pan"
+msgstr "Panorering"
+
+#: ../audio_time_axis.cc:738
+msgid "Plugins"
+msgstr "Insticksprogram"
+
+#: ../audio_time_axis.cc:746
+msgid "Show waveforms"
+msgstr "Visa vågformer"
+
+#: ../audio_time_axis.cc:754
+msgid "Traditional"
+msgstr "Traditionell"
+
+#: ../audio_time_axis.cc:757
+msgid "Rectified"
+msgstr "Korrigerad"
+
+#: ../audio_time_axis.cc:760
+msgid "Waveform"
+msgstr "Vågform"
+
+#: ../audio_time_axis.cc:770
+msgid "Align with existing material"
+msgstr "Efter existerande material"
+
+#: ../audio_time_axis.cc:775
+msgid "Align with capture time"
+msgstr "Efter inspelningstiden"
+
+#: ../audio_time_axis.cc:781
+msgid "Alignment"
+msgstr "Justera"
+
+#: ../audio_time_axis.cc:787 ../editor.cc:526 ../editor_actions.cc:59
+#: ../mixer_strip.cc:1000 ../mixer_ui.cc:110
+msgid "Active"
+msgstr "Aktiva"
+
+#: ../audio_time_axis.cc:792 ../editor.cc:1921 ../editor_actions.cc:319
+#: ../editor_markers.cc:507 ../imageframe_time_axis.cc:258
+#: ../location_ui.cc:56 ../marker_time_axis.cc:214 ../mixer_strip.cc:1014
+msgid "Remove"
+msgstr "Ta bort"
+
+#: ../audio_time_axis.cc:832
+msgid "Name for playlist"
+msgstr "Spellistans namn"
+
+#: ../audio_time_axis.cc:834 ../audio_time_axis.cc:1850
+#: ../editor_markers.cc:826 ../editor_mouse.cc:4672
+#: ../imageframe_time_axis.cc:247 ../marker_time_axis.cc:207
+#: ../meter_bridge_strip.cc:223 ../mixer_strip.cc:998 ../redirect_box.cc:750
+#: ../redirect_box.cc:1064 ../route_ui.cc:732 ../visual_time_axis.cc:325
+msgid "Rename"
+msgstr "Döp om"
+
+#: ../audio_time_axis.cc:867 ../audio_time_axis.cc:907
+msgid "Name for Playlist"
+msgstr "Spellistans namn"
+
+#: ../audio_time_axis.cc:1125 ../visual_time_axis.cc:382
+msgid "a track already exists with that name"
+msgstr "ett spår med det namnet existerar redan"
+
+#: ../audio_time_axis.cc:1166 ../editor.cc:217
+msgid "gain"
+msgstr "volym"
+
+#: ../audio_time_axis.cc:1206
+msgid "pan"
+msgstr "panorering"
+
+#: ../audio_time_axis.cc:1409 ../editor.cc:1482 ../selection.cc:633
+msgid "programming error: "
+msgstr "programmeringsfel: "
+
+#: ../audio_time_axis.cc:1847
+msgid "Current: %1"
+msgstr "Aktuell: %1"
+
+#: ../audio_time_axis.cc:1854
+msgid "New Copy"
+msgstr "Ny kopia"
+
+#: ../audio_time_axis.cc:1856
+msgid "Clear Current"
+msgstr "Rensa aktuell"
+
+#: ../audio_time_axis.cc:1858 ../editor.cc:2023 ../editor.cc:2099
+msgid "Select"
+msgstr "Välj"
+
+#: ../automation_line.cc:883
+msgid "automation event move"
+msgstr "automatiseringshändelse: förflyttning"
+
+#: ../automation_line.cc:885
+msgid "automation range drag"
+msgstr "automatiseringsomfång: dragning"
+
+#: ../automation_line.cc:1014 ../region_gain_line.cc:61
+msgid "remove control point"
+msgstr "ta bort kontrollpunkt"
+
+#: ../automation_time_axis.cc:32 ../editor_ops.cc:2886
+msgid "clear"
+msgstr "rensa"
+
+#: ../automation_time_axis.cc:74
+msgid "track height"
+msgstr "spårhöjd"
+
+#: ../automation_time_axis.cc:75
+msgid "automation state"
+msgstr "automatiseringstillstånd"
+
+#: ../automation_time_axis.cc:76
+msgid "clear track"
+msgstr "rensa spår"
+
+#: ../automation_time_axis.cc:77
+msgid "hide track"
+msgstr "dölj spår"
+
+#: ../automation_time_axis.cc:183 ../automation_time_axis.cc:212
+#: ../automation_time_axis.cc:460
+msgid "Manual"
+msgstr "Manuell"
+
+#: ../automation_time_axis.cc:185 ../automation_time_axis.cc:223
+#: ../automation_time_axis.cc:464 ../editor.cc:2000 ../editor.cc:2081
+#: ../gain_meter.cc:173 ../panner_ui.cc:90 ../plugin_ui.cc:394
+#: ../plugin_ui.cc:636 ../sfdb_ui.cc:55
+msgid "Play"
+msgstr "Spela"
+
+#: ../automation_time_axis.cc:187 ../automation_time_axis.cc:234
+#: ../automation_time_axis.cc:468 ../gain_meter.cc:175 ../panner_ui.cc:92
+#: ../plugin_ui.cc:397 ../plugin_ui.cc:638
+msgid "Write"
+msgstr "Skriv"
+
+#: ../automation_time_axis.cc:189 ../automation_time_axis.cc:245
+#: ../automation_time_axis.cc:472 ../gain_meter.cc:177 ../panner_ui.cc:94
+#: ../plugin_ui.cc:400 ../plugin_ui.cc:640
+msgid "Touch"
+msgstr "Beröring"
+
+#: ../automation_time_axis.cc:256 ../option_editor.cc:182
+#: ../option_editor.cc:188 ../plugin_ui.cc:403
+msgid "???"
+msgstr ""
+
+#: ../automation_time_axis.cc:270
+msgid "clear automation"
+msgstr "rensa automatisering"
+
+#: ../automation_time_axis.cc:451 ../editor_actions.cc:317
+msgid "Hide"
+msgstr "Göm"
+
+#: ../automation_time_axis.cc:453 ../crossfade_edit.cc:76
+#: ../redirect_box.cc:1056
+msgid "Clear"
+msgstr "Rensa"
+
+#: ../automation_time_axis.cc:476
+msgid "State"
+msgstr "Tillstånd"
+
+#: ../canvas-imageframe.c:104
+msgid "pixbuf"
+msgstr ""
+
+#: ../canvas-imageframe.c:105
+msgid "the pixbuf"
+msgstr ""
+
+#: ../canvas-imageframe.c:110
+msgid "x"
+msgstr ""
+
+#: ../canvas-imageframe.c:111 ../canvas-simpleline.c:111
+#: ../canvas-simplerect.c:107
+msgid "x coordinate of upper left corner of rect"
+msgstr ""
+
+#: ../canvas-imageframe.c:120
+msgid "y"
+msgstr ""
+
+#: ../canvas-imageframe.c:121 ../canvas-simpleline.c:121
+#: ../canvas-simplerect.c:117
+msgid "y coordinate of upper left corner of rect "
+msgstr ""
+
+#: ../canvas-imageframe.c:129
+msgid "width"
+msgstr "bredd"
+
+#: ../canvas-imageframe.c:130
+msgid "the width"
+msgstr "bredden"
+
+#: ../canvas-imageframe.c:139
+msgid "drawwidth"
+msgstr ""
+
+#: ../canvas-imageframe.c:140
+msgid "drawn width"
+msgstr "uppritningsbredd"
+
+#: ../canvas-imageframe.c:148
+msgid "height"
+msgstr "höjd"
+
+#: ../canvas-imageframe.c:149
+msgid "the height"
+msgstr "höjden"
+
+#: ../canvas-imageframe.c:157
+msgid "anchor"
+msgstr "ankare"
+
+#: ../canvas-imageframe.c:158
+msgid "the anchor"
+msgstr "ankaret"
+
+#: ../canvas-simpleline.c:110 ../canvas-simplerect.c:106
+msgid "x1"
+msgstr ""
+
+#: ../canvas-simpleline.c:120 ../canvas-simplerect.c:116
+msgid "y1"
+msgstr ""
+
+#: ../canvas-simpleline.c:131 ../canvas-simplerect.c:127
+msgid "x2"
+msgstr ""
+
+#: ../canvas-simpleline.c:132 ../canvas-simplerect.c:128
+msgid "x coordinate of lower right corner of rect"
+msgstr ""
+
+#: ../canvas-simpleline.c:141 ../canvas-simplerect.c:137
+msgid "y2"
+msgstr ""
+
+#: ../canvas-simpleline.c:142 ../canvas-simplerect.c:138
+msgid "y coordinate of lower right corner of rect "
+msgstr ""
+
+#: ../canvas-simpleline.c:150
+msgid "color rgba"
+msgstr ""
+
+#: ../canvas-simpleline.c:151
+msgid "color of line"
+msgstr ""
+
+#: ../canvas-simplerect.c:148
+msgid "outline pixels"
+msgstr ""
+
+#: ../canvas-simplerect.c:149
+msgid "width in pixels of outline"
+msgstr ""
+
+#: ../canvas-simplerect.c:159
+msgid "outline what"
+msgstr ""
+
+#: ../canvas-simplerect.c:160
+msgid "which boundaries to outline (mask)"
+msgstr ""
+
+#: ../canvas-simplerect.c:171
+msgid "fill"
+msgstr ""
+
+#: ../canvas-simplerect.c:172
+msgid "fill rectangle"
+msgstr ""
+
+#: ../canvas-simplerect.c:179
+msgid "draw"
+msgstr ""
+
+#: ../canvas-simplerect.c:180
+msgid "draw rectangle"
+msgstr ""
+
+#: ../canvas-simplerect.c:188
+msgid "outline color rgba"
+msgstr ""
+
+#: ../canvas-simplerect.c:189
+msgid "color of outline"
+msgstr ""
+
+#: ../canvas-simplerect.c:199
+msgid "fill color rgba"
+msgstr ""
+
+#: ../canvas-simplerect.c:200
+msgid "color of fill"
+msgstr ""
+
+#: ../color_manager.cc:39
+msgid "Object"
+msgstr "Objekt"
+
+#: ../color_manager.cc:77
+msgid "cannot open color definition file %1: %2"
+msgstr "kan ej öppna färgdefinitionsfil %1: %2"
+
+#: ../crossfade_edit.cc:73
+msgid "ardour: x-fade edit"
+msgstr "ardour: övertoningsredigerare"
+
+#: ../crossfade_edit.cc:77 ../panner_ui.cc:442
+msgid "Reset"
+msgstr "Nollställ"
+
+#: ../crossfade_edit.cc:78
+msgid "Fade"
+msgstr "Tona"
+
+#: ../crossfade_edit.cc:79
+msgid "Out (dry)"
+msgstr "Ut (torr)"
+
+#: ../crossfade_edit.cc:80
+msgid "Out"
+msgstr "Ut"
+
+#: ../crossfade_edit.cc:81
+msgid "In (dry)"
+msgstr "In (torr)"
+
+#: ../crossfade_edit.cc:82
+msgid "In"
+msgstr ""
+
+#: ../crossfade_edit.cc:84
+msgid "With Pre-roll"
+msgstr "Med För-rull"
+
+#: ../crossfade_edit.cc:85
+msgid "With Post-roll"
+msgstr "Med Efter-rull"
+
+#: ../crossfade_edit.cc:93
+msgid "Fade In"
+msgstr "Tona In"
+
+#: ../crossfade_edit.cc:94
+msgid "Fade Out"
+msgstr "Tona Ut"
+
+#: ../crossfade_edit.cc:170 ../editor.cc:1834 ../editor_actions.cc:315
+#: ../option_editor.cc:129
+msgid "Audition"
+msgstr "Avlyssna"
+
+
+#: gtk2_ardour/editor.cc:105 gtk2_ardour/editor.cc:3517
+msgid "Slide Edit"
+msgstr "Glidred."
+
+#: gtk2_ardour/editor.cc:106 gtk2_ardour/editor.cc:3515
+msgid "Splice Edit"
+msgstr "Fogred."
+
+#: gtk2_ardour/editor.cc:111 gtk2_ardour/editor.cc:3572
+#: gtk2_ardour/export_dialog.cc:78 gtk2_ardour/export_dialog.cc:92
+#: gtk2_ardour/export_dialog.cc:893 gtk2_ardour/export_dialog.cc:1225
+#: gtk2_ardour/route_ui.cc:438
+msgid "None"
+msgstr "Ingen"
+
+#: gtk2_ardour/editor.cc:112 gtk2_ardour/editor.cc:3560
+msgid "CD Frames"
+msgstr "CD-frames"
+
+#: gtk2_ardour/editor.cc:113 gtk2_ardour/editor.cc:3562
+msgid "SMPTE Frames"
+msgstr "SMPTE-frames"
+
+#: gtk2_ardour/editor.cc:114 gtk2_ardour/editor.cc:3564
+msgid "SMPTE Seconds"
+msgstr "SMPTE-sekunder"
+
+#: gtk2_ardour/editor.cc:115 gtk2_ardour/editor.cc:3566
+msgid "SMPTE Minutes"
+msgstr "SMPTE-minuter"
+
+#: gtk2_ardour/editor.cc:116 gtk2_ardour/editor.cc:3568
+msgid "Seconds"
+msgstr "Sekunder"
+
+#: gtk2_ardour/editor.cc:117 gtk2_ardour/editor.cc:3570
+msgid "Minutes"
+msgstr "Minuter"
+
+#: gtk2_ardour/editor.cc:109 gtk2_ardour/editor.cc:3464
+msgid "Beats/32"
+msgstr "Slag/32"
+
+#: gtk2_ardour/editor.cc:119 gtk2_ardour/editor.cc:3540
+msgid "Beats/16"
+msgstr "Slag/16"
+
+#: gtk2_ardour/editor.cc:120 gtk2_ardour/editor.cc:3538
+msgid "Beats/8"
+msgstr "Slag/8"
+
+#: gtk2_ardour/editor.cc:121 gtk2_ardour/editor.cc:3536
+msgid "Beats/4"
+msgstr "Slag/4"
+
+#: gtk2_ardour/editor.cc:122 gtk2_ardour/editor.cc:3534
+msgid "Beats/3"
+msgstr "Slag/3"
+
+#: gtk2_ardour/editor.cc:123 gtk2_ardour/editor.cc:3544
+msgid "Beats"
+msgstr "Slag"
+
+#: gtk2_ardour/editor.cc:124 gtk2_ardour/editor.cc:3546
+msgid "Bars"
+msgstr "Takter"
+
+#: gtk2_ardour/editor.cc:125 gtk2_ardour/editor.cc:3548
+msgid "Marks"
+msgstr "Markörer"
+
+#: gtk2_ardour/editor.cc:126 gtk2_ardour/editor.cc:3550
+msgid "Edit Cursor"
+msgstr "Redigeringsmarkör"
+
+#: gtk2_ardour/editor.cc:127 gtk2_ardour/editor.cc:3552
+msgid "Region starts"
+msgstr "Region börjar"
+
+#: gtk2_ardour/editor.cc:128 gtk2_ardour/editor.cc:3554
+msgid "Region ends"
+msgstr "Region slutar"
+
+#: gtk2_ardour/editor.cc:129 gtk2_ardour/editor.cc:3558
+msgid "Region syncs"
+msgstr "Region synkar"
+
+#: gtk2_ardour/editor.cc:130 gtk2_ardour/editor.cc:3556
+msgid "Region bounds"
+msgstr "Region gränsar"
+
+#: gtk2_ardour/editor.cc:126 gtk2_ardour/editor.cc:3511
+msgid "Normal Snap"
+msgstr "Vanligt fästläge "
+
+#: gtk2_ardour/editor.cc:127 gtk2_ardour/editor.cc:3513
+msgid "Magnetic Snap"
+msgstr "Magnetiskt fästläge"
+
+#: gtk2_ardour/editor.cc:132 gtk2_ardour/editor.cc:3530
+msgid "Focus Left"
+msgstr "Fokus: vänster"
+
+#: gtk2_ardour/editor.cc:133 gtk2_ardour/editor.cc:3532
+msgid "Focus Right"
+msgstr "Fokus: höger"
+
+#: gtk2_ardour/editor.cc:134 gtk2_ardour/editor.cc:3534
+msgid "Focus Center"
+msgstr "Fokus: mitten"
+
+#: gtk2_ardour/editor.cc:135
+msgid "Focus Play"
+msgstr "Fokus: spelhuvud"
+
+#: gtk2_ardour/editor.cc:136
+msgid "Focus Edit"
+msgstr "Fokus: redigeringsmarkör"
+
+#. time display buttons
+#: ../editor.cc:185
+msgid "Mins:Secs"
+msgstr "Min:Sek"
+
+#: ../editor.cc:188 ../editor_rulers.cc:353
+msgid "Frames"
+msgstr "Rutor"
+
+#: ../editor.cc:189 ../editor_rulers.cc:373
+msgid "Tempo"
+msgstr ""
+
+#: ../editor.cc:190 ../editor_rulers.cc:367
+msgid "Meter"
+msgstr "Taktart"
+
+#: ../editor.cc:191 ../editor_rulers.cc:379
+msgid "Location Markers"
+msgstr "Platsmarkörer"
+
+#: ../editor.cc:192 ../editor_rulers.cc:385
+msgid "Range Markers"
+msgstr "Omfångsmarkörer"
+
+#: ../editor.cc:193 ../editor_rulers.cc:391
+msgid "Loop/Punch Ranges"
+msgstr "Loop-/punch-markörer"
+
+#: ../editor.cc:215
+msgid "range"
+msgstr "omfång"
+
+#: ../editor.cc:216
+msgid "object"
+msgstr "objekt"
+
+#: ../editor.cc:218
+msgid "zoom"
+msgstr ""
+
+#: ../editor.cc:219
+msgid "timefx"
+msgstr "tidsfx"
+
+#: ../editor.cc:220
+msgid "listen"
+msgstr "lyssna"
+
+#: ../editor.cc:222
+msgid "mode"
+msgstr "läge"
+
+#: ../editor.cc:223
+msgid "automation"
+msgstr "automatisering"
+
+#: ../editor.cc:225
+msgid "Edit Mode"
+msgstr "Redigeringsläge"
+
+#: ../editor.cc:226 ../editor_actions.cc:283
+msgid "Snap To"
+msgstr "Fäst mot"
+
+#: ../editor.cc:227
+msgid "Snap Mode"
+msgstr "Fästläge"
+
+#: ../editor.cc:228
+msgid "Zoom Focus"
+msgstr "Zoomfokus"
+
+#. </CMT Additions>
+#. nudge
+#: ../editor.cc:236 ../editor.cc:1899 ../editor.cc:2065 ../editor.cc:2121
+msgid "Nudge"
+msgstr "Knuffa"
+
+#: ../editor.cc:469
+msgid "Zoom in"
+msgstr "Zooma in"
+
+#: ../editor.cc:470
+msgid "Zoom out"
+msgstr "Zooma ut"
+
+#: ../editor.cc:473
+msgid "Zoom to session"
+msgstr "Zooma in/ut till hela sessionen"
+
+#: ../editor.cc:488
+msgid "Zoom Span"
+msgstr "Zoom-räckvidd"
+
+#: ../editor.cc:501 ../editor.cc:527 ../editor_actions.cc:61 ../mixer_ui.cc:85
+#: ../mixer_ui.cc:111
+msgid "Visible"
+msgstr "Synliga"
+
+#: ../editor.cc:502 ../editor.cc:525
+msgid "Name"
+msgstr "Namn"
+
+#: ../editor.cc:601 ../editor.cc:668
+msgid "Regions"
+msgstr "Regioner"
+
+#: ../editor.cc:641 ../editor.cc:680
+msgid "Chunks"
+msgstr "Bitar"
+
+#: ../editor.cc:671
+msgid "Tracks/Busses"
+msgstr "Spår/Bussar"
+
+#: ../editor.cc:674
+msgid "Snapshots"
+msgstr "Ögonblickskopior"
+
+#: ../editor.cc:677
+msgid "Edit Groups"
+msgstr "Redigeringsgrupper"
+
+#: gtk2_ardour/editor.cc:680
+msgid "Nudge Region/Selection Forwards"
+msgstr "Knuffa region/markering framåt"
+
+#: gtk2_ardour/editor.cc:681
+msgid "Nudge Region/Selection Backwards"
+msgstr "Knuffa region/markering bakåt"
+
+#: ../editor.cc:734 ../editor_mixer.cc:299
+msgid "ardour: editor"
+msgstr "ardour: redigerare"
+
+#: ../editor.cc:735
+msgid "ardour_editor"
+msgstr ""
+
+#: ../editor.cc:1182
+msgid "ardour: editor: "
+msgstr "ardour: redigerare: "
+
+#. force name
+#: ../editor.cc:1267 ../editor.cc:1276 ../editor_markers.cc:869
+msgid "Loop"
+msgstr ""
+
+#. force name
+#: ../editor.cc:1281 ../editor.cc:1290 ../editor_markers.cc:895
+msgid "Punch"
+msgstr ""
+
+#: ../editor.cc:1438 ../editor_mouse.cc:1741
+msgid "programming error: fade in canvas item has no regionview data pointer!"
+msgstr ""
+
+#: ../editor.cc:1450 ../editor.cc:1467 ../redirect_box.cc:1072
+msgid "Deactivate"
+msgstr "Avaktivera"
+
+#. activation
+#: ../editor.cc:1452 ../editor.cc:1469 ../redirect_box.cc:1070
+msgid "Activate"
+msgstr "Aktivera"
+
+#: ../editor.cc:1457 ../editor.cc:1474
+msgid "Linear"
+msgstr "Linjär"
+
+#: ../editor.cc:1458 ../editor.cc:1475 ../editor_actions.cc:375
+msgid "Slowest"
+msgstr "Långsammast"
+
+#: ../editor.cc:1459 ../editor.cc:1476 ../editor_actions.cc:376
+msgid "Slow"
+msgstr "Långsam"
+
+#: ../editor.cc:1460 ../editor.cc:1477 ../editor_actions.cc:378
+msgid "Fast"
+msgstr "Snabb"
+
+#: ../editor.cc:1461 ../editor.cc:1478 ../editor_actions.cc:380
+msgid "Fastest"
+msgstr "Snabbast"
+
+#: ../editor.cc:1588 ../editor.cc:1596
+msgid "Freeze"
+msgstr "Frys"
+
+#: ../editor.cc:1592
+msgid "Unfreeze"
+msgstr "Ofrys"
+
+#: ../editor.cc:1761 ../editor.cc:1856
+msgid "Unmute"
+msgstr "Sluta tysta"
+
+#. non-operative menu items for menu bar
+#. show editors
+#: ../editor.cc:1765 ../editor.cc:2045 ../editor.cc:2747
+#: ../editor_actions.cc:26 ../editor_markers.cc:506 ../mixer_strip.cc:495
+#: ../mixer_strip.cc:563 ../redirect_box.cc:1078
+msgid "Edit"
+msgstr "Redigera"
+
+#: ../editor.cc:1770
+msgid "Convert to short"
+msgstr "Konvertera till kort"
+
+#: ../editor.cc:1772
+msgid "Convert to full"
+msgstr "Konvertera till full"
+
+#: ../editor.cc:1783
+msgid "Crossfade"
+msgstr "Övertoning"
+
+#: ../editor.cc:1826
+msgid "Popup region editor"
+msgstr "Visa regionsredigerare"
+
+#: ../editor.cc:1827
+msgid "Raise to top layer"
+msgstr "Höj till översta lagret"
+
+#: ../editor.cc:1828
+msgid "Lower to bottom layer"
+msgstr "Sänk till lägsta lagret"
+
+#: ../editor.cc:1830
+msgid "Define sync point"
+msgstr "Definiera synk.-punkt"
+
+#: ../editor.cc:1831
+msgid "Remove sync point"
+msgstr "Ta bort synk.-punkt"
+
+#: ../editor.cc:1836
+msgid "Bounce"
+msgstr "Skriv till disk"
+
+#: ../editor.cc:1839
+msgid "Analyze region"
+msgstr "Analysera regioner"
+
+#: ../editor.cc:1851
+msgid "Lock"
+msgstr "Lås"
+
+#: ../editor.cc:1852
+msgid "Unlock"
+msgstr "Lås upp"
+
+#: ../editor.cc:1862
+msgid "Original position"
+msgstr "Ursprunglig position"
+
+#: ../editor.cc:1868
+msgid "Toggle envelope visibility"
+msgstr "Ändra konvolutsvisning"
+
+#: ../editor.cc:1869
+msgid "Toggle envelope active"
+msgstr "Slå på/av konvolut"
+
+#: ../editor.cc:1873
+msgid "DeNormalize"
+msgstr "Avnormalisera"
+
+#: ../editor.cc:1875
+msgid "Normalize"
+msgstr "Normalisera"
+
+#: ../editor.cc:1878
+msgid "Reverse"
+msgstr "Motsatt riktning"
+
+#. range related stuff
+#: ../editor.cc:1884
+msgid "Add Range Markers"
+msgstr "Lägg till omfångsmarkörer"
+
+#: ../editor.cc:1885
+msgid "Set Range"
+msgstr "Definiera omfång"
+
+#: ../editor.cc:1894
+msgid "Nudge fwd"
+msgstr "Knuffa framåt"
+
+#: ../editor.cc:1895
+msgid "Nudge bwd"
+msgstr "Knuffa bakåt"
+
+#: ../editor.cc:1896
+msgid "Nudge fwd by capture offset"
+msgstr "Knuffa framåt utifrån inspelningskompensation"
+
+#: ../editor.cc:1897
+msgid "Nudge bwd by capture offset"
+msgstr "Knuffa bakåt utifrån inspelningskompensation"
+
+#: ../editor.cc:1906
+msgid "Start to edit cursor"
+msgstr "Början till redigeringsmarkören"
+
+#: ../editor.cc:1907
+msgid "Edit cursor to end"
+msgstr "Redigeringsmarkör till slutet"
+
+#: ../editor.cc:1909 ../gain_meter.cc:180 ../gain_meter.cc:808
+#: ../panner_ui.cc:97 ../panner_ui.cc:802
+msgid "Trim"
+msgstr "Beskära"
+
+#: ../editor.cc:1912
+msgid "Split"
+msgstr "Dela"
+
+#: ../editor.cc:1915
+msgid "Make mono regions"
+msgstr "Skapa monoregioner"
+
+#: ../editor.cc:1918
+msgid "Duplicate"
+msgstr "Duplicera"
+
+#: ../editor.cc:1919
+msgid "Fill Track"
+msgstr "Fyll spåret"
+
+#: ../editor.cc:1923
+msgid "Destroy"
+msgstr "Förstör"
+
+#: ../editor.cc:1953
+msgid "Play range"
+msgstr "Spela omfång"
+
+#: ../editor.cc:1954
+msgid "Loop range"
+msgstr "Loop-omfång"
+
+#: ../editor.cc:1958
+msgid "Analyze range"
+msgstr "Analysera omfång"
+
+#: ../editor.cc:1962
+msgid "Separate range to track"
+msgstr "Separera omfång till spår"
+
+#: ../editor.cc:1963
+msgid "Separate range to region list"
+msgstr "Separera omfång till regionlista"
+
+#: ../editor.cc:1966
+msgid "Select all in range"
+msgstr "Välj allt i omfång"
+
+#: ../editor.cc:1968 ../editor.cc:2013
+msgid "Set range to loop range"
+msgstr "Ställ in omfång till loop-omfånget"
+
+#: ../editor.cc:1969 ../editor.cc:2014
+msgid "Set range to punch range"
+msgstr "Ställ in omfång till punch-omfånget"
+
+#: ../editor.cc:1971
+msgid "Crop region to range"
+msgstr "Beskär region till omfång"
+
+#: ../editor.cc:1972
+msgid "Fill range with region"
+msgstr "Fyll omfång med region"
+
+#: ../editor.cc:1973
+msgid "Duplicate range"
+msgstr "Duplicera region"
+
+#: ../editor.cc:1974
+msgid "Create chunk from range"
+msgstr "Skapa bit från omfång"
+
+#: ../editor.cc:1976
+msgid "Bounce range"
+msgstr "Omfång till disk"
+
+#: ../editor.cc:1977
+msgid "Export range"
+msgstr "Exportera omfång"
+
+#: ../editor.cc:1979
+msgid "Range"
+msgstr "Omfång"
+
+#: ../editor.cc:1994 ../editor.cc:2079
+msgid "Play from edit cursor"
+msgstr "Spela från redigeringsmarkören"
+
+#: ../editor.cc:1995 ../editor.cc:2080
+msgid "Play from start"
+msgstr "Spela från början"
+
+#: ../editor.cc:1996
+msgid "Play region"
+msgstr "Spela region"
+
+#: ../editor.cc:1998
+msgid "Loop Region"
+msgstr "Loopa region"
+
+#: ../editor.cc:2008 ../editor.cc:2089
+msgid "Select All in track"
+msgstr "Välj allt i spåret"
+
+#: ../editor.cc:2009 ../editor.cc:2090 ../redirect_box.cc:1066
+msgid "Select All"
+msgstr "Välj allt"
+
+#: ../editor.cc:2010 ../editor.cc:2091
+msgid "Invert selection in track"
+msgstr "Invertera i spåret"
+
+#: ../editor.cc:2011 ../editor.cc:2092
+msgid "Invert selection"
+msgstr "Invertera"
+
+#: ../editor.cc:2016 ../editor.cc:2094
+msgid "Select all after edit cursor"
+msgstr "Välj allt efter redigeringsmarkören"
+
+#: ../editor.cc:2017 ../editor.cc:2095
+msgid "Select all before edit cursor"
+msgstr "Välj allt innan redigeringsmarkören"
+
+#: ../editor.cc:2018 ../editor.cc:2096
+msgid "Select all after playhead"
+msgstr "Välj allt efter startmarkören"
+
+#: ../editor.cc:2019 ../editor.cc:2097
+msgid "Select all before playhead"
+msgstr "Välj allt innan startmarkören"
+
+#: ../editor.cc:2020
+msgid "Select all between cursors"
+msgstr "Välj allt mellan markörerna"
+
+#. standard editing stuff
+#: ../editor.cc:2031 ../editor.cc:2107 ../editor.cc:3482
+#: ../editor_actions.cc:213 ../redirect_box.cc:1059
+msgid "Cut"
+msgstr "Klipp"
+
+#: ../editor.cc:2032 ../editor.cc:2108 ../editor.cc:3484
+#: ../editor_actions.cc:218 ../redirect_box.cc:1061
+msgid "Copy"
+msgstr "Kopiera"
+
+#: ../editor.cc:2033
+msgid "Paste at edit cursor"
+msgstr "Klistra in vid redigeringsmarkören"
+
+#: ../editor.cc:2034
+msgid "Paste at mouse"
+msgstr "Klistra in vid muspekaren"
+
+#: ../editor.cc:2038 ../editor.cc:3489
+msgid "Align"
+msgstr "Justera"
+
+#: ../editor.cc:2039 ../editor.cc:3491
+msgid "Align Relative"
+msgstr "Justera relativt"
+
+#: ../editor.cc:2043
+msgid "Insert chunk"
+msgstr "Infoga bit"
+
+#: ../editor.cc:2050
+msgid "Insert Selected Region"
+msgstr "Infoga vald region"
+
+#: ../editor.cc:2051
+msgid "Insert Existing Audio"
+msgstr "Infoga ljudfil"
+
+#: ../editor.cc:2060 ../editor.cc:2116
+msgid "Nudge entire track fwd"
+msgstr "Knuffa hela spåret framåt"
+
+#: ../editor.cc:2061 ../editor.cc:2117
+msgid "Nudge track after edit cursor fwd"
+msgstr "Knuffa spåret framåt efter redigeringsmarkören"
+
+#: ../editor.cc:2062 ../editor.cc:2118
+msgid "Nudge entire track bwd"
+msgstr "Knuffa hela spåret bakåt"
+
+#: ../editor.cc:2063 ../editor.cc:2119
+msgid "Nudge track after edit cursor bwd"
+msgstr "Knuffa spåret bakåt efter redigeringsmarkören"
+
+#: ../editor.cc:2109 ../editor.cc:3486 ../editor_actions.cc:220
+#: ../redirect_box.cc:1063
+msgid "Paste"
+msgstr "Klistra in"
+
+#: gtk2_ardour/editor.cc:2608
+msgid "Select/Move Objects"
+msgstr "Välj/flytta objekt"
+
+#: gtk2_ardour/editor.cc:2609
+msgid "Select/Move Ranges"
+msgstr "Välj/flytta omfång"
+
+#: gtk2_ardour/editor.cc:2610
+msgid "Draw Gain Automation"
+msgstr "Rita volymautomatisering"
+
+#: gtk2_ardour/editor.cc:2611
+msgid "Select Zoom Range"
+msgstr "Välj zoom-omfång"
+
+#: gtk2_ardour/editor.cc:2612
+msgid "Stretch/Shrink Regions"
+msgstr "Förläng/förkorta regioner"
+
+#: gtk2_ardour/editor.cc:2613
+msgid "Listen to Specific Regions"
+msgstr "Lyssna på specifika regioner"
+
+
+#: ../editor.cc:2745
+msgid "Start:"
+msgstr "Början:"
+
+#: ../editor.cc:2746
+msgid "End:"
+msgstr "Slut:"
+
+#: ../editor.cc:3361 ../editor.cc:3401
+msgid "set selected regions"
+msgstr "ställ in valda regioner"
+
+#: ../editor.cc:3457 ../editor_actions.cc:203
+msgid "Undo"
+msgstr "Ångra"
+
+#: ../editor.cc:3459
+msgid "Undo (%1)"
+msgstr "Ångra (%1)"
+
+#: ../editor.cc:3469 ../editor_actions.cc:205
+msgid "Redo"
+msgstr "Gör om"
+
+#: ../editor.cc:3471
+msgid "Redo (%1)"
+msgstr "Gör om (%1)"
+
+#: ../editor.cc:3505
+msgid "... as new track"
+msgstr "... som ny region"
+
+#: ../editor.cc:3506
+msgid "... as new region"
+msgstr "... som ny region"
+
+#: ../editor.cc:3508
+msgid "Import audio (copy)"
+msgstr "Importera ljudfil (kopiera)"
+
+#: ../editor.cc:3511
+msgid "Remove last capture"
+msgstr "Ta bort senaste inspelningen"
+
+#: ../editor.cc:3535
+msgid "Duplicate how many times?"
+msgstr "Duplicera hur många gånger?"
+
+#: ../editor.cc:4021
+msgid ""
+"Playlist %1 is currently unused.\n"
+"If left alone, no audio files used by it will be cleaned.\n"
+"If deleted, audio files used by it alone by will cleaned."
+msgstr ""
+"Spellista %1 används inte.\n"
+"Om den lämnas ifred kommer inga filer använda av den rensas.\n"
+"Om den tas bort kommer filer som används av den att rensas."
+
+#: ../editor.cc:4029
+msgid "Delete playlist"
+msgstr "Radera spellista"
+
+#: ../editor.cc:4030
+msgid "Keep playlist"
+msgstr "Behåll spellista"
+
+#: ../editor.cc:4031 ../editor_audio_import.cc:236 ../editor_ops.cc:2049
+#: ../editor_timefx.cc:70 ../export_dialog.cc:970 ../io_selector.cc:58
+#: ../io_selector.cc:792 ../redirect_box.cc:902 ../tempo_dialog.cc:19
+#: ../tempo_dialog.cc:36 ../tempo_dialog.cc:201 ../tempo_dialog.cc:219
+msgid "Cancel"
+msgstr "Avbryt"
+
+#: ../editor.cc:4198
+msgid "new playlists"
+msgstr "nya spellistor"
+
+#: ../editor.cc:4206
+msgid "copy playlists"
+msgstr "kopiera spellistor"
+
+#: ../editor.cc:4214
+msgid "clear playlists"
+msgstr "rensa spellistor"
+
+#: ../editor_actions.cc:27
+msgid "Select regions"
+msgstr "Välj regioner"
+
+#: ../editor_actions.cc:28
+msgid "Select range operations"
+msgstr "Välj omfångsåtgärder"
+
+#: ../editor_actions.cc:29
+msgid "Move edit cursor"
+msgstr "Flytta redigeringsmarkör"
+
+#: ../editor_actions.cc:30
+msgid "Region operations"
+msgstr "Regionsåtgärder"
+
+#: ../editor_actions.cc:31
+msgid "Tools"
+msgstr "Verktyg"
+
+#: ../editor_actions.cc:32
+msgid "View"
+msgstr "Visa"
+
+#: ../editor_actions.cc:33
+msgid "ZoomFocus"
+msgstr "Zoomfokus"
+
+#: ../editor_actions.cc:34
+msgid "Meter hold"
+msgstr "Nivåmätartopphållning"
+
+#: ../editor_actions.cc:35
+msgid "Meter falloff"
+msgstr "Nivåmätarnedfall"
+
+#: ../editor_actions.cc:37
+msgid "Crossfades"
+msgstr "Övertoningar"
+
+#: ../editor_actions.cc:38
+msgid "Monitoring"
+msgstr "Medhörning"
+
+#: ../editor_actions.cc:39
+msgid "Autoconnect"
+msgstr "Automatisk anslutning"
+
+#: ../editor_actions.cc:40
+msgid "Layering"
+msgstr "Lager"
+
+#: ../editor_actions.cc:41
+msgid "Metering"
+msgstr "Nivåmätning"
+
+#: ../editor_actions.cc:42
+msgid "Fall off rate"
+msgstr "Nedfallshastighet"
+
+#: ../editor_actions.cc:43
+msgid "Hold Time"
+msgstr "Hållningslängd"
+
+#: ../editor_actions.cc:44
+msgid "Add Existing Audio"
+msgstr "Lägg till ljudfil"
+
+#. add named actions for the editor
+#: ../editor_actions.cc:49
+msgid "Show Editor Mixer"
+msgstr "Visa redigeringsmixer"
+
+#: ../editor_actions.cc:54
+msgid "Span Entire Overlap"
+msgstr "Sträck över hela överlappnngen"
+
+#: ../editor_actions.cc:56 ../editor_actions.cc:383
+msgid "Short"
+msgstr "Kort"
+
+#: ../editor_actions.cc:63
+msgid "Created Automatically"
+msgstr "Skapas automatiskt"
+
+#: ../editor_actions.cc:66
+msgid "Playhead to Next Region Start"
+msgstr "Startmarkören till nästa regionstart"
+
+#: ../editor_actions.cc:68
+msgid "Playhead to Next Region End"
+msgstr "Startmarkören till nästa regionslut"
+
+#: ../editor_actions.cc:70
+msgid "Playhead to Next Region Sync"
+msgstr "Startmarkören till nästa"
+
+#: ../editor_actions.cc:73
+msgid "Playhead to Previous Region Start"
+msgstr "Startmarkören till förra regionstarten"
+
+#: ../editor_actions.cc:75
+msgid "Playhead to Previous Region End"
+msgstr "Startmarkören till förra regionslutet"
+
+#: ../editor_actions.cc:77
+msgid "Playhead to Previous Region Sync"
+msgstr "Startmarkören till förra regionsynk.-punkten"
+
+#: ../editor_actions.cc:80
+msgid "Edit Cursor to Next Region Start"
+msgstr "Redigeringsmarkören till nästa regionstart"
+
+#: ../editor_actions.cc:82
+msgid "Edit Cursor to Next Region End"
+msgstr "Redigeringsmarkören till nästa regionslut"
+
+#: ../editor_actions.cc:84
+msgid "Edit Cursor to Next Region Sync"
+msgstr "Redigeringsmarkören till nästa regionssynk.-punkt"
+
+#: ../editor_actions.cc:87
+msgid "Edit Cursor to Previous Region Start"
+msgstr "Redigeringsmarkören till förra regionstart"
+
+#: ../editor_actions.cc:89
+msgid "Edit Cursor to Previous Region End"
+msgstr "Redigeringsmarkören till förra regionslutet"
+
+#: ../editor_actions.cc:91
+msgid "Edit Cursor to Previous Region Sync"
+msgstr "Redigeringsmarkören till förra regionssynk.-punkten"
+
+#: ../editor_actions.cc:94
+msgid "Playhead to Range Start"
+msgstr "Startmarkören till regionstarten"
+
+#: ../editor_actions.cc:96
+msgid "Playhead to Range End"
+msgstr "Startmarkören till regionslutet"
+
+#: ../editor_actions.cc:99
+msgid "Edit Cursor to Range Start"
+msgstr "Redigeringsmarkören till regionstarten"
+
+#: ../editor_actions.cc:101
+msgid "Edit Cursor to Range End"
+msgstr "Redigeringsmarkören till regionslutet"
+
+#: ../editor_actions.cc:104 ../editor_ops.cc:1364
+msgid "select all"
+msgstr "välj allt"
+
+#: ../editor_actions.cc:106
+msgid "Select All After Edit Cursor"
+msgstr "Välj allt efter redigeringsmarkören"
+
+#: ../editor_actions.cc:108
+msgid "Select All Before Edit Cursor"
+msgstr "Välj allt innan redigeringsmarkören"
+
+#: ../editor_actions.cc:111
+msgid "Select All After Playhead"
+msgstr "Välj allt efter startmarkören"
+
+#: ../editor_actions.cc:113
+msgid "Select All Before Playhead"
+msgstr "Välj allt innan startmarkören"
+
+#: ../editor_actions.cc:115
+msgid "Select All Between Cursors"
+msgstr "Välj allt mellan markörerna"
+
+#: ../editor_actions.cc:118
+msgid "Select All in Punch Range"
+msgstr "Välj allt i punch-omfånget"
+
+#: ../editor_actions.cc:120
+msgid "Select All in Loop Range"
+msgstr "Välj allt i loop-omfånget"
+
+#: ../editor_actions.cc:123
+msgid "Jump Forward to Mark"
+msgstr "Hoppa framåt till markör"
+
+#: ../editor_actions.cc:125
+msgid "Jump Backward to Mark"
+msgstr "Hoppa framåt till markör"
+
+#: ../editor_actions.cc:127
+msgid "Add Location from Playhead"
+msgstr "Lägg till Plats från startmarkören"
+
+#: ../editor_actions.cc:130
+msgid "Nudge Forward"
+msgstr "Knuffa framåt"
+
+#: ../editor_actions.cc:132
+msgid "Nudge Next Forward"
+msgstr "Knuffa nästa framåt"
+
+#: ../editor_actions.cc:134
+msgid "Nudge Backward"
+msgstr "Knuffa bakåt"
+
+#: ../editor_actions.cc:136
+msgid "Nudge Next Backward"
+msgstr "Knuffa nästa bakåt"
+
+#: ../editor_actions.cc:139
+msgid "Zoom Out"
+msgstr "Zooma ut"
+
+#: ../editor_actions.cc:141
+msgid "Zoom In"
+msgstr "Zooma in"
+
+#: ../editor_actions.cc:143
+msgid "Zoom to Session"
+msgstr "Zooma in/ut till hela sessionen"
+
+#: ../editor_actions.cc:146
+msgid "Scroll Tracks Up"
+msgstr "Skrolla spår uppåt"
+
+#: ../editor_actions.cc:148
+msgid "Scroll Tracks Down"
+msgstr "Skrolla spår ner"
+
+#: ../editor_actions.cc:150
+msgid "Step Tracks Up"
+msgstr "Stega spår uppåt"
+
+#: ../editor_actions.cc:152
+msgid "Step Tracks Down"
+msgstr "Stega spår neråt"
+
+#: ../editor_actions.cc:155
+msgid "Scroll Backward"
+msgstr "Skrolla bakåt"
+
+#: ../editor_actions.cc:157
+msgid "Scroll Forward"
+msgstr "Skrolla framåt"
+
+#: ../editor_actions.cc:159
+msgid "goto"
+msgstr "gå till"
+
+#: ../editor_actions.cc:161
+msgid "Center Playhead"
+msgstr "Centrera startmarkören"
+
+#: ../editor_actions.cc:163
+msgid "Center Edit Cursor"
+msgstr "Centrera redigeringsmarkören"
+
+#: ../editor_actions.cc:165
+msgid "Playhead Forward"
+msgstr "Startmarkören framåt"
+
+#: ../editor_actions.cc:167
+msgid "Playhead Backward"
+msgstr "Startmarkören bakåt"
+
+#: ../editor_actions.cc:169
+msgid "Playhead to Edit"
+msgstr "Startmarkören till redigeringsmarkören"
+
+#: ../editor_actions.cc:171
+msgid "Edit to Playhead"
+msgstr "Redigeringsmarkören till Startmarkören"
+
+#: ../editor_actions.cc:174
+msgid "Align Regions Start"
+msgstr "Justera regioners start"
+
+#: ../editor_actions.cc:176
+msgid "Align Regions Start Relative"
+msgstr "Justera regioners start relativt"
+
+#: ../editor_actions.cc:178
+msgid "Align Regions End"
+msgstr "Justera regions slut"
+
+#: ../editor_actions.cc:180
+msgid "Align Regions End Relative"
+msgstr "Justera regions slut relativt"
+
+#: ../editor_actions.cc:183
+msgid "Align Regions Sync"
+msgstr "Justera regions synk."
+
+#: ../editor_actions.cc:185
+msgid "Align Regions Sync Relative"
+msgstr "Justera regions synk. relativt"
+
+#: ../editor_actions.cc:188
+msgid "Audition at Mouse"
+msgstr "Avlyssning vid muspekaren"
+
+#: ../editor_actions.cc:190
+msgid "Brush at Mouse"
+msgstr "Måla vid mus"
+
+#: ../editor_actions.cc:192
+msgid "Set Edit Cursor"
+msgstr "Placera redigeringsmarkör"
+
+#: ../editor_actions.cc:194
+msgid "Mute/Unmute Region"
+msgstr "Tysta/stäng av tysta region"
+
+#: ../editor_actions.cc:196
+msgid "Set Playhead"
+msgstr "Placera startmarkör"
+
+#: ../editor_actions.cc:198
+msgid "Split Region"
+msgstr "Dela region"
+
+#: ../editor_actions.cc:200
+msgid "Set Region Sync Position"
+msgstr "Definiera regionssynk.-position"
+
+#: ../editor_actions.cc:208
+msgid "Export Session"
+msgstr "Exportera session"
+
+#: ../editor_actions.cc:210
+msgid "Export Range"
+msgstr "Expoerta omfång"
+
+#. Note: for now, editor-delete does the exact same thing as editor-cut
+#: ../editor_actions.cc:216
+msgid "Delete"
+msgstr "Radera"
+
+#: ../editor_actions.cc:222
+msgid "Duplicate Region"
+msgstr "Duplicera region"
+
+#: ../editor_actions.cc:224
+msgid "Duplicate Range"
+msgstr "Duplicera omfång"
+
+#: ../editor_actions.cc:226
+msgid "Insert Region"
+msgstr "Infoga region"
+
+#: ../editor_actions.cc:228
+msgid "Reverse Region"
+msgstr "Motsatt riktning"
+
+#: ../editor_actions.cc:230
+msgid "Normalize Region"
+msgstr "Normalisera region"
+
+#: ../editor_actions.cc:232
+msgid "crop"
+msgstr "beskär"
+
+#: ../editor_actions.cc:234
+msgid "Insert Chunk"
+msgstr "Infoga bit"
+
+#: ../editor_actions.cc:237
+msgid "Split at edit cursor"
+msgstr "Dela vid redigeringsmarkör"
+
+#: ../editor_actions.cc:240
+msgid "Start Range"
+msgstr "Startomfång"
+
+#: ../editor_actions.cc:242
+msgid "Finish Range"
+msgstr "Slutomfång"
+
+#: ../editor_actions.cc:244
+msgid "Finish add Range"
+msgstr "Lägg till slutomfång"
+
+#: ../editor_actions.cc:247
+msgid "Extend Range to End of Region"
+msgstr "Utöka omfång till slutet av regionen"
+
+#: ../editor_actions.cc:249
+msgid "Extend Range to Start of Region"
+msgstr "Utöka omfång till början av regionen"
+
+#: ../editor_actions.cc:252
+msgid "Follow Playhead"
+msgstr "Följ startmarkören"
+
+#: ../editor_actions.cc:260
+msgid "Zoom Focus Left"
+msgstr "Zoomfokus: vänster"
+
+#: ../editor_actions.cc:262
+msgid "Zoom Focus Right"
+msgstr "Zoomfokus: höger"
+
+#: ../editor_actions.cc:264
+msgid "Zoom Focus Center"
+msgstr "Zoomfokus: center"
+
+#: ../editor_actions.cc:266
+msgid "Zoom Focus Playhead"
+msgstr "Zoomfokus: startmarkören"
+
+#: ../editor_actions.cc:268
+msgid "Zoom Focus Edit"
+msgstr "Zoomfokus: redigeringsmarkör"
+
+#: ../editor_actions.cc:274
+msgid "Object Tool"
+msgstr "Objektverktyg"
+
+#: ../editor_actions.cc:275
+msgid "Range Tool"
+msgstr "Omfångsverktyg"
+
+#: ../editor_actions.cc:276
+msgid "Gain Tool"
+msgstr "Volymverktyg"
+
+#: ../editor_actions.cc:277
+msgid "Zoom Tool"
+msgstr "Zoomverktyg"
+
+#: ../editor_actions.cc:278
+msgid "Timefx Tool"
+msgstr "TidsFX-verktyg"
+
+#: ../editor_actions.cc:285
+msgid "Snap to frame"
+msgstr "Fäst mot frames"
+
+#: ../editor_actions.cc:286
+msgid "Snap to cd frame"
+msgstr "Fäst mot CD-frames"
+
+#: ../editor_actions.cc:287
+msgid "Snap to SMPTE frame"
+msgstr "Fäst mot SMPTE-frames"
+
+#: ../editor_actions.cc:288
+msgid "Snap to SMPTE seconds"
+msgstr "Fäst mot SMPTE-sekunder"
+
+#: ../editor_actions.cc:289
+msgid "Snap to SMPTE minutes"
+msgstr "Fäst mot SMPTE-minuter"
+
+#: ../editor_actions.cc:290
+msgid "Snap to seconds"
+msgstr "Fäst mot sekunder"
+
+#: ../editor_actions.cc:291
+msgid "Snap to minutes"
+msgstr "Fäst mot minuter"
+
+#: ../editor_actions.cc:292
+msgid "Snap to thirtyseconds"
+msgstr "Fäst mot trettio sekunder"
+
+#: ../editor_actions.cc:293
+msgid "Snap to asixteenthbeat"
+msgstr "Fäst mot en sextondel"
+
+#: ../editor_actions.cc:294
+msgid "Snap to eighths"
+msgstr "Fäst mot åttondelar"
+
+#: ../editor_actions.cc:295
+msgid "Snap to quarters"
+msgstr "Fäst mot fjärdedelar"
+
+#: ../editor_actions.cc:296
+msgid "Snap to thirds"
+msgstr "Fäst mot redjedelar"
+
+#: ../editor_actions.cc:297
+msgid "Snap to beat"
+msgstr "Fäst mot slag"
+
+#: ../editor_actions.cc:298
+msgid "Snap to bar"
+msgstr "Fäst mot takt"
+
+#: ../editor_actions.cc:299
+msgid "Snap to mark"
+msgstr "Fäst mot markörer"
+
+#: ../editor_actions.cc:300
+msgid "Snap to edit cursor"
+msgstr "Fäst mot redigeringsmarkören"
+
+#: ../editor_actions.cc:301
+msgid "Snap to region start"
+msgstr "Fäst mot regionstart"
+
+#: ../editor_actions.cc:302
+msgid "Snap to region end"
+msgstr "Fäst mot regionslut"
+
+#: ../editor_actions.cc:303
+msgid "Snap to region sync"
+msgstr "Fäst mot regionssynk.-punkt"
+
+#: ../editor_actions.cc:304
+msgid "Snap to region boundary"
+msgstr "Fäst mot regionsgräns"
+
+#. the region list popup menu
+#: ../editor_actions.cc:313
+msgid "Sort"
+msgstr "Sortera"
+
+#: ../editor_actions.cc:321
+msgid "Show all"
+msgstr "Visa allt"
+
+#: ../editor_actions.cc:322
+msgid "Show automatic regions"
+msgstr "Visa automatiska regioner"
+
+#: ../editor_actions.cc:324
+msgid "Ascending"
+msgstr "Stigande"
+
+#: ../editor_actions.cc:326
+msgid "Descending"
+msgstr "Fallande"
+
+#: ../editor_actions.cc:329
+msgid "By Region Name"
+msgstr "utifrån Regionsnamn"
+
+#: ../editor_actions.cc:331
+msgid "By Region Length"
+msgstr "utifrån Regionslängd"
+
+#: ../editor_actions.cc:333
+msgid "By Region Position"
+msgstr "utifrån Regionsposition"
+
+#: ../editor_actions.cc:335
+msgid "By Region Timestamp"
+msgstr "utifrån Regionstiddstämpel"
+
+#: ../editor_actions.cc:337
+msgid "By Region Start in File"
+msgstr "utifrån Regionens start i filen"
+
+#: ../editor_actions.cc:339
+msgid "By Region End in File"
+msgstr "utifrån Regionens slut i filen"
+
+#: ../editor_actions.cc:341
+msgid "By Source File Name"
+msgstr "utifrån Källfilnamn"
+
+#: ../editor_actions.cc:343
+msgid "By Source File Length"
+msgstr "utifrån Källfillängd"
+
+#: ../editor_actions.cc:345
+msgid "By Source File Creation Date"
+msgstr ""
+
+#: ../editor_actions.cc:347
+msgid "By Source Filesystem"
+msgstr "utifrån Källfilsskapelsedatum"
+
+#. the next two are duplicate items with different names for use in two different contexts
+#: ../editor_actions.cc:353
+msgid "Add External Audio"
+msgstr "Lägg till ljudfil"
+
+#: ../editor_actions.cc:355
+msgid "as Region(s)"
+msgstr "som region(er)"
+
+#: ../editor_actions.cc:357
+msgid "as Tracks"
+msgstr "som spår"
+
+#: gtk2_ardour/editor_actions.cc:360
+msgid "as Tape Tracks"
+msgstr "som rullbandsspår"
+
+#: ../editor_actions.cc:359
+msgid "to Tracks"
+msgstr "till spår"
+
+#: ../editor_actions.cc:362
+msgid "Show Waveforms"
+msgstr "Visa vågformer"
+
+#: ../editor_actions.cc:363
+msgid "Show Waveforms While Recording"
+msgstr "Visa vågformer vid inspelning"
+
+#: ../editor_actions.cc:364
+msgid "Show Measures"
+msgstr "Visa rutnät"
+
+#: ../editor_actions.cc:377 ../editor_actions.cc:384
+msgid "Medium"
+msgstr ""
+
+#: ../editor_actions.cc:379
+msgid "Faster"
+msgstr "Snabbare"
+
+#: ../editor_actions.cc:385
+msgid "Long"
+msgstr "Lång"
+
+#: ../editor_actions.cc:389
+msgid "Later is Higher"
+msgstr "Senare är högre"
+
+#: ../editor_actions.cc:390
+msgid "Most Recently Moved/Added is Higher"
+msgstr "Senast flyttade/tillagda är högre"
+
+#: ../editor_actions.cc:391
+msgid "Most Recently Added is Higher"
+msgstr "Senast tillagda är högre"
+
+#: ../editor_audio_import.cc:72
+msgid "You can't import or embed an audiofile until you have a session loaded."
+msgstr "Du kan inte importera en ljudfil innan du har laddat en session."
+
+#: ../editor_audio_import.cc:77
+msgid "Add existing audio to session"
+msgstr "Lägg till ljudfil(er) till sessionen"
+
+#: ../editor_audio_import.cc:142
+msgid "ardour: importing %1"
+msgstr "ardour: importerar %1"
+
+#: ../editor_audio_import.cc:146
+msgid "Cancel Import"
+msgstr "Avbryt importering"
+
+#: ../editor_audio_import.cc:224
+msgid "Editor: cannot open file \"%1\", (%2)"
+msgstr "Redigerare: kan inte öppna filen \"%1\" (%2)"
+
+#: ../editor_audio_import.cc:232
+msgid "Cancel entire import"
+msgstr "Avbryt hela importen"
+
+#: ../editor_audio_import.cc:233
+msgid "Don't embed it"
+msgstr "Infoga inte"
+
+#: ../editor_audio_import.cc:234
+msgid "Embed all without questions"
+msgstr "Infoga alla"
+
+#: ../editor_audio_import.cc:239
+msgid "Embed it anyway"
+msgstr "Infoga ändå"
+
+#: ../editor_audio_import.cc:242
+msgid ""
+"%1\n"
+"This audiofile's sample rate doesn't match the session sample rate!"
+msgstr ""
+"%1\n"
+"Denna ljudfils samplingsfrekvens matchar inte sessionens!"
+
+#: ../editor_audio_import.cc:275
+msgid "could not open %1"
+msgstr "kunde inte öppna %1"
+
+#: ../editor_audio_import.cc:320
+msgid "insert sndfile"
+msgstr "infoga ljudfil"
+
+#. stuff for the verbose canvas cursor
+#: ../editor_canvas.cc:117
+msgid "VerboseCanvasCursor"
+msgstr ""
+
+#: ../editor_edit_groups.cc:52 ../mixer_ui.cc:735
+msgid "Activate All"
+msgstr "Aktivera alla"
+
+#: ../editor_edit_groups.cc:53 ../mixer_ui.cc:736
+msgid "Disable All"
+msgstr "Avaktivera alla"
+
+#: ../editor_edit_groups.cc:55 ../mixer_ui.cc:738
+msgid "Add group"
+msgstr "Lägg till grupp"
+
+#: ../editor_edit_groups.cc:228 ../mixer_ui.cc:969
+msgid "unnamed"
+msgstr "namnlös"
+
+#: ../editor_edit_groups.cc:257 ../mixer_ui.cc:833
+msgid "-all-"
+msgstr "-alla-"
+
+#: ../editor_export_audio.cc:64
+msgid ""
+"There is no selection to export.\n"
+"\n"
+"Select a selection using the range mouse mode"
+msgstr ""
+"Det finns ingen markering att exportera.\n"
+"\n"
+"Välj en markering i omfångsläget"
+
+#: ../editor_export_audio.cc:109
+msgid ""
+"There are no ranges to export.\n"
+"\n"
+"Create 1 or more ranges by dragging the mouse in the range bar"
+msgstr ""
+"TDet finns inga omfång att exportera.\n"
+"\n"
+"Skapa 1 eller flera omfång genom att dra musen i omfångs-fältet."
+
+#: ../editor_imageframe.cc:624 ../editor_imageframe.cc:654
+msgid "programming error: no ImageFrameView selected"
+msgstr ""
+
+#: ../editor_imageframe.cc:847 ../editor_imageframe.cc:869
+msgid "programming error: no MarkerView selected"
+msgstr ""
+
+#: ../editor_keyboard.cc:104
+msgid "mute region"
+msgstr "tysta region"
+
+#: ../editor_keys.cc:45
+msgid "keyboard selection"
+msgstr "tangentbordsmarkering"
+
+#: ../editor_markers.cc:291 ../editor_ops.cc:1291 ../editor_ops.cc:1304
+#: ../editor_ops.cc:1322 ../location_ui.cc:773
+msgid "add marker"
+msgstr ""
+
+#: ../editor_markers.cc:306 ../editor_markers.cc:379 ../editor_markers.cc:551
+#: ../editor_markers.cc:569 ../editor_markers.cc:588 ../editor_markers.cc:607
+#: ../editor_markers.cc:637 ../editor_markers.cc:665 ../editor_markers.cc:693
+#: ../editor_markers.cc:731 ../editor_markers.cc:758 ../editor_markers.cc:781
+#: ../editor_markers.cc:800 ../editor_mouse.cc:2014 ../editor_mouse.cc:4274
+msgid "programming error: marker canvas item has no marker object pointer!"
+msgstr ""
+
+#: ../editor_markers.cc:330 ../location_ui.cc:655
+msgid "remove marker"
+msgstr "ta bort markör"
+
+#: ../editor_markers.cc:457
+msgid "Locate to Mark"
+msgstr "Placera startmarkör här"
+
+#: ../editor_markers.cc:458
+msgid "Play from Mark"
+msgstr "Spela from markör"
+
+#: ../editor_markers.cc:459
+msgid "Set Mark from Playhead"
+msgstr "Placera markör från startmarkören"
+
+#: ../editor_markers.cc:463
+msgid "Rename Mark"
+msgstr "Byt namn på markör"
+
+#: ../editor_markers.cc:464
+msgid "Hide Mark"
+msgstr "Göm markör"
+
+#: ../editor_markers.cc:465
+msgid "Remove Mark"
+msgstr "Ta bort markör"
+
+#: ../editor_markers.cc:478 ../editor_markers.cc:534
+msgid "Locate to Range Mark"
+msgstr "Flytta starmarköer till omfångsmarkör"
+
+#: ../editor_markers.cc:479 ../editor_markers.cc:535
+msgid "Play from Range Mark"
+msgstr "Spela från omfångmarkör"
+
+#: ../editor_markers.cc:480
+msgid "Loop Range"
+msgstr "Loopa omfång"
+
+#: ../editor_markers.cc:481 ../editor_markers.cc:536
+msgid "Set Range Mark from Playhead"
+msgstr "Placera omfångsmarkör från startmarkören"
+
+#: ../editor_markers.cc:482 ../editor_markers.cc:537
+msgid "Set Range from Range Selection"
+msgstr "Sätt omfång från omfångsmarkering"
+
+#: ../editor_markers.cc:486
+msgid "Rename Range"
+msgstr "Byt namn på omfång"
+
+#: ../editor_markers.cc:487 ../editor_markers.cc:539
+msgid "Hide Range"
+msgstr "Göm omfång"
+
+#: ../editor_markers.cc:488
+msgid "Remove Range"
+msgstr "Ta bort omfång"
+
+#: ../editor_markers.cc:492 ../editor_markers.cc:541
+msgid "Separate Regions in Range"
+msgstr "Separera regioner i omfånget"
+
+#: ../editor_markers.cc:493 ../editor_markers.cc:542
+msgid "Select All in Range"
+msgstr "Välj allt i omfånget"
+
+#: ../editor_markers.cc:519
+msgid "Set Loop Range"
+msgstr "Sätt loop-omfång här"
+
+#: ../editor_markers.cc:520
+msgid "Set Punch Range"
+msgstr "Sätt punch-omfång här"
+
+#: ../editor_markers.cc:814
+msgid "New Name:"
+msgstr "Nytt namn:"
+
+#: ../editor_markers.cc:817
+msgid "ardour: rename mark"
+msgstr "ardour: byt namn på markör"
+
+#: ../editor_markers.cc:819
+msgid "ardour: rename range"
+msgstr "ardour: byt namn på omfång"
+
+#: ../editor_markers.cc:839
+msgid "rename marker"
+msgstr "byt namn på markör"
+
+#: ../editor_markers.cc:864
+msgid "set loop range"
+msgstr "ställ in loop-omfång"
+
+#: ../editor_markers.cc:890
+msgid "set punch range"
+msgstr "ställ in punch-omfång"
+
+#: ../editor_mouse.cc:102
+msgid "Editor::event_frame() used on unhandled event type %1"
+msgstr ""
+
+#: ../editor_mouse.cc:312
+msgid "select on click"
+msgstr ""
+
+#: ../editor_mouse.cc:1589
+msgid "programming error: start_grab called without drag item"
+msgstr ""
+
+#: ../editor_mouse.cc:1813
+msgid "change fade in length"
+msgstr "ändra intoningslängd"
+
+#: ../editor_mouse.cc:1831
+msgid "programming error: fade out canvas item has no regionview data pointer!"
+msgstr ""
+
+#: ../editor_mouse.cc:1905
+msgid "change fade out length"
+msgstr "ändra uttoningslängd"
+
+#: ../editor_mouse.cc:1924
+msgid "programming error: cursor canvas item has no cursor data pointer!"
+msgstr ""
+
+#: ../editor_mouse.cc:2141
+msgid "move marker"
+msgstr "flytta markör"
+
+#: ../editor_mouse.cc:2164 ../editor_mouse.cc:2195
+#: ../editor_tempodisplay.cc:458
+msgid ""
+"programming error: meter marker canvas item has no marker object pointer!"
+msgstr ""
+
+#: ../editor_mouse.cc:2263
+msgid "copy meter mark"
+msgstr "kopiera taktartsmarkör"
+
+#: ../editor_mouse.cc:2273
+msgid "move meter mark"
+msgstr "flytta taktartsmarkör"
+
+#: ../editor_mouse.cc:2288 ../editor_mouse.cc:2321
+#: ../editor_tempodisplay.cc:330 ../editor_tempodisplay.cc:408
+#: ../editor_tempodisplay.cc:427
+msgid ""
+"programming error: tempo marker canvas item has no marker object pointer!"
+msgstr ""
+
+#: ../editor_mouse.cc:2293 ../editor_mouse.cc:2326
+#: ../editor_tempodisplay.cc:335 ../editor_tempodisplay.cc:413
+msgid "programming error: marker for tempo is not a tempo marker!"
+msgstr ""
+
+#: ../editor_mouse.cc:2393
+msgid "copy tempo mark"
+msgstr "kopiera tempomarkör"
+
+#: ../editor_mouse.cc:2403
+msgid "move tempo mark"
+msgstr "flytta tempomarkör"
+
+#: ../editor_mouse.cc:2417 ../editor_mouse.cc:2436 ../editor_mouse.cc:2449
+msgid ""
+"programming error: control point canvas item has no control point object "
+"pointer!"
+msgstr ""
+
+#: ../editor_mouse.cc:2554
+msgid "programming error: line canvas item has no line pointer!"
+msgstr ""
+
+#: ../editor_mouse.cc:2663
+msgid "move region(s)"
+msgstr "flytta region(er)"
+
+#: ../editor_mouse.cc:2726
+msgid "Drag region brush"
+msgstr "Dra regionspensel"
+
+#. don't copy again
+#. this is committed in the grab finished callback.
+#: ../editor_mouse.cc:2750
+msgid "Drag region copy"
+msgstr "Dra regionskopia"
+
+#. A selection grab currently creates two undo/redo operations, one for
+#. creating the new region and another for moving it.
+#.
+#: ../editor_mouse.cc:3608
+msgid "selection grab"
+msgstr "markeringsgrepp"
+
+#: ../editor_mouse.cc:3649
+msgid "cancel selection"
+msgstr "avbryt markering"
+
+#: ../editor_mouse.cc:3759
+msgid "range selection"
+msgstr "omfångsmarkering"
+
+#: ../editor_mouse.cc:3775
+msgid "trim selection start"
+msgstr "beskär markerings början"
+
+#: ../editor_mouse.cc:3791
+msgid "trim selection end"
+msgstr "beskär markerings slut"
+
+#: ../editor_mouse.cc:3808
+msgid "move selection"
+msgstr "flytta markering"
+
+#: ../editor_mouse.cc:4194
+msgid "Start point trim"
+msgstr "Beskär startpunkt"
+
+#: ../editor_mouse.cc:4222
+msgid "End point trim"
+msgstr "Beskär slutpunkt"
+
+#: ../editor_mouse.cc:4261
+msgid "trimmed region"
+msgstr "Beskuren region"
+
+#: ../editor_mouse.cc:4399
+msgid "new range marker"
+msgstr "ny omfångsmarkör"
+
+#: ../editor_mouse.cc:4641
+msgid "select regions"
+msgstr "välj regioner"
+
+#: ../editor_mouse.cc:4670
+msgid "Name for region:"
+msgstr "Namnge region:"
+
+#: ../editor_mouse.cc:4734
+msgid "timestretch"
+msgstr "tidstänjning"
+
+#: ../editor_ops.cc:196
+msgid "split"
+msgstr "dela"
+
+#: ../editor_ops.cc:232
+msgid "remove region"
+msgstr "ta bort region"
+
+#: ../editor_ops.cc:251
+msgid ""
+" This is destructive, will possibly delete audio files\n"
+"It cannot be undone\n"
+"Do you really want to destroy %1 ?"
+msgstr ""
+" Detta är en destruktiv operation, kommer möjligt radera filer\n"
+"Detta kan ej ångras\n"
+"Vill du verkligen radera %1 ?"
+
+#: ../editor_ops.cc:255
+msgid "these regions"
+msgstr "dessa regioner"
+
+#: ../editor_ops.cc:255
+msgid "this region"
+msgstr "denna region"
+
+#: ../editor_ops.cc:257 ../editor_ops.cc:3319 ../route_ui.cc:700
+#: ../visual_time_axis.cc:277
+msgid "No, do nothing."
+msgstr "Nej, gör ingenting."
+
+#: ../editor_ops.cc:260
+msgid "Yes, destroy them."
+msgstr "Ja, radera dem."
+
+#: ../editor_ops.cc:262 ../editor_ops.cc:3320
+msgid "Yes, destroy it."
+msgstr "Ja, radera den."
+
+#: ../editor_ops.cc:353 ../editor_ops.cc:381
+msgid "extend selection"
+msgstr "utöka markeringen"
+
+#: ../editor_ops.cc:397 ../editor_ops.cc:431 ../editor_ops.cc:475
+#: ../editor_ops.cc:501
+msgid "nudge forward"
+msgstr "knuffa framåt"
+
+#: ../editor_ops.cc:565
+msgid "build_region_boundary_cache called with snap_type = %1"
+msgstr ""
+
+#: ../editor_ops.cc:1421
+msgid "select all within"
+msgstr "välj allt inom"
+
+#: ../editor_ops.cc:1453
+msgid "set selection from region"
+msgstr "ställ in markering från region"
+
+#: ../editor_ops.cc:1486
+msgid "set selection from range"
+msgstr "ställ markering från omfång"
+
+#: ../editor_ops.cc:1516
+msgid "select all from range"
+msgstr "välj allt inom omfång"
+
+#: ../editor_ops.cc:1538
+msgid "select all from punch"
+msgstr "välj allt från punch"
+
+#: ../editor_ops.cc:1560
+msgid "select all from loop"
+msgstr "välj allt från loop"
+
+#: ../editor_ops.cc:1574
+msgid "select all after cursor"
+msgstr "välj allt efter markör"
+
+#: ../editor_ops.cc:1579
+msgid "select all before cursor"
+msgstr "välj allt före markör"
+
+#: ../editor_ops.cc:1609
+msgid "select all between cursors"
+msgstr "välj allt mellan markörerna"
+
+#: ../editor_ops.cc:1740
+msgid "clear markers"
+msgstr "rensa markörer"
+
+#: ../editor_ops.cc:1752
+msgid "clear ranges"
+msgstr "rensa omfång"
+
+#: ../editor_ops.cc:1771
+msgid "clear locations"
+msgstr "rensa platser"
+
+#: ../editor_ops.cc:1821
+msgid "insert dragged region"
+msgstr "infoga dragen region"
+
+#: ../editor_ops.cc:1857
+msgid "insert region"
+msgstr "infoga region"
+
+#: ../editor_ops.cc:2048 ../io_selector.cc:57 ../io_selector.cc:791
+msgid "OK"
+msgstr ""
+
+#: ../editor_ops.cc:2055
+msgid "ardour: rename region"
+msgstr "ardour: byt namn på region"
+
+#: ../editor_ops.cc:2278 ../editor_ops.cc:2327
+msgid "separate"
+msgstr "separera"
+
+#: ../editor_ops.cc:2389
+msgid "trim to selection"
+msgstr "beskär till markeringen"
+
+#: ../editor_ops.cc:2429
+msgid "region fill"
+msgstr "regionsfyllning"
+
+#: ../editor_ops.cc:2488
+msgid "fill selection"
+msgstr "fyll markeringen"
+
+#: ../editor_ops.cc:2509
+msgid "Programming error. that region doesn't cover that position"
+msgstr ""
+
+#: ../editor_ops.cc:2512
+msgid "set region sync position"
+msgstr "Ställ in regionssynk.-punkt"
+
+#: ../editor_ops.cc:2527
+msgid "Place the edit cursor at the desired sync point"
+msgstr "Placera redigerinsmarkören på avsedd synk.-punkt"
+
+#: ../editor_ops.cc:2532
+msgid "set sync from edit cursor"
+msgstr "ställ synk. från redigeringsmarkör"
+
+#: ../editor_ops.cc:2544
+msgid "remove sync"
+msgstr "ta bort synk."
+
+#: ../editor_ops.cc:2558
+msgid "naturalize"
+msgstr "naturalisera"
+
+#: ../editor_ops.cc:2622
+msgid "align selection (relative)"
+msgstr "justera markering (relativt)"
+
+#: ../editor_ops.cc:2650
+msgid "align selection"
+msgstr "justera markering"
+
+#: ../editor_ops.cc:2662
+msgid "align region"
+msgstr "justera region"
+
+#: ../editor_ops.cc:2709 ../editor_ops.cc:2734
+msgid "trim to edit"
+msgstr "beskär till redigering"
+
+#: ../editor_ops.cc:2785
+msgid "ardour: freeze"
+msgstr "ardour: frys"
+
+#: ../editor_ops.cc:2790
+msgid "Cancel Freeze"
+msgstr "Avbryt frysning"
+
+#: ../editor_ops.cc:2827
+msgid "bounce range"
+msgstr "omfång till disk"
+
+#: ../editor_ops.cc:2880
+msgid "cut"
+msgstr "klipp"
+
+#: ../editor_ops.cc:2883
+msgid "copy"
+msgstr "kopiera"
+
+#: ../editor_ops.cc:2896
+msgid " objects"
+msgstr " objekt"
+
+#: ../editor_ops.cc:2922
+msgid " range"
+msgstr " omfång"
+
+#: ../editor_ops.cc:3079
+msgid "paste"
+msgstr "klistra"
+
+#: ../editor_ops.cc:3117
+msgid "paste chunk"
+msgstr "klistra bit"
+
+#. clear (below) will clear the argument list
+#: ../editor_ops.cc:3158
+msgid "duplicate region"
+msgstr "duplicera region"
+
+#: ../editor_ops.cc:3203
+msgid "duplicate selection"
+msgstr "duplicera markering"
+
+#: ../editor_ops.cc:3260
+msgid "clear playlist"
+msgstr "rensa spellista"
+
+#: ../editor_ops.cc:3289
+msgid "nudge track"
+msgstr "knuffa spår"
+
+#: ../editor_ops.cc:3316
+msgid ""
+"Do you really want to destroy the last capture?\n"
+"(This is destructive and cannot be undone)"
+msgstr ""
+"Vill du verkligen radera den senaste inspelningen?\n"
+"(Detta är en destruktiv handling och kan ej ångras)"
+
+#: ../editor_ops.cc:3344
+msgid "normalize"
+msgstr "normalisera"
+
+#: ../editor_ops.cc:3391
+msgid "reverse regions"
+msgstr "regioner till motsatt riktning"
+
+#: ../editor_region_list.cc:96 ../editor_region_list.cc:101
+#: ../editor_region_list.cc:104 ../location_ui.cc:55
+msgid "Hidden"
+msgstr "Dold"
+
+#. added a new fresh one at the end
+#: ../editor_route_list.cc:101 ../editor_route_list.cc:102
+#: ../editor_route_list.cc:246
+msgid "editor"
+msgstr "redigerare"
+
+#: ../editor_route_list.cc:309 ../mixer_ui.cc:698
+msgid "Show All"
+msgstr "Visa Alla"
+
+#: ../editor_route_list.cc:310 ../mixer_ui.cc:699
+msgid "Hide All"
+msgstr "Dölj Alla"
+
+#: ../editor_route_list.cc:311 ../mixer_ui.cc:700
+msgid "Show All Audio Tracks"
+msgstr "Visa alla spår"
+
+#: ../editor_route_list.cc:312 ../mixer_ui.cc:701
+msgid "Hide All Audio Tracks"
+msgstr "Dölj alla spår"
+
+#: ../editor_route_list.cc:313 ../mixer_ui.cc:702
+msgid "Show All Audio Busses"
+msgstr "Visa alla bussar"
+
+#: ../editor_route_list.cc:314 ../mixer_ui.cc:703
+msgid "Hide All Audio Busses"
+msgstr "Dölj alla bussar"
+
+#: ../editor_rulers.cc:311
+msgid "New location marker"
+msgstr "Ny platsmarkör"
+
+#: ../editor_rulers.cc:312
+msgid "Clear all locations"
+msgstr "Rensa alla platsmarkörer"
+
+#. ruler_items.push_back (MenuElem (_("New Range")));
+#: ../editor_rulers.cc:317
+msgid "Clear all ranges"
+msgstr "Rensa alla omfång"
+
+#: ../editor_rulers.cc:326
+msgid "New Tempo"
+msgstr "Nytt tempo"
+
+#: ../editor_rulers.cc:327
+msgid "Clear tempo"
+msgstr "Ta bort tempo"
+
+#: ../editor_rulers.cc:332
+msgid "New Meter"
+msgstr "Ny taktart"
+
+
+#: ../editor_rulers.cc:333
+msgid "Clear meter"
+msgstr "Ta bort taktart"
+
+#: ../editor_rulers.cc:341
+msgid "Min:Secs"
+msgstr "Min:Sek"
+
+#: ../editor_selection_list.cc:107
+msgid "Name for Chunk:"
+msgstr "Namn för bit:"
+
+#: ../editor_selection_list.cc:110
+msgid "Create Chunk"
+msgstr "Skapa bit"
+
+#: ../editor_selection_list.cc:110
+msgid "Forget it"
+msgstr "Glöm det"
+
+#: ../editor_tempodisplay.cc:252 ../editor_tempodisplay.cc:292
+msgid "add"
+msgstr "lägg till"
+
+#: ../editor_tempodisplay.cc:274
+msgid "add tempo mark"
+msgstr "lägg till tempomarkör"
+
+#: ../editor_tempodisplay.cc:314
+msgid "add meter mark"
+msgstr "lägg till taktartsmarkör"
+
+#: ../editor_tempodisplay.cc:347 ../editor_tempodisplay.cc:375
+msgid "done"
+msgstr "klar"
+
+#: ../editor_tempodisplay.cc:365 ../editor_tempodisplay.cc:393
+msgid "replace tempo mark"
+msgstr "ersätt tempomarkör"
+
+#: ../editor_tempodisplay.cc:432 ../editor_tempodisplay.cc:463
+msgid "programming error: marker for meter is not a meter marker!"
+msgstr ""
+
+#: ../editor_tempodisplay.cc:442 ../editor_tempodisplay.cc:475
+msgid "remove tempo mark"
+msgstr "ta bort tempomarkör"
+
+#: ../editor_timefx.cc:50
+msgid "Quick but Ugly"
+msgstr "Snabbt men Fult"
+
+#: ../editor_timefx.cc:51
+msgid "Skip Anti-aliasing"
+msgstr "Hoppa över Anti-aliasing"
+
+#: ../editor_timefx.cc:55
+msgid "ardour: timestretch"
+msgstr "ardour: tidstänjning"
+
+#: ../editor_timefx.cc:56
+msgid "TimeStretchDialog"
+msgstr "TidsTänjningsDialog"
+
+#: ../editor_timefx.cc:69
+msgid "Stretch/Shrink it"
+msgstr "Förläng/Förkorta den"
+
+#: ../editor_timefx.cc:72 ../editor_timefx.cc:73
+msgid "TimeStretchButton"
+msgstr "TidsTänjningsKnapp"
+
+#: ../editor_timefx.cc:74
+msgid "TimeStretchProgress"
+msgstr "TidsTänjningsFörlopp"
+
+#: ../editor_timefx.cc:138
+msgid "timestretch cannot be started - thread creation error"
+msgstr "tidstänjning kan inte startas - trådskapningsfel"
+
+#: ../export_dialog.cc:58 ../export_dialog.cc:398 ../export_dialog.cc:1026
+#: ../export_dialog.cc:1194
+msgid "22.05kHz"
+msgstr ""
+
+#: ../export_dialog.cc:59 ../export_dialog.cc:401 ../export_dialog.cc:416
+#: ../export_dialog.cc:1028 ../export_dialog.cc:1196
+msgid "44.1kHz"
+msgstr ""
+
+#: ../export_dialog.cc:60 ../export_dialog.cc:404 ../export_dialog.cc:1030
+#: ../export_dialog.cc:1198
+msgid "48kHz"
+msgstr ""
+
+#: ../export_dialog.cc:61 ../export_dialog.cc:407 ../export_dialog.cc:1032
+#: ../export_dialog.cc:1200
+msgid "88.2kHz"
+msgstr ""
+
+#: ../export_dialog.cc:62 ../export_dialog.cc:410 ../export_dialog.cc:1034
+#: ../export_dialog.cc:1202
+msgid "96kHz"
+msgstr ""
+
+#: ../export_dialog.cc:63 ../export_dialog.cc:413 ../export_dialog.cc:1036
+#: ../export_dialog.cc:1204
+msgid "192kHz"
+msgstr ""
+
+#: ../export_dialog.cc:68
+msgid "best"
+msgstr "bäst"
+
+#: ../export_dialog.cc:69 ../export_dialog.cc:1211
+msgid "fastest"
+msgstr "snabbast"
+
+#: ../export_dialog.cc:70 ../export_dialog.cc:1213
+msgid "linear"
+msgstr "linjär"
+
+#: ../export_dialog.cc:71 ../export_dialog.cc:1215
+msgid "better"
+msgstr "bättre"
+
+#: ../export_dialog.cc:72 ../export_dialog.cc:1217
+msgid "intermediate"
+msgstr "mellanliggande"
+
+#: ../export_dialog.cc:78 ../export_dialog.cc:1226
+msgid "Rectangular"
+msgstr "Rektangulär"
+
+#: ../export_dialog.cc:79
+msgid "Shaped Noise"
+msgstr "Format Oväsen"
+
+#: ../export_dialog.cc:80 ../export_dialog.cc:1228
+msgid "Triangular"
+msgstr "Triangulär"
+
+#: ../export_dialog.cc:85
+msgid "stereo"
+msgstr ""
+
+#. default is to use all
+#: ../export_dialog.cc:86 ../export_dialog.cc:485 ../export_dialog.cc:1054
+#: ../export_dialog.cc:1176
+msgid "mono"
+msgstr ""
+
+#: ../export_dialog.cc:92
+msgid "CUE"
+msgstr ""
+
+#: ../export_dialog.cc:93
+msgid "TOC"
+msgstr ""
+
+#: ../export_dialog.cc:101
+msgid "Format"
+msgstr ""
+
+#: ../export_dialog.cc:102
+msgid "CD Marker File Type"
+msgstr "CD-markörsfiltyp"
+
+#: ../export_dialog.cc:102
+msgid "Channels"
+msgstr "Kanaler"
+
+#: ../export_dialog.cc:104
+msgid "File Type"
+msgstr "Filtyp"
+
+#: ../export_dialog.cc:105
+msgid "Sample Format"
+msgstr "Samplingsformat"
+
+#: ../export_dialog.cc:106
+msgid "Sample Endianness"
+msgstr "Samplings-endian"
+
+#: ../export_dialog.cc:107
+msgid "Sample Rate"
+msgstr "Samplingsfrekvens"
+
+#: ../export_dialog.cc:108
+msgid "Conversion Quality"
+msgstr "Konverteringskvalitet"
+
+#: ../export_dialog.cc:109
+msgid "Dither Type"
+msgstr "Dither-typ"
+
+#: ../export_dialog.cc:110
+msgid "Export CD Marker File Only"
+msgstr "Expoertera endast CD-markörsfil"
+
+#: ../export_dialog.cc:111
+msgid "Export to File"
+msgstr "Exportera till fil"
+
+#: ../export_dialog.cc:112 ../option_editor.cc:82 ../option_editor.cc:83
+msgid "Browse"
+msgstr "Bläddra"
+
+#: ../export_dialog.cc:113
+msgid "Specific tracks ..."
+msgstr "Enstaka spår..."
+
+#: ../export_dialog.cc:124
+msgid "ardour: export"
+msgstr "ardour: exportera"
+
+#: ../export_dialog.cc:125
+msgid "ardour_export"
+msgstr ""
+
+#: ../export_dialog.cc:138 ../export_dialog.cc:154 ../mixer_strip.cc:123
+#: ../mixer_strip.cc:767
+msgid "Output"
+msgstr "Utgång"
+
+#: ../export_dialog.cc:632
+msgid "Editor: cannot open \"%1\" as export file for CD toc file"
+msgstr "Redigerare: kan ej öppna \"%1\" som exportfil för CD-TOC-fil"
+
+#: ../export_dialog.cc:758
+msgid "Editor: cannot open \"%1\" as export file for CD cue file"
+msgstr "Redigerare: kan ej öppna \"%1\" som exportfil för CD-CUE-fil"
+
+#: ../export_dialog.cc:777
+msgid "WAV"
+msgstr ""
+
+#: ../export_dialog.cc:911
+msgid "Stop Export"
+msgstr "Avbryt Export"
+
+#: ../export_dialog.cc:1130
+msgid "Please enter a valid filename."
+msgstr "Var vänlig använd ett giltigt filnamn."
+
+#: ../export_dialog.cc:1140
+msgid "Please specify a complete filename for the audio file."
+msgstr "Var vänlig skriv in ett fullständigt filnamn för ljudfilen"
+
+#: ../export_dialog.cc:1146
+msgid "File already exists, do you want to overwrite it?"
+msgstr "Filen existerar redan, vill du skriva över den?"
+
+#: ../export_dialog.cc:1158 ../export_range_markers_dialog.cc:152
+msgid "Cannot write file in: "
+msgstr "Kan ej skriva till fil i: "
+
+#. warning dialog
+#: ../export_range_markers_dialog.cc:134
+msgid "Please enter a valid target directory."
+msgstr "Var vänlig välj en giltig katalog."
+
+#: ../export_range_markers_dialog.cc:142
+msgid ""
+"Please select an existing target directory. Files\n"
+"are not allowed!"
+msgstr ""
+"Var vänliga välj en existerande katalog. Filer\n"
+"är inte tillåtna!"
+
+#: ../gain_automation_time_axis.cc:61
+msgid "add gain automation event"
+msgstr "lägg till volymautomatiseringshändelse"
+
+#: ../gain_meter.cc:66
+msgid "cannot find images for fader slider"
+msgstr "kan inte hitta bilder för reglage"
+
+#: ../gain_meter.cc:73
+msgid "cannot find images for fader rail"
+msgstr "kan inte hitta bilder för reglageräcke"
+
+#: ../gain_meter.cc:129 ../gain_meter.cc:489 ../gain_meter.cc:534
+msgid "-inf"
+msgstr ""
+
+#: ../gain_meter.cc:139
+msgid "Fader automation mode"
+msgstr "Automatiseringsläge för reglage"
+
+#: ../gain_meter.cc:140
+msgid "Fader automation type"
+msgstr "Automatiseringstyp för reglage"
+
+#. XXX it might different in different languages
+#: ../gain_meter.cc:181 ../gain_meter.cc:812 ../panner_ui.cc:98
+#: ../panner_ui.cc:806
+msgid "Abs"
+msgstr ""
+
+#: ../gain_meter.cc:467
+msgid "-Inf"
+msgstr ""
+
+#: ../gain_meter.cc:776 ../mixer_strip.cc:770 ../panner_ui.cc:770
+msgid "O"
+msgstr ""
+
+#: ../gain_meter.cc:779 ../panner_ui.cc:773
+msgid "P"
+msgstr ""
+
+#: ../gain_meter.cc:782 ../panner_ui.cc:776
+msgid "T"
+msgstr ""
+
+#: ../gain_meter.cc:785 ../panner_ui.cc:779
+msgid "W"
+msgstr ""
+
+#: ../gtk-custom-ruler.c:126
+msgid "Lower"
+msgstr "Lägre"
+
+#: ../gtk-custom-ruler.c:127
+msgid "Lower limit of ruler"
+msgstr "Lägre gräns för räcke"
+
+#: ../gtk-custom-ruler.c:136
+msgid "Upper"
+msgstr "Övre"
+
+#: ../gtk-custom-ruler.c:137
+msgid "Upper limit of ruler"
+msgstr "Övre gräns för räcke"
+
+#: ../gtk-custom-ruler.c:146
+msgid "Position"
+msgstr ""
+
+#: ../gtk-custom-ruler.c:147
+msgid "Position of mark on the ruler"
+msgstr "Position för märke på räcke"
+
+#: ../gtk-custom-ruler.c:156
+msgid "Max Size"
+msgstr "Max storlek"
+
+#: ../gtk-custom-ruler.c:157
+msgid "Maximum size of the ruler"
+msgstr "Max storlek för räcket"
+
+#: ../gtk-custom-ruler.c:166
+msgid "Show Position"
+msgstr "Visa position"
+
+#: ../gtk-custom-ruler.c:167
+msgid "Draw current ruler position"
+msgstr "Rita upp räckets aktuellt position"
+
+#. end-of-file, other end closed or shutdown?
+#: ../imageframe_socket_handler.cc:126
+msgid "Image Compositor Socket has been shutdown/closed"
+msgstr ""
+
+#: ../imageframe_time_axis.cc:285
+msgid "0.5 seconds"
+msgstr "0.5 sekunder"
+
+#: ../imageframe_time_axis.cc:286 ../marker_time_axis.cc:241
+msgid "1 seconds"
+msgstr "1 sekund"
+
+#: ../imageframe_time_axis.cc:287 ../marker_time_axis.cc:242
+msgid "1.5 seconds"
+msgstr "1.5 sekunder"
+
+#: ../imageframe_time_axis.cc:288 ../marker_time_axis.cc:243
+msgid "2 seconds"
+msgstr "2 sekunder"
+
+#: ../imageframe_time_axis.cc:289 ../marker_time_axis.cc:244
+msgid "2.5 seconds"
+msgstr "2.5 sekunder"
+
+#: ../imageframe_time_axis.cc:290 ../marker_time_axis.cc:245
+msgid "3 seconds"
+msgstr "3 sekunder"
+
+#. duration_items.push_back(SeparatorElem()) ;
+#. duration_items.push_back(MenuElem (_("custom"), mem_fun(*this, &ImageFrameTimeAxis::set_marker_duration_custom))) ;
+#: ../imageframe_time_axis.cc:295 ../marker_time_axis.cc:250
+msgid "Duration (sec)"
+msgstr "Varaktighet (sekunder)"
+
+#: ../imageframe_time_axis.cc:300
+msgid "Remove Frame"
+msgstr "Ta bort ruta"
+
+#: ../imageframe_time_axis.cc:303
+msgid "Image Frame"
+msgstr "Bildruta"
+
+#: ../imageframe_time_axis.cc:304 ../marker_time_axis.cc:256
+msgid "Rename Track"
+msgstr "Döp om spår"
+
+#: ../io_selector.cc:59 ../io_selector.cc:793
+msgid "Rescan"
+msgstr "Uppdatera"
+
+#: ../io_selector.cc:67
+msgid "%1 input"
+msgstr "%1-ingång"
+
+#: ../io_selector.cc:69
+msgid "%1 output"
+msgstr "%1-utgång"
+
+#: ../io_selector.cc:141 ../route_params_ui.cc:106
+msgid "Inputs"
+msgstr "Ingångar"
+
+#: ../io_selector.cc:141 ../route_params_ui.cc:107
+msgid "Outputs"
+msgstr "Utgångar"
+
+#: ../io_selector.cc:142
+msgid "Add Input"
+msgstr "Lägg till ingång"
+
+#: ../io_selector.cc:142
+msgid "Add Output"
+msgstr "Lägg till utgång"
+
+#: ../io_selector.cc:143
+msgid "Remove Input"
+msgstr "Ta bort ingång"
+
+#: ../io_selector.cc:143
+msgid "Remove Output"
+msgstr "Ta bort utgång"
+
+#: ../io_selector.cc:144
+msgid "Disconnect All"
+msgstr "Koppla från alla"
+
+#: ../io_selector.cc:158
+msgid "Available connections"
+msgstr "Tillgängliga anslutningar"
+
+#: ../io_selector.cc:554 ../io_selector.cc:573
+msgid "There are no more JACK ports available."
+msgstr "Det finns inga fler JACK-portar tillgängliga"
+
+#: ../io_selector.cc:648 ../io_selector.cc:675 ../io_selector.cc:728
+msgid "port"
+msgstr ""
+
+#: ../io_selector.cc:797
+msgid "ardour: "
+msgstr ""
+
+#: ../keyboard.cc:297
+msgid "KeyboardTarget: keyname \"%1\" is unknown."
+msgstr "KeyboardTarget: tangent \"%1\" är okänd."
+
+#: ../keyboard.cc:523
+msgid ""
+"Your system is completely broken - NumLock uses \"%1\"as its modifier. This "
+"is madness - see the man page for xmodmap to find out how to fix this."
+msgstr ""
+"Ditt system är totalt trasigt - NumLock använder \"%1\" som sin modifikator. "
+"Detta är galenskap - se xmodmaps manualsida för att fixa detta."
+
+#: ../keyboard.cc:531
+msgid ""
+"Your system generates \"%1\" when the NumLock key is pressed. This can cause "
+"problems when editing so Ardour will use %2 to mean Meta rather than %1"
+msgstr ""
+"Ditt system genererar \"%1\" när NumLock trycks. Detta kan orsaka problem "
+"vid redigering, så Ardour kommer att använda %2 som Meta snarare än %1"
+
+#: ../keyboard.cc:592
+msgid "You have %1 keys bound to \"mod1\""
+msgstr "Du har %1 tangenter bundna till \"mod1\""
+
+#: ../keyboard.cc:607
+msgid "You have %1 keys bound to \"mod2\""
+msgstr "Du har %1 tangenter bundna till \"mod2\""
+
+#: ../keyboard.cc:622
+msgid "You have %1 keys bound to \"mod3\""
+msgstr "Du har %1 tangenter bundna till \"mod3\""
+
+#: ../keyboard.cc:637
+msgid "You have %1 keys bound to \"mod4\""
+msgstr "Du har %1 tangenter bundna till \"mod4\""
+
+#: ../keyboard.cc:652
+msgid "You have %1 keys bound to \"mod5\""
+msgstr "Du har %1 tangenter bundna till \"mod5\""
+
+#: ../location_ui.cc:47 ../location_ui.cc:50
+msgid "Set"
+msgstr "Ställ in"
+
+#: ../location_ui.cc:48 ../location_ui.cc:51
+msgid "Go"
+msgstr "Gå till"
+
+#: ../location_ui.cc:54
+msgid "CD"
+msgstr ""
+
+#: ../location_ui.cc:57
+msgid "SCMS"
+msgstr ""
+
+#: ../location_ui.cc:58
+msgid "Pre-Emphasis"
+msgstr ""
+
+#: ../location_ui.cc:569
+msgid "Add New Location"
+msgstr "Lägg till ny Plats"
+
+#: ../location_ui.cc:570
+msgid "Add New Range"
+msgstr "Lägg till nytt Omfång"
+
+#: ../location_ui.cc:574
+msgid "ardour: locations"
+msgstr "ardour: platser"
+
+#: ../location_ui.cc:575
+msgid "ardour_locations"
+msgstr ""
+
+#: ../location_ui.cc:603
+msgid "Location (CD Index) Markers"
+msgstr "Plats-markörer (CD-Index)"
+
+#: ../location_ui.cc:623
+msgid "Range (CD Track) Markers"
+msgstr "Omfång-markörer (CD-spår)"
+
+#: ../location_ui.cc:789
+msgid "add range marker"
+msgstr "lägg till omfångsmarkör"
+
+#: ../main.cc:71
+msgid "ardour is killing itself for a clean exit\n"
+msgstr "ardour dödar sig själv för ett rent avslut\n"
+
+#: ../main.cc:80
+msgid "stopping user interface\n"
+msgstr "stoppar användargränssnittet\n"
+
+#. XXX its doubtful that snprintf() is async-safe
+#: ../main.cc:99
+#, c-format
+msgid "%d(%d): received signal %d\n"
+msgstr "%d(%d): mottog signal %d\n"
+
+#: ../main.cc:185
+msgid "cannot become new process group leader (%1)"
+msgstr "kan inte bli ny processgruppledare (%1)"
+
+#: ../main.cc:212
+msgid "cannot setup signal handling for %1"
+msgstr "kan ej konfigurera signalhantering för %1"
+
+#: ../main.cc:223
+msgid "cannot set default signal mask (%1)"
+msgstr "kan inte ställa in standardsignalmask (%1)"
+
+#: ../main.cc:253
+msgid ""
+"Without a UI style file, ardour will look strange.\n"
+" Please set ARDOUR2_UI_RC to point to a valid UI style file"
+msgstr ""
+"Utan en UI-stilfil kommer Ardour att se underligt ut.\n"
+" Ställ in ARDOUR2_UI_RC så att det pekar till en giltig UI-stilfil"
+
+#: ../main.cc:275
+msgid "Ardour could not connect to JACK."
+msgstr "Ardour kunde inte ansluta till JACK"
+
+#: ../main.cc:279
+msgid ""
+"There are several possible reasons:\n"
+"\n"
+"1) JACK is not running.\n"
+"2) JACK is running as another user, perhaps root.\n"
+"3) There is already another client called \"ardour\".\n"
+"\n"
+"Please consider the possibilities, and perhaps (re)start JACK."
+msgstr ""
+"Det finns flera möjliga anledningar:\n"
+"\n"
+"1) JACK är inte igång.\n"
+"2) JACK är startat av en annan användare, kanske root.\n"
+"3) Det finns redan en annan klient som heter \"ardour\".\n"
+"\n"
+"Överväg dessa möjligheter, och starta måhända (om) JACK."
+
+#: ../main.cc:309
+msgid "could not load command line session \"%1\""
+msgstr "kunde inte ladda kommandopromptssessionen \"%1\""
+
+#. it wasn't new, but we require a new session
+#: ../main.cc:329
+msgid ""
+"\n"
+"\n"
+"A session named \"%1\" already exists.\n"
+"To avoid this message, start ardour as \"ardour %1"
+msgstr ""
+"\n"
+"\n"
+"En session med namnet \"%1\" existerar redan.\n"
+"För att undvika detta meddelande, starta Ardour som \"ardour %1"
+
+#: ../main.cc:340
+msgid ""
+"\n"
+"\n"
+"No session named \"%1\" exists.\n"
+"To create it from the command line, start ardour as \"ardour --new %1"
+msgstr ""
+"\n"
+"\n"
+"Ingen session med namnet \"%1\" existerar.\n"
+"För att skapa den från kommandoprompten, starta Ardour som följer: \"ardour "
+"--new %1"
+
+#: ../main.cc:395
+msgid "Ardour/GTK "
+msgstr ""
+
+#: ../main.cc:397
+msgid ""
+"\n"
+"   (built using "
+msgstr ""
+"\n"
+"   (kompilerat med "
+
+#: ../main.cc:401
+msgid " with libardour "
+msgstr " med libardour"
+
+#: ../main.cc:406
+msgid " and GCC version "
+msgstr " och GCC version "
+
+#: ../main.cc:416
+msgid "Copyright (C) 1999-2006 Paul Davis"
+msgstr ""
+
+#: ../main.cc:417
+msgid ""
+"Some portions Copyright (C) Steve Harris, Ari Johnson, Brett Viren, Joel "
+"Baker"
+msgstr ""
+"Vissa delar Copyright (C) Steve Harris, Ari Johnson, Brett Viren, Joel "
+"Baker"
+
+#: ../main.cc:419
+msgid "Ardour comes with ABSOLUTELY NO WARRANTY"
+msgstr ""
+
+#: ../main.cc:420
+msgid "not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
+msgstr ""
+
+#: ../main.cc:421
+msgid "This is free software, and you are welcome to redistribute it "
+msgstr ""
+
+#: ../main.cc:422
+msgid "under certain conditions; see the source for copying conditions."
+msgstr ""
+
+#: ../main.cc:431
+msgid "could not create ARDOUR GUI"
+msgstr "kunde inte skapa ARDOUR GUI"
+
+#: ../main.cc:449
+msgid "Could not connect to JACK server as  \"%1\""
+msgstr "Kunde inte ansluta till JACK-servern som \"%1\""
+
+#: ../main.cc:452
+msgid "could not initialize Ardour."
+msgstr "kunde inte initialisera Ardour."
+
+#: ../marker.cc:244
+msgid "MarkerText"
+msgstr "MarkörText"
+
+#: ../marker_time_axis.cc:253
+msgid "Remove Marker"
+msgstr "Ta bort markör"
+
+#: ../marker_time_axis.cc:255
+msgid "Marker"
+msgstr "Markör"
+
+#: ../meter_bridge.cc:77
+msgid "ardour: meter bridge"
+msgstr "ardour: taktartsbrygga"
+
+#: ../meter_bridge.cc:78
+msgid "ardour_meter_bridge"
+msgstr ""
+
+#: ../meter_bridge_strip.cc:79 ../meter_bridge_strip.cc:93
+#, c-format
+msgid "# of %u-sample overs"
+msgstr "# %u-samplings-över"
+
+#: ../meter_bridge_strip.cc:221
+msgid "New Name for Meter:"
+msgstr "Nytt namn för taktart"
+
+#: ../mixer_strip.cc:94 ../mixer_strip.cc:140 ../mixer_strip.cc:1227
+msgid "pre"
+msgstr "för"
+
+#: ../mixer_strip.cc:95 ../mixer_strip.cc:822
+msgid "Comments"
+msgstr "Kommentarer"
+
+#: ../mixer_strip.cc:118
+msgid "Input"
+msgstr "Ingång"
+
+#: ../mixer_strip.cc:136 ../mixer_strip.cc:1223
+msgid "input"
+msgstr "ingång"
+
+#: ../mixer_strip.cc:144 ../mixer_strip.cc:1231
+msgid "post"
+msgstr "efter"
+
+#. TRANSLATORS: this string should be longest of the strings
+#. used to describe meter points. In english, its "input".
+#.
+#: ../mixer_strip.cc:152
+msgid "tupni"
+msgstr "gnågni"
+
+#: ../mixer_strip.cc:207
+msgid "Varispeed"
+msgstr "variabel hastighet"
+
+#: ../mixer_strip.cc:233 ../mixer_strip.cc:836
+msgid "Click to Add/Edit Comments"
+msgstr "Klicka för att lägga till/redigera kommentarer"
+
+#: ../mixer_strip.cc:374
+msgid "unknown strip width \"%1\" in XML GUI information"
+msgstr "okänd strip-bredd \"%1\" i XML-GUI-informationen"
+
+#: ../mixer_strip.cc:417
+msgid "record"
+msgstr "spela in"
+
+#: ../mixer_strip.cc:418 ../region_editor.cc:46
+msgid "mute"
+msgstr "tysta"
+
+#: ../mixer_strip.cc:419
+msgid "solo"
+msgstr ""
+
+#: ../mixer_strip.cc:422
+msgid "comments"
+msgstr "kommentarer"
+
+#: ../mixer_strip.cc:424
+msgid "*comments*"
+msgstr "*kommentarer*"
+
+#: ../mixer_strip.cc:438
+msgid "Rec"
+msgstr "Spela in"
+
+#: ../mixer_strip.cc:439
+msgid "M"
+msgstr ""
+
+#: ../mixer_strip.cc:440
+msgid "S"
+msgstr ""
+
+#: ../mixer_strip.cc:443 ../mixer_strip.cc:830
+msgid "Cmt"
+msgstr "Kmt"
+
+#: ../mixer_strip.cc:445 ../mixer_strip.cc:828
+msgid "*Cmt*"
+msgstr "*Kmt*"
+
+#: ../mixer_strip.cc:483 ../mixer_strip.cc:549 ../redirect_box.cc:1005
+msgid "Not connected to JACK - no I/O changes are possible"
+msgstr "Inte ansluten till JACK - in/ut-ändringar är inte möjliga"
+
+#: ../mixer_strip.cc:560
+msgid "Track"
+msgstr "Spår"
+
+#: ../mixer_strip.cc:588 ../mixer_strip.cc:604
+msgid "could not register new ports required for that connection"
+msgstr "kunde inte registrera nya porter nödvändiga för anslutningen"
+
+#: ../mixer_strip.cc:747
+msgid " Input"
+msgstr " Ingång"
+
+#: ../mixer_strip.cc:750
+msgid "I"
+msgstr ""
+
+#: ../mixer_strip.cc:820
+msgid "*Comments*"
+msgstr "*Kommentarer"
+
+#: ../mixer_strip.cc:859
+msgid ": comment editor"
+msgstr ""
+
+#: ../mixer_strip.cc:953
+msgid "Grp"
+msgstr ""
+
+#: ../mixer_strip.cc:956
+msgid "~G"
+msgstr ""
+
+#: ../mixer_strip.cc:1004
+msgid "Invert Polarity"
+msgstr "Invertera polaritet"
+
+#: ../mixer_ui.cc:84
+msgid "Strips"
+msgstr "Remsor"
+
+#: ../mixer_ui.cc:109
+msgid "Group"
+msgstr "Grupp"
+
+#: ../mixer_ui.cc:210 ../mixer_ui.cc:369
+msgid "ardour: mixer"
+msgstr ""
+
+#: ../mixer_ui.cc:211
+msgid "ardour_mixer"
+msgstr ""
+
+#: ../mixer_ui.cc:345
+msgid "ardour: mixer: "
+msgstr ""
+
+#: ../mixer_ui.cc:572
+msgid "signal"
+msgstr ""
+
+#: ../mixer_ui.cc:722
+msgid "track display list item for renamed strip not found!"
+msgstr "hittade inte spårvisningslisteobjekt för omdöpt remsor!"
+
+#: ../new_session_dialog.cc:39
+msgid "New Session Name :"
+msgstr "Sessionens namn:"
+
+#: gtk2_ardour/new_session_dialog.cc:70
+msgid "Name :"
+msgstr "Namn:"
+
+#: gtk2_ardour/new_session_dialog.cc:79
+msgid "Create Folder In :"
+msgstr "Skapa katalog i:"
+
+#: gtk2_ardour/new_session_dialog.cc:72
+msgid "Template :"
+msgstr "Använd mall:"
+
+#: ../new_session_dialog.cc:45
+msgid "Channel Count"
+msgstr "Antal kanaler"
+
+#: ../new_session_dialog.cc:46
+msgid "Create Monitor Bus"
+msgstr "Skapa medhörningsbuss"
+
+#: ../new_session_dialog.cc:53
+msgid "Create Master Bus"
+msgstr "Skapa master-buss"
+
+#: ../new_session_dialog.cc:55
+msgid "Automatically Connect Inputs"
+msgstr "Anslut automatiskt ingångar"
+
+#: gtk2_ardour/new_session_dialog.cc:84 gtk2_ardour/new_session_dialog.cc:97
+msgid "Use only"
+msgstr "Använd endast"
+
+#: gtk2_ardour/new_session_dialog.cc:105
+msgid "... to Master Bus"
+msgstr "...till Master-bussen"
+
+#: gtk2_ardour/new_session_dialog.cc:106
+msgid "... to Physical Outputs"
+msgstr "...till fysiska utgångar"
+
+
+#: ../new_session_dialog.cc:56 ../new_session_dialog.cc:67
+msgid "Port Limit"
+msgstr "Portgräns"
+
+#: ../new_session_dialog.cc:64
+msgid "<b>Track/Bus Inputs</b>"
+msgstr "<b>Spår/bussingångar</b>"
+
+#: ../new_session_dialog.cc:66
+msgid "Automatically Connect Outputs"
+msgstr "Anslut automatiskt utgångar"
+
+#: ../new_session_dialog.cc:75
+msgid "Connect to Master Bus"
+msgstr "Anslut till master-bussen"
+
+#: gtk2_ardour/new_session_dialog.cc:83
+msgid "Automatically Connect to Physical Inputs"
+msgstr "Anslut automatiskt till fysiska utgångar"
+
+#: ../new_session_dialog.cc:80
+msgid "<b>Track/Bus Outputs</b>"
+msgstr "<b>Spår/bussutgångar</b>"
+
+#: ../new_session_dialog.cc:83
+msgid "Advanced Options"
+msgstr "Avancerade inställningar"
+
+#: gtk2_ardour/new_session_dialog.cc:66
+msgid "<b>Busses</b>"
+msgstr "<b>Bussar</b>"
+
+#: gtk2_ardour/new_session_dialog.cc:67
+msgid "<b>Inputs</b>"
+msgstr "<b>Ingångar</b>"
+
+#: gtk2_ardour/new_session_dialog.cc:68
+msgid "<b>Outputs</b>"
+msgstr "<b>Utgångar</b>"
+
+
+#: gtk2_ardour/new_session_dialog.cc:120
+msgid "Recent:"
+msgstr "Tidigare:"
+
+#: gtk2_ardour/new_session_dialog.cc:157
+msgid "Browse:"
+msgstr "Bläddra:"
+
+#: ../new_session_dialog.cc:274
+msgid "New Session"
+msgstr "Ny session"
+
+#: ../new_session_dialog.cc:276
+msgid "Open Session"
+msgstr "Öppna session"
+
+#: ../new_session_dialog.cc:281
+msgid "ardour: session control"
+msgstr "ardour: session"
+
+#: ../new_session_dialog.cc:305
+msgid "select template"
+msgstr "välj mall"
+
+#: ../new_session_dialog.cc:311
+msgid "select session file"
+msgstr "välj sessionsfil"
+
+#: ../new_session_dialog.cc:320
+msgid "select directory"
+msgstr "välj katalog"
+
+#: ../option_editor.cc:75
+msgid "SMPTE offset is negative"
+msgstr "SMPTE-förskjutning är negativ"
+
+#: ../option_editor.cc:101
+msgid "ardour: options editor"
+msgstr "ardour: inställningar"
+
+#: ../option_editor.cc:102
+msgid "ardour_option_editor"
+msgstr ""
+
+#: ../option_editor.cc:126
+msgid "Paths/Files"
+msgstr "Sökvägar/filer"
+
+#: ../option_editor.cc:127
+msgid "Kbd/Mouse"
+msgstr "Tangentbord/mus"
+
+#: ../option_editor.cc:130
+msgid "Layers & Fades"
+msgstr "Lager & Toningar"
+
+#: ../option_editor.cc:134
+msgid "MIDI"
+msgstr ""
+
+#: ../option_editor.cc:176
+msgid "24 FPS"
+msgstr ""
+
+#: ../option_editor.cc:178
+msgid "25 FPS"
+msgstr ""
+
+#: ../option_editor.cc:180
+msgid "30 FPS"
+msgstr ""
+
+#: ../option_editor.cc:186
+msgid "30 FPS drop"
+msgstr "30 FPS-drop"
+
+#: ../option_editor.cc:243
+msgid "session RAID path"
+msgstr "Sessionens RAID-sökväg"
+
+#: ../option_editor.cc:248
+msgid "Soundfile Search Paths"
+msgstr "Sökvägar för ljudfiler"
+
+#: ../option_editor.cc:253
+msgid "Paths"
+msgstr "Sökvägar"
+
+#: ../option_editor.cc:267 ../option_editor.cc:273 ../option_editor.cc:722
+#: ../option_editor.cc:749
+msgid "internal"
+msgstr "intern"
+
+#: ../option_editor.cc:286
+msgid "Short crossfade length (msecs)"
+msgstr "Kort övertonings längd (msek)"
+
+#: ../option_editor.cc:298
+msgid "Destructive crossfade length (msecs)"
+msgstr "Destruktiv övertonings längd (msek)"
+
+#: ../option_editor.cc:366
+msgid "SMPTE Frames/second"
+msgstr "SMPTE-Frames/sekund"
+
+#: ../option_editor.cc:367
+msgid "SMPTE Offset"
+msgstr "SMPTE-förskjutning"
+
+#: ../option_editor.cc:461 ../option_editor.cc:468 ../option_editor.cc:471
+#: ../option_editor.cc:617
+msgid "online"
+msgstr "ansluten"
+
+#. remember, we have to handle the i18n case where the relative
+#. lengths of the strings in language N is different than in english.
+#.
+#: ../option_editor.cc:468 ../option_editor.cc:469 ../option_editor.cc:614
+msgid "offline"
+msgstr "frånkopplad"
+
+#: ../option_editor.cc:669
+msgid "Choose Click"
+msgstr "Välj klick"
+
+#: ../option_editor.cc:688
+msgid "Choose Click Emphasis"
+msgstr "Välj klickbetoning"
+
+#: ../option_editor.cc:802
+msgid "Click audio file"
+msgstr "Klickljudfil"
+
+#: ../option_editor.cc:808
+msgid "Click emphasis audiofile"
+msgstr "Betoningsljudfil"
+
+#: ../option_editor.cc:845
+msgid ""
+"The auditioner is a dedicated mixer strip used\n"
+"for listening to specific regions outside the context\n"
+"of the overall mix. It can be connected just like any\n"
+"other mixer strip."
+msgstr ""
+"Avlyssnaren är en dedikerad mixerremsa som används\n"
+"för att lyssna på specifika regioner utanför den\n"
+"generalla mixen. Den kan anslutas precis som vilken\n"
+"annan mixerremsa."
+
+#: ../option_editor.cc:918
+msgid "Edit using"
+msgstr "Redigera med"
+
+#: ../option_editor.cc:925 ../option_editor.cc:952
+msgid "+ button"
+msgstr "+ musknapp"
+
+#: ../option_editor.cc:945
+msgid "Delete using"
+msgstr "Radera med"
+
+#: ../option_editor.cc:972
+msgid "Ignore snap using"
+msgstr "Ignorera fästläge med"
+
+#: ../opts.cc:46
+msgid "Usage: "
+msgstr "Användning: "
+
+#: ../opts.cc:47
+msgid "  -v, --version                    Show version information\n"
+msgstr "  -v, --version                    Visa versionsinformation\n"
+
+#: ../opts.cc:48
+msgid "  -h, --help                       Print this message\n"
+msgstr "  -h, --help                       Visa detta meddelande\n"
+
+#: ../opts.cc:49
+msgid ""
+"  -b, --bindings                   Print all possible keyboard binding "
+"names\n"
+msgstr ""
+"  -b, --bindings                   Visa alla möjliga kortkommandonamn\n"
+
+#: ../opts.cc:50
+msgid "  -n, --show-splash                Show splash screen\n"
+msgstr "  -n, --show-splash                Visa splash-bilden\n"
+
+#: ../opts.cc:51
+msgid ""
+"  -c, --name  name                 Use a specific jack client name, default "
+"is ardour\n"
+msgstr ""
+"  -c, --name  name                 Använd ett specifikt jack-klientnamn, "
+"standard är ardour\n"
+
+#: ../opts.cc:52
+msgid ""
+"  -N, --new session-name           Create a new session from the command "
+"line\n"
+msgstr ""
+"  -N, --new session-name           Skapa en ny session från kammando- "
+"prompten\n"
+
+#: ../opts.cc:53
+msgid ""
+"  -o, --use-hw-optimizations        Try to use h/w specific optimizations\n"
+msgstr ""
+"  -o, --use-hw-optimizations        Försök använda hårdvaruspecifik optimering\n"
+
+#: ../opts.cc:55
+msgid "  -V, --novst                      Do not use VST support\n"
+msgstr "  -V, --novst                      Slå av VST-stödet\n"
+
+#: ../opts.cc:57
+msgid "  [session-name]                   Name of session to load\n"
+msgstr "  [session-name]                   Namn för sessionen som ska laddas\n"
+
+#: ../opts.cc:58
+msgid "  -C, --curvetest filename         Curve algorithm debugger\n"
+msgstr ""
+
+#: ../opts.cc:59
+msgid "  -g, --gtktheme                   Allow GTK to load a theme\n"
+msgstr " -g, --gtktheme                   Tillåt GTK att ladda ett tema\n"    
+
+#: ../pan_automation_time_axis.cc:59
+msgid "You can't graphically edit panning of more than stream"
+msgstr "Du kan inte grafiskt redigera panorering för mer en än en ström"
+
+#: ../pan_automation_time_axis.cc:79
+msgid "add pan automation event"
+msgstr "lägg till panoreringsautomatiseringshändelse"
+
+#: ../panner2d.cc:588 ../panner_ui.cc:434 ../plugin_ui.cc:833
+msgid "Bypass"
+msgstr "Förbigå"
+
+#: ../panner_ui.cc:57 ../panner_ui.cc:224
+msgid "link"
+msgstr "länka"
+
+#: ../panner_ui.cc:68
+msgid "Pan automation mode"
+msgstr "panoreringsautomatiseringsläge"
+
+#: ../panner_ui.cc:69
+msgid "Pan automation type"
+msgstr "panoreringsuatomtiseringstyp"
+
+#: ../panner_ui.cc:80
+msgid "panning link control"
+msgstr "kontroll för panoreringslänkning"
+
+#: ../panner_ui.cc:82
+msgid "panning link direction"
+msgstr "riktning för panoreringslänkning"
+
+#: ../panner_ui.cc:234
+msgid "L"
+msgstr "V"
+
+#: ../panner_ui.cc:334
+#, c-format
+msgid "panner for channel %lu"
+msgstr ""
+
+#: ../panner_ui.cc:336
+#, c-format
+msgid "panner for channel %u"
+msgstr "panorering för kanal %u"
+
+#: ../panner_ui.cc:444
+msgid "Reset all"
+msgstr "Nollställ alla"
+
+#: ../playlist_selector.cc:51
+msgid "ardour: playlists"
+msgstr "ardour: spellistor"
+
+#: ../playlist_selector.cc:58
+msgid "Playlists grouped by track"
+msgstr "Spellista grupperad utifrån spår"
+
+#: ../playlist_selector.cc:97
+msgid "ardour: playlist for "
+msgstr "ardour: spellista för "
+
+#: ../playlist_selector.cc:113
+msgid "Other tracks"
+msgstr "Andra spår"
+
+#: ../playlist_selector.cc:129
+msgid "unassigned"
+msgstr "otilldelad"
+
+#: ../plugin_selector.cc:42
+msgid "ardour: plugins"
+msgstr "ardour: insticksprogram"
+
+#: ../plugin_selector.cc:55
+msgid "Available LADSPA Plugins"
+msgstr "Tillgängliga LADSPA-insticksprogram"
+
+#: ../plugin_selector.cc:56
+msgid "Type"
+msgstr "Typ"
+
+#: ../plugin_selector.cc:57 ../plugin_selector.cc:80
+msgid "# Inputs"
+msgstr "# Ingångar"
+
+#: ../plugin_selector.cc:58 ../plugin_selector.cc:81
+msgid "# Outputs"
+msgstr "# Utångar"
+
+#: ../plugin_selector.cc:67
+msgid "Plugins to be Connected to Insert"
+msgstr "Insticksprogram att anslutas till Anslutningspunkt"
+
+#: ../plugin_selector.cc:79
+msgid "Available plugins"
+msgstr "Tillgänliga insticksprogram"
+
+#: ../plugin_selector.cc:97
+msgid "Add a plugin to the effect list"
+msgstr "Lägg till ett insticksprogram till effektlistan"
+
+#: ../plugin_selector.cc:101
+msgid "Remove a plugin from the effect list"
+msgstr "Ta bort ett insticksprogram från effektlistan"
+
+#: ../plugin_selector.cc:103
+msgid "Update available plugins"
+msgstr "Uppdatera tillgängliga insticksprogram"
+
+#: ../plugin_selector.cc:125
+msgid "LADSPA"
+msgstr ""
+
+#: ../plugin_selector.cc:128
+msgid "VST"
+msgstr ""
+
+#: ../plugin_ui.cc:83
+msgid ""
+"unknown type of editor-supplying plugin (note: no VST support in this "
+"version of ardour)"
+msgstr ""
+"okänd typ av editor-levererande insticksprogram (N.B.: inget VST-stöd i "
+"denna version av ardour)"
+
+#: ../plugin_ui.cc:138
+msgid "<span size=\"large\">Presets</span>"
+msgstr "<span size=\"large\">Förinställningar</span>"
+
+#: ../plugin_ui.cc:229
+msgid "Controls"
+msgstr "Kontroller"
+
+#: ../plugin_ui.cc:266
+msgid "Plugin Editor: could not build control element for port %1"
+msgstr ""
+"Insticksprogramsredigerare: kunde inte bygga kontrollelement för port%1"
+
+#: ../plugin_ui.cc:357
+msgid "Automation control"
+msgstr "Automatiseringskontroll"
+
+#: ../plugin_ui.cc:853
+msgid "Plugin preset %1 not found"
+msgstr "Insticksprogram-förinställning %1 hittades inte"
+
+#: ../plugin_ui.cc:863
+msgid "Name of New Preset:"
+msgstr "Namn för insticksprogramsinställningar:"
+
+#: ../redirect_automation_line.cc:53
+msgid "redirect automation created for non-plugin"
+msgstr "omdirigera automatisering skapa för icke-insticksprogram"
+
+#: ../redirect_automation_time_axis.cc:93
+msgid "add automation event to "
+msgstr "lägg till automatiseringshändelse till"
+
+#: ../redirect_box.cc:222
+msgid "New send"
+msgstr "Ny Sänd"
+
+#: ../redirect_box.cc:223
+msgid "Show send controls"
+msgstr "msgstr Visa Sändkontroller"
+
+#: ../redirect_box.cc:382
+msgid ""
+"You attempted to add a plugin (%1).\n"
+"The plugin has %2 inputs\n"
+"but at the insertion point, there are\n"
+"%3 active signal streams.\n"
+"\n"
+"This makes no sense - you are throwing away\n"
+"part of the signal."
+msgstr ""
+"Du försökte lägga till ett insticksprogram (%1).\n"
+"Det har %2 ingångar\n"
+"men vid punkten det infogades finns bara\n"
+"%3 aktiva signalströmmar.\n"
+"\n"
+"Detta är orimligt - du slängers bort\n"
+"en del av signalen."
+
+#: ../redirect_box.cc:394
+msgid ""
+"You attempted to add a plugin (%1).\n"
+"The plugin has %2 inputs\n"
+"but at the insertion point there are\n"
+"only %3 active signal streams.\n"
+"\n"
+"This makes no sense - unless the plugin supports\n"
+"side-chain inputs. A future version of Ardour will\n"
+"support this type of configuration."
+msgstr ""
+"Du försökte lägga till ett insticksprogram (%1).\n"
+"Det har %2 ingångar\n"
+"men vid punkten det infogades finns bara\n"
+"%3 aktiva signalströmmar.\n"
+"\n"
+"Detta är orimligt - förutom om insticksprogrammet\n"
+"stödjer sidokedjeingångar. Framtida versioner av\n"
+"Ardour kommer att stödja detta."
+
+#: ../redirect_box.cc:407
+msgid ""
+"You attempted to add a plugin (%1).\n"
+"\n"
+"The I/O configuration doesn't make sense:\n"
+"\n"
+"The plugin has %2 inputs and %3 outputs.\n"
+"The track/bus has %4 inputs and %5 outputs.\n"
+"The insertion point, has %6 active signals.\n"
+"\n"
+"Ardour does not understand what to do in such situations.\n"
+msgstr ""
+"Du försökte lägga till ett insticksprogram (%1).\n"
+"\n"
+"In/Ut-konfigurationen är orimlig:\n"
+"\n"
+"Insticksprogrammet har %2 ingångar och %3 ut.\n"
+"Spåret/bussen har %4 ingångar och %5 ut.\n"
+"Infogningspunkten har %6 aktiva signaler.\n"
+"\n"
+"Ardour förstår inte vad det ska göra i sådana situationer.\n"
+
+#: ../redirect_box.cc:494
+msgid "Pre-fader inserts, sends & plugins:"
+msgstr "För-nivåreglage-anslutningspunkter, sändningar & insticksprogram:"
+
+#: ../redirect_box.cc:497
+msgid "Post-fader inserts, sends & plugins:"
+msgstr "Efter-nivåreglage-anslutningspunkter, sändningar & insticksprogram:"
+
+#: ../redirect_box.cc:643
+msgid ""
+"You cannot reorder this set of redirects\n"
+"in that way because the inputs and\n"
+"outputs do not work correctly."
+msgstr ""
+"Du kan inte omarrangera dessa omdirigeringar\n"
+"på det sättet eftersom ingångar och\n"
+"utgångarna inte fungerar korrekt."
+
+#: ../redirect_box.cc:748
+msgid "rename redirect"
+msgstr "döp om omdirigering"
+
+#: ../redirect_box.cc:825 ../redirect_box.cc:873
+msgid ""
+"Copying the set of redirects on the clipboard failed,\n"
+"probably because the I/O configuration of the plugins\n"
+"could not match the configuration of this track."
+msgstr ""
+"Kopieringen av omdirigeringarna på klippbordet misslyckades,\n"
+"förmodligen på grund av att I/O-konfiguration av insticksprogrammen\n"
+"inte kunde matcha konfiurationen av detta spåret."
+
+#: ../redirect_box.cc:895
+msgid ""
+"Do you really want to remove all redirects from this track?\n"
+"(this cannot be undone)"
+msgstr ""
+"Vill du verkligen radera alla omdirigeringar från detta spåret?\n"
+"(detta kan inte ångras)"
+
+#: ../redirect_box.cc:898
+msgid ""
+"Do you really want to remove all redirects from this bus?\n"
+"(this cannot be undone)"
+msgstr ""
+"Vill du verkligen radera alla omdirigeringar från denna bussen?\n"
+"(detta kan inte ångras)"
+
+#: ../redirect_box.cc:903
+msgid "Yes, remove them all"
+msgstr "Ja, ta bort alla"
+
+#: ../redirect_box.cc:939
+msgid "ardour: %1"
+msgstr ""
+
+#: ../redirect_box.cc:981
+msgid "ardour: %1: %2 (by %3)"
+msgstr "ardour: %1: %2 (av %3)"
+
+#. new stuff
+#: ../redirect_box.cc:1053
+msgid "New Plugin ..."
+msgstr "Nytt Insticksprogram..."
+
+#: ../redirect_box.cc:1054
+msgid "New Insert"
+msgstr "Ny Anslutningspunkt"
+
+#: ../redirect_box.cc:1055
+msgid "New Send ..."
+msgstr "Ny Sänd..."
+
+#: ../redirect_box.cc:1067
+msgid "Deselect All"
+msgstr "Avmarkera allt"
+
+#: ../redirect_box.cc:1074
+msgid "Activate all"
+msgstr "Aktivera alla"
+
+#: ../redirect_box.cc:1075
+msgid "Deactivate all"
+msgstr "Aktivera alla"
+
+#: ../region_editor.cc:44
+msgid "NAME:"
+msgstr "NAMN:"
+
+#: ../region_editor.cc:45
+msgid "lock"
+msgstr "lås"
+
+#: ../region_editor.cc:47
+msgid "opaque"
+msgstr "ogenomskinlig"
+
+#: ../region_editor.cc:48 ../region_editor.cc:191 ../region_editor.cc:225
+msgid "active"
+msgstr "aktivt"
+
+#: ../region_editor.cc:49
+msgid "visible"
+msgstr "synligt"
+
+#: ../region_editor.cc:52
+msgid "Layer"
+msgstr "Lager"
+
+#: ../region_editor.cc:53
+msgid "play"
+msgstr "spela"
+
+#: ../region_editor.cc:60
+msgid "ENVELOPE"
+msgstr "KONVOLUT"
+
+#: ../region_editor.cc:106
+msgid "mute this region"
+msgstr "tysta denna region"
+
+#: ../region_editor.cc:107
+msgid "regions underneath this one cannot be heard"
+msgstr "regoner under denna kan inte höras"
+
+#: ../region_editor.cc:108
+msgid "prevent any changes to this region"
+msgstr "förhindra ändringar för denna region"
+
+#: ../region_editor.cc:109
+msgid "use the gain envelope during playback"
+msgstr "använd volymkonvolutet under uppspelning"
+
+#: ../region_editor.cc:110
+msgid "show the gain envelope"
+msgstr "visa volymkonvolutet"
+
+#: ../region_editor.cc:111
+msgid "use fade in curve during playback"
+msgstr "använd intoningskurvan under uppspelning"
+
+#: ../region_editor.cc:112
+msgid "use fade out curve during playback"
+msgstr "använd uttoningskurvan under uppspelning"
+
+#: ../region_editor.cc:113
+msgid "audition this region"
+msgstr "avlyssna denna region"
+
+#: ../region_editor.cc:146
+msgid "START:"
+msgstr ""
+
+#: ../region_editor.cc:148
+msgid "END:"
+msgstr "SLUT:"
+
+#: ../region_editor.cc:150
+msgid "LENGTH:"
+msgstr "LÄNGD:"
+
+#: ../region_editor.cc:190
+msgid "FADE IN"
+msgstr "TONA IN"
+
+#: ../region_editor.cc:192 ../region_editor.cc:226
+msgid "msecs"
+msgstr ""
+
+#: ../region_editor.cc:224
+msgid "FADE OUT"
+msgstr "TONA UT"
+
+#: ../region_editor.cc:264
+msgid "ardour: region "
+msgstr ""
+
+#: ../region_editor.cc:401
+msgid "fade in edit"
+msgstr "intoningsredigering"
+
+#: ../region_editor.cc:413
+msgid "fade out edit"
+msgstr "uttoningsredigering"
+
+#: ../regionview.cc:1144
+msgid "add gain control point"
+msgstr "lägg till volymkontrollspunkt"
+
+#: ../route_params_ui.cc:88
+msgid "Tracks/Buses"
+msgstr "Spår/Bussar"
+
+#: ../route_params_ui.cc:108
+msgid "Pre-fader Redirects"
+msgstr "För-omdirigeringar"
+
+#: ../route_params_ui.cc:109
+msgid "Post-fader Redirects"
+msgstr "Efter-omdirigeringar"
+
+#: ../route_params_ui.cc:143
+msgid "ardour: track/bus inspector"
+msgstr "ardour: spår/buss-inspektör"
+
+#: ../route_params_ui.cc:144
+msgid "ardour_route_parameters"
+msgstr ""
+
+#: ../route_params_ui.cc:201
+msgid "route display list item for renamed route not found!"
+msgstr "ruttvisningslisteobjekt för omdöpt rutt hittades inte!"
+
+#: ../route_params_ui.cc:452
+msgid "NO TRACK"
+msgstr "INGET SPÅR"
+
+#: ../route_params_ui.cc:694
+msgid "ardour: track/bus inspector: "
+msgstr "ardour: spår/buss-inspektör"
+
+#: ../route_params_ui.cc:698
+msgid "No Route Selected"
+msgstr "Ingen Rutt Vald"
+
+#: ../route_params_ui.cc:699
+msgid "ardour: track/bus/inspector: no route selected"
+msgstr "ardour: spår/buss-inspektör: ingen rutt vald"
+
+#. ctrl-shift-click applies change to all routes
+#: ../route_ui.cc:133
+msgid "mute change"
+msgstr "ändra tystning"
+
+#. ctrl-shift-click applies change to all routes
+#. ctrl-alt-click: exclusively solo this track, not a toggle */
+#: ../route_ui.cc:208 ../route_ui.cc:218
+msgid "solo change"
+msgstr "ändra solo"
+
+#: ../route_ui.cc:281
+msgid "rec-enable change"
+msgstr "ändra inspelningsläge"
+
+#: ../route_ui.cc:472
+msgid "Solo-safe"
+msgstr "Solo-säker"
+
+#: ../route_ui.cc:480 ../route_ui.cc:523
+msgid "MIDI Bind"
+msgstr "MIDI-bindning"
+
+#: ../route_ui.cc:494
+msgid "Pre Fader"
+msgstr "Före-nivåreglage"
+
+#: ../route_ui.cc:501
+msgid "Post Fader"
+msgstr "Efter-nivåreglage"
+
+#: ../route_ui.cc:508
+msgid "Control Outs"
+msgstr "Kontrollutgångar"
+
+#: ../route_ui.cc:515
+msgid "Main Outs"
+msgstr "Huvudutgångar"
+
+#: ../route_ui.cc:552
+msgid "mix group solo  change"
+msgstr "mixgrupp-solo-ändring"
+
+#: ../route_ui.cc:586
+msgid "mix group mute change"
+msgstr "mixgrupp-tystnings-ändring"
+
+#: ../route_ui.cc:602
+msgid "mix group rec-enable change"
+msgstr "mixgrupp-inspelningsmöjliggörning-ändring"
+
+#: ../route_ui.cc:619 ../visual_time_axis.cc:236
+msgid "ardour: color selection"
+msgstr "ardour: färgval"
+
+#: ../route_ui.cc:695
+msgid ""
+"Do you really want to remove track \"%1\" ?\n"
+"\n"
+"You may also lose the playlist used by this track.\n"
+"(cannot be undone)"
+msgstr ""
+"Vill du verkligen ta bort spår \"%1\" ?\n"
+"Du kanske också förlorar spellista använd av detta spår.\n"
+"(detta kan inte ångras)"
+
+#: ../route_ui.cc:697
+msgid ""
+"Do you really want to remove bus \"%1\" ?\n"
+"(cannot be undone)"
+msgstr ""
+"Vill du verkligen ta bort buss \"%1\" ?\n"
+"(detta kan inte ångras)"
+
+#: ../route_ui.cc:701 ../visual_time_axis.cc:278
+msgid "Yes, remove it."
+msgstr "Ja, ta bort den."
+
+#: ../route_ui.cc:730
+msgid "New Name: "
+msgstr "Nytt namn: "
+
+#: ../sfdb_ui.cc:57
+msgid "Add Field..."
+msgstr "Lägg till fält..."
+
+#: ../sfdb_ui.cc:58
+msgid "Remove Field"
+msgstr "Ta bort fält"
+
+#: ../sfdb_ui.cc:61
+msgid "Soundfile Info"
+msgstr "Ljudfilsinformation"
+
+#: ../sfdb_ui.cc:79
+msgid "Field"
+msgstr "Fält"
+
+#: ../sfdb_ui.cc:80
+msgid "Value"
+msgstr "Värde"
+
+#: ../sfdb_ui.cc:160
+msgid "channels"
+msgstr "kanal(er)"
+
+#: ../sfdb_ui.cc:160
+msgid "samplerate"
+msgstr "samplingsfrekvens"
+
+#: ../sfdb_ui.cc:161
+msgid "resolution"
+msgstr "upplösning"
+
+#: ../sfdb_ui.cc:161
+msgid "format"
+msgstr "format"
+
+#: ../sfdb_ui.cc:182
+msgid "Could not read file: %1 (%2)."
+msgstr "Kunde inte läsa fil: %1 (%2)."
+
+#: ../sfdb_ui.cc:198
+msgid "Could not access soundfile: "
+msgstr "Dela kanaler"
+
+#: ../sfdb_ui.cc:235
+msgid "Name for Field"
+msgstr "Ange namn för fält"
+
+#: ../sfdb_ui.cc:334
+msgid "Split Channels"
+msgstr "Dela kanaler"
+
+#: ../sfdb_ui.cc:341
+msgid "Create a region for each channel"
+msgstr "Skapa en region för varje kanal"
+
+#: ../sfdb_ui.cc:343
+msgid "Embed"
+msgstr "Infoga"
+
+#: ../sfdb_ui.cc:345
+msgid "Link to an external file"
+msgstr "Länka till en extern fil"
+
+#: ../sfdb_ui.cc:347
+msgid "Import"
+msgstr "Importera"
+
+#: ../sfdb_ui.cc:349
+msgid "Copy a file to the session folder"
+msgstr "Kopiera en fil till sessionskatalogen"
+
+#: ../sfdb_ui.cc:413
+msgid "programming error: %1"
+msgstr ""
+
+#: ../tempo_dialog.cc:17 ../tempo_dialog.cc:34
+msgid "Beats per minute"
+msgstr "Slag per minut"
+
+#: ../tempo_dialog.cc:20 ../tempo_dialog.cc:37 ../tempo_dialog.cc:202
+#: ../tempo_dialog.cc:220
+msgid "Bar"
+msgstr "Takt"
+
+#: ../tempo_dialog.cc:21 ../tempo_dialog.cc:38 ../tempo_dialog.cc:203
+#: ../tempo_dialog.cc:221
+msgid "Beat"
+msgstr "Slag"
+
+#: ../tempo_dialog.cc:23 ../tempo_dialog.cc:40 ../tempo_dialog.cc:204
+#: ../tempo_dialog.cc:222
+msgid "Location"
+msgstr "Plats"
+
+#: ../tempo_dialog.cc:198 ../tempo_dialog.cc:216
+msgid "Meter denominator"
+msgstr "Taktartsnämnare"
+
+#: ../tempo_dialog.cc:199 ../tempo_dialog.cc:217
+msgid "Beats per bar"
+msgstr "Slag per takt"
+
+#: ../tempo_dialog.cc:235 ../tempo_dialog.cc:246
+msgid "whole (1)"
+msgstr "hel (1)"
+
+#: ../tempo_dialog.cc:236 ../tempo_dialog.cc:248
+msgid "second (2)"
+msgstr "sekond (2)"
+
+#: ../tempo_dialog.cc:237 ../tempo_dialog.cc:250
+msgid "third (3)"
+msgstr "ters (3)"
+
+#: ../tempo_dialog.cc:238 ../tempo_dialog.cc:252 ../tempo_dialog.cc:260
+msgid "quarter (4)"
+msgstr "kvart (4)"
+
+#: ../tempo_dialog.cc:239 ../tempo_dialog.cc:254
+msgid "eighth (8)"
+msgstr "åttondel (8)"
+
+#: ../tempo_dialog.cc:240 ../tempo_dialog.cc:256
+msgid "sixteenth (16)"
+msgstr "sextondel (16)"
+
+#: ../tempo_dialog.cc:241 ../tempo_dialog.cc:258
+msgid "thirty-second (32)"
+msgstr "trettiotvåondel (32)"
+
+#: ../tempo_dialog.cc:419
+msgid "garbaged note type entry (%1)"
+msgstr "skräpad nottypsvärde (%1)"
+
+#: ../tempo_dialog.cc:429
+msgid "incomprehensible note type entry (%1)"
+msgstr "orimlig nottypsvärde (%1)"
+
+#: ../time_axis_view.cc:111
+msgid "gTortnam"
+msgstr ""
+
+#: ../time_axis_view.cc:548
+msgid "Largest"
+msgstr "Störst"
+
+#: ../time_axis_view.cc:549
+msgid "Large"
+msgstr "Större"
+
+#: ../time_axis_view.cc:550
+msgid "Larger"
+msgstr "Stor"
+
+#: ../time_axis_view.cc:552
+msgid "Smaller"
+msgstr "Mindre"
+
+#: ../time_axis_view.cc:553
+msgid "Small"
+msgstr "Liten"
+
+#: ../time_axis_view.cc:869
+msgid "unknown track height name \"%1\" in XML GUI information"
+msgstr "okänt spårhöjdsnamn \"%1\" i XML-GUI-informationen"
+
+#. first constructed item sets up font info
+#: ../time_axis_view_item.cc:78
+msgid "TimeAxisViewItemName"
+msgstr ""
+
+#: ../time_axis_view_item.cc:297
+msgid "new duration %1 frames is out of bounds for %2"
+msgstr "ny varaktighet %1 frames är utom räckvidd för %2"
+
+#: ../time_selection.cc:40
+msgid "programming error: request for non-existent audio range (%1)!"
+msgstr ""
+
+#: ../utils.cc:106 ../utils.cc:149
+msgid "bad XPM header %1"
+msgstr ""
+
+#: ../utils.cc:331
+msgid "missing RGBA style for \"%1\""
+msgstr "saknar RGBA-stil för \"%1\""
+
+#: ../visual_time_axis.cc:275
+msgid ""
+"Do you really want to remove track \"%1\" ?\n"
+"(cannot be undone)"
+msgstr ""
+"Vill du verkligen ta bort spår \"%1\" ?\n"
+"(detta kan inte ångras)"
+
+
+#: ../visual_time_axis.cc:324
+msgid "new name: "
+msgstr "nytt namn: "
+
+#: ../visual_time_axis.cc:335
+msgid "A track already exists with that name"
+msgstr "Ett spår med det namnet existerar redan"
index 716f0b86d0dd1adc5c2d7c1a932b6315bff8a4b5..6039e089e943ab22cd6eb3735716a312d63b515f 100644 (file)
@@ -16,6 +16,7 @@
 #include "editing.h"
 #include "keyboard_target.h"
 #include "canvas.h"
+#include "selection.h"
 
 namespace ARDOUR {
        class Session;
@@ -54,7 +55,7 @@ class ImageFrameView;
 class ImageFrameTimeAxis;
 class MarkerView;
 
-class PublicEditor : public Gtk::Window, public PBD::StatefulDestructible {
+class PublicEditor : public Gtk::Window, public PBD::StatefulThingWithGoingAway {
   public:
        PublicEditor();
        virtual ~PublicEditor();
@@ -86,7 +87,6 @@ class PublicEditor : public Gtk::Window, public PBD::StatefulDestructible {
        virtual void new_region_from_selection () = 0;
        virtual void separate_region_from_selection () = 0;
        virtual void toggle_playback (bool with_abort) = 0;
-       virtual void set_edit_menu (Gtk::Menu&) = 0;
        virtual nframes_t unit_to_frame (double unit) = 0;
        virtual double frame_to_unit (nframes_t frame) = 0;
        virtual double frame_to_unit (double frame) = 0;
@@ -111,8 +111,10 @@ class PublicEditor : public Gtk::Window, public PBD::StatefulDestructible {
        virtual void new_playlists () = 0;
        virtual void copy_playlists () = 0;
        virtual void clear_playlists () = 0;
+       virtual bool set_selected_track (TimeAxisView&, Selection::Operation op = Selection::Set, bool no_remove = false) = 0;
        virtual void set_selected_mixer_strip (TimeAxisView&) = 0;
        virtual void hide_track_in_display (TimeAxisView& tv) = 0;
+       virtual void show_track_in_display (TimeAxisView& tv) = 0;
        virtual void set_follow_playhead (bool yn) = 0;
        virtual void toggle_follow_playhead () = 0;
        virtual bool follow_playhead() const = 0;
index 35b96a410f136a6513e5d14d31f1c90cbb77bc1c..f2ee2a5b8fe8be751e86c8d9093350ed6bfed6d5 100644 (file)
@@ -923,7 +923,7 @@ RedirectBox::edit_redirect (boost::shared_ptr<Redirect> redirect)
        
        if ((insert = boost::dynamic_pointer_cast<Insert> (redirect)) == 0) {
                
-               /* its a send */
+               /* it's a send */
                
                if (!_session.engine().connected()) {
                        return;
@@ -967,30 +967,21 @@ RedirectBox::edit_redirect (boost::shared_ptr<Redirect> redirect)
                                PluginUIWindow *plugin_ui;
                        
                                if (plugin_insert->get_gui() == 0) {
-                               
-                                       string title;
-                                       string maker = plugin_insert->plugin()->maker();
-                                       string::size_type email_pos;
-                               
-                                       if ((email_pos = maker.find_first_of ('<')) != string::npos) {
-                                               maker = maker.substr (0, email_pos - 1);
-                                       }
-                               
-                                       if (maker.length() > 32) {
-                                               maker = maker.substr (0, 32);
-                                               maker += " ...";
-                                       }
-
-                                       title = string_compose(_("ardour: %1: %2 (by %3)"), _route->name(), plugin_insert->name(), maker);      
-                               
+                                                               
                                        plugin_ui = new PluginUIWindow (plugin_insert);
+
                                        if (_owner_is_mixer) {
                                                ARDOUR_UI::instance()->the_mixer()->ensure_float (*plugin_ui);
                                        } else {
                                                ARDOUR_UI::instance()->the_editor().ensure_float (*plugin_ui);
                                        }
-                                       plugin_ui->set_title (title);
+
+                                       plugin_ui->set_title (generate_redirect_title (plugin_insert));
                                        plugin_insert->set_gui (plugin_ui);
+                                       
+                                       // change window title when route name is changed
+                                       _route->name_changed.connect (bind (mem_fun(*this, &RedirectBox::route_name_changed), plugin_ui, plugin_insert));
+                                       
                                
                                } else {
                                        plugin_ui = reinterpret_cast<PluginUIWindow *> (plugin_insert->get_gui());
@@ -1069,8 +1060,12 @@ RedirectBox::register_actions ()
 
        /* new stuff */
        ActionManager::register_action (popup_act_grp, X_("newplugin"), _("New Plugin ..."),  sigc::ptr_fun (RedirectBox::rb_choose_plugin));
-       ActionManager::register_action (popup_act_grp, X_("newinsert"), _("New Insert"),  sigc::ptr_fun (RedirectBox::rb_choose_insert));
-       ActionManager::register_action (popup_act_grp, X_("newsend"), _("New Send ..."),  sigc::ptr_fun (RedirectBox::rb_choose_send));
+
+       act = ActionManager::register_action (popup_act_grp, X_("newinsert"), _("New Insert"),  sigc::ptr_fun (RedirectBox::rb_choose_insert));
+       ActionManager::jack_sensitive_actions.push_back (act);
+       act = ActionManager::register_action (popup_act_grp, X_("newsend"), _("New Send ..."),  sigc::ptr_fun (RedirectBox::rb_choose_send));
+       ActionManager::jack_sensitive_actions.push_back (act);
+
        ActionManager::register_action (popup_act_grp, X_("clear"), _("Clear"),  sigc::ptr_fun (RedirectBox::rb_clear));
 
        /* standard editing stuff */
@@ -1097,6 +1092,8 @@ RedirectBox::register_actions ()
        ActionManager::plugin_selection_sensitive_actions.push_back(act);
 
        ActionManager::add_action_group (popup_act_grp);
+
+
 }
 
 void
@@ -1242,3 +1239,29 @@ RedirectBox::rb_edit ()
        _current_redirect_box->for_selected_redirects (&RedirectBox::edit_redirect);
 }
 
+void
+RedirectBox::route_name_changed (void* src, PluginUIWindow* plugin_ui, boost::shared_ptr<PluginInsert> pi)
+{
+       ENSURE_GUI_THREAD(bind (mem_fun (*this, &RedirectBox::route_name_changed), src, plugin_ui, pi));
+       
+       plugin_ui->set_title (generate_redirect_title (pi));
+}
+
+string 
+RedirectBox::generate_redirect_title (boost::shared_ptr<PluginInsert> pi)
+{
+       string maker = pi->plugin()->maker();
+       string::size_type email_pos;
+
+       if ((email_pos = maker.find_first_of ('<')) != string::npos) {
+               maker = maker.substr (0, email_pos - 1);
+       }
+
+       if (maker.length() > 32) {
+               maker = maker.substr (0, 32);
+               maker += " ...";
+       }
+
+       return string_compose(_("ardour: %1: %2 (by %3)"), _route->name(), pi->name(), maker);  
+}
+
index ead3b0dfb814dbfd4391671649184c39f877f800..27ba950899ee450b28e4a6fb224b007c63a17b82 100644 (file)
 
 class MotionController;
 class PluginSelector;
+class PluginUIWindow;
 class RouteRedirectSelection;
 
 namespace ARDOUR {
+       class Connection;
+       class Insert;
+       class Plugin;
+       class PluginInsert;
+       class PortInsert;
        class Route;
        class Send;
-       class Insert;
        class Session;
-       class PortInsert;
-       class Connection;
-       class Plugin;
 }
 
-
 class RedirectBox : public Gtk::HBox
 {
   public:
@@ -217,6 +218,9 @@ class RedirectBox : public Gtk::HBox
        static void rb_activate_all ();
        static void rb_deactivate_all ();
        static void rb_edit ();
+       
+       void route_name_changed (void* src, PluginUIWindow* plugin_ui, boost::shared_ptr<ARDOUR::PluginInsert> pi);
+       std::string generate_redirect_title (boost::shared_ptr<ARDOUR::PluginInsert> pi);
 };
 
 #endif /* __ardour_gtk_redirect_box__ */
index 467f24bd947264192f8149e7a87d6a995cb0d478..3374d44655eb56a88bcc7fdfc5d53f9934f4a6a4 100644 (file)
@@ -50,7 +50,7 @@ AudioRegionGainLine::start_drag (ControlPoint* cp, float fraction)
        if (!rv.audio_region()->envelope_active()) {
                 trackview.session().add_command(new MementoCommand<AudioRegion>(*(rv.audio_region().get()), &rv.audio_region()->get_state(), 0));
                 rv.audio_region()->set_envelope_active(false);
-       }
+       } 
 }
 
 // This is an extended copy from AutomationList
@@ -62,18 +62,18 @@ AudioRegionGainLine::remove_point (ControlPoint& cp)
        model_representation (cp, mr);
 
        trackview.editor.current_session()->begin_reversible_command (_("remove control point"));
-        XMLNode &before = get_state();
+        XMLNode &before = alist.get_state();
 
        if (!rv.audio_region()->envelope_active()) {
-                XMLNode &before = rv.audio_region()->get_state();
+                XMLNode &region_before = rv.audio_region()->get_state();
                rv.audio_region()->set_envelope_active(true);
-                XMLNode &after = rv.audio_region()->get_state();
-                trackview.session().add_command(new MementoCommand<AudioRegion>(*(rv.audio_region().get()), &before, &after));
-       }
-
+                XMLNode &region_after = rv.audio_region()->get_state();
+                trackview.session().add_command(new MementoCommand<AudioRegion>(*(rv.audio_region().get()), &region_before, &region_after));
+       } 
+       
        alist.erase (mr.start, mr.end);
 
-       trackview.editor.current_session()->add_command (new MementoCommand<AudioRegionGainLine>(*this, &before, &get_state()));
+       trackview.editor.current_session()->add_command (new MementoCommand<AutomationList>(alist, &before, &alist.get_state()));
        trackview.editor.current_session()->commit_reversible_command ();
        trackview.editor.current_session()->set_dirty ();
 }
@@ -84,14 +84,8 @@ AudioRegionGainLine::end_drag (ControlPoint* cp)
        if (!rv.audio_region()->envelope_active()) {
                rv.audio_region()->set_envelope_active(true);
                 trackview.session().add_command(new MementoCommand<AudioRegion>(*(rv.audio_region().get()), 0, &rv.audio_region()->get_state()));
-       }
+       } 
+
        AutomationLine::end_drag(cp);
 }
 
-
-// This is a copy from AutomationList
-UndoAction
-AudioRegionGainLine::get_memento ()
-{
-       return alist.get_memento();
-}
index d887021a4285f86f715ff10c262d2094a14d3974..a418b1de23623944edcdc4f08fa74c7bcc9f645e 100644 (file)
@@ -79,23 +79,19 @@ RegionSelection::clear_all()
 {
        clear();
        _bylayer.clear();
+       _current_start = 0;
+       _current_end = 0;
 }
 
 bool RegionSelection::contains (RegionView* rv)
 {
-       if (this->find (rv) != end()) {
-               return true;
-       }
-       else {
-               return false;
-       }
-       
+       return this->find (rv) != end();
 }
 
 void
 RegionSelection::add (RegionView* rv, bool dosort)
 {
-       if (this->find (rv) != end()) {
+       if (contains (rv)) {
                /* we already have it */
                return;
        }
index 3fe756360243fd8ba74e1c9fecc9ca9801144379..49e7872f498bf759114272ca2ac2d0ce4b5b762e 100644 (file)
@@ -149,8 +149,6 @@ RegionView::~RegionView ()
 {
        in_destructor = true;
 
-       RegionViewGoingAway (this); /* EMIT_SIGNAL */
-
        for (vector<GhostRegion*>::iterator g = ghosts.begin(); g != ghosts.end(); ++g) {
                delete *g;
        }
@@ -407,6 +405,7 @@ RegionView::region_renamed ()
 
        set_item_name (str, this);
        set_name_text (str);
+       reset_width_dependent_items (_pixel_width);
 }
 
 void
index eb96791d2846595dd5c32b4ea82372ba4ac88ac0..7195c83a998356a54cbf24f4c9d625722bbe1041 100644 (file)
@@ -40,6 +40,7 @@
 #include <gtkmm2ext/utils.h>
 
 #include <ardour/playlist.h>
+#include <ardour/audioplaylist.h>
 #include <ardour/diskstream.h>
 #include <ardour/insert.h>
 #include <ardour/ladspa_plugin.h>
@@ -116,7 +117,8 @@ RouteTimeAxisView::RouteTimeAxisView (PublicEditor& ed, Session& sess, boost::sh
        visual_button.set_name ("TrackVisualButton");
        hide_button.set_name ("TrackRemoveButton");
 
-       hide_button.add (*(manage (new Image (get_xpm("small_x.xpm")))));
+       hide_button.add (*(manage (new Image (::get_icon("hide")))));
+       hide_button.show_all ();
 
        edit_group_button.signal_button_release_event().connect (mem_fun(*this, &RouteTimeAxisView::edit_click), false);
        playlist_button.signal_clicked().connect (mem_fun(*this, &RouteTimeAxisView::playlist_click));
@@ -125,13 +127,26 @@ RouteTimeAxisView::RouteTimeAxisView (PublicEditor& ed, Session& sess, boost::sh
        visual_button.signal_clicked().connect (mem_fun(*this, &RouteTimeAxisView::visual_click));
        hide_button.signal_clicked().connect (mem_fun(*this, &RouteTimeAxisView::hide_click));
 
-       solo_button->signal_button_press_event().connect (mem_fun(*this, &RouteUI::solo_press), false);
-       solo_button->signal_button_release_event().connect (mem_fun(*this, &RouteUI::solo_release), false);
-       mute_button->signal_button_press_event().connect (mem_fun(*this, &RouteUI::mute_press), false);
-       mute_button->signal_button_release_event().connect (mem_fun(*this, &RouteUI::mute_release), false);
+       solo_button->signal_button_press_event().connect (mem_fun(*this, &RouteUI::solo_press));
+       solo_button->signal_button_release_event().connect (mem_fun(*this, &RouteUI::solo_release));
+       mute_button->signal_button_press_event().connect (mem_fun(*this, &RouteUI::mute_press));
+       mute_button->signal_button_release_event().connect (mem_fun(*this, &RouteUI::mute_release));
 
        if (is_track()) {
-               rec_enable_button->set_active (false);
+
+               /* use icon */
+
+               rec_enable_button->remove ();
+               switch (track()->mode()) {
+               case ARDOUR::Normal:
+                       rec_enable_button->add (*(manage (new Image (::get_icon (X_("record_normal_red"))))));
+                       break;
+               case ARDOUR::Destructive:
+                       rec_enable_button->add (*(manage (new Image (::get_icon (X_("record_tape_red"))))));
+                       break;
+               }
+               rec_enable_button->show_all ();
+
                rec_enable_button->set_name ("TrackRecordEnableButton");
                rec_enable_button->signal_button_press_event().connect (mem_fun(*this, &RouteUI::rec_enable_press));
                controls_table.attach (*rec_enable_button, 5, 6, 0, 1, Gtk::FILL|Gtk::EXPAND, Gtk::FILL|Gtk::EXPAND, 0, 0);
@@ -192,6 +207,7 @@ RouteTimeAxisView::RouteTimeAxisView (PublicEditor& ed, Session& sess, boost::sh
 
        if (is_track()) {
 
+               track()->TrackModeChanged.connect (mem_fun(*this, &RouteTimeAxisView::track_mode_changed));
                track()->FreezeChange.connect (mem_fun(*this, &RouteTimeAxisView::map_frozen));
                track()->DiskstreamChanged.connect (mem_fun(*this, &RouteTimeAxisView::diskstream_changed));
                get_diskstream()->SpeedChanged.connect (mem_fun(*this, &RouteTimeAxisView::speed_changed));
@@ -286,8 +302,6 @@ RouteTimeAxisView::add_edit_group_menu_item (RouteGroup *eg, RadioMenuItem::Grou
 
        MenuList &items = edit_group_menu.items();
 
-       cerr << "adding edit group " << eg->name() << endl;
-
        items.push_back (RadioMenuElem (*group, eg->name(), bind (mem_fun(*this, &RouteTimeAxisView::set_edit_group_from_menu), eg)));
        if (_route->edit_group() == eg) {
                static_cast<RadioMenuItem*>(&items.back())->set_active ();
@@ -296,18 +310,10 @@ RouteTimeAxisView::add_edit_group_menu_item (RouteGroup *eg, RadioMenuItem::Grou
 
 void
 RouteTimeAxisView::set_edit_group_from_menu (RouteGroup *eg)
-
 {
        _route->set_edit_group (eg, this);
 }
 
-void
-RouteTimeAxisView::playlist_state_changed (Change ignored)
-{
-       // ENSURE_GUI_THREAD (bind (mem_fun(*this, &RouteTimeAxisView::playlist_state_changed), ignored));
-       // why are we here ?
-}
-
 void
 RouteTimeAxisView::playlist_changed ()
 
@@ -352,13 +358,15 @@ RouteTimeAxisView::playlist_click ()
 {
        // always build a new action menu
        
-       if (playlist_action_menu == 0) {
-               playlist_action_menu = new Menu;
-               playlist_action_menu->set_name ("ArdourContextMenu");
-       }
-       
-       build_playlist_menu(playlist_action_menu);
+       if (playlist_action_menu != 0) {
+               delete playlist_action_menu;
+       } 
 
+       playlist_action_menu = new Menu;
+       playlist_action_menu->set_name ("ArdourContextMenu");
+       
+       build_playlist_menu (playlist_action_menu);
+       editor.set_selected_track (*this, Selection::Add);
        playlist_action_menu->popup (1, 0);
 }
 
@@ -371,6 +379,7 @@ RouteTimeAxisView::automation_click ()
                */
                build_display_menu ();
        }
+       editor.set_selected_track (*this, Selection::Add);
        automation_action_menu->popup (1, 0);
 }
 
@@ -453,6 +462,24 @@ RouteTimeAxisView::build_display_menu ()
 
                get_diskstream()->AlignmentStyleChanged.connect (
                        mem_fun(*this, &RouteTimeAxisView::align_style_changed));
+
+               RadioMenuItem::Group mode_group;
+               items.push_back (RadioMenuElem (mode_group, _("Normal mode"),
+                                               bind (mem_fun (*this, &RouteTimeAxisView::set_track_mode), ARDOUR::Normal)));
+               normal_track_mode_item = dynamic_cast<RadioMenuItem*>(&items.back());
+               items.push_back (RadioMenuElem (mode_group, _("Tape mode"),
+                                               bind (mem_fun (*this, &RouteTimeAxisView::set_track_mode), ARDOUR::Destructive)));
+               destructive_track_mode_item = dynamic_cast<RadioMenuItem*>(&items.back());
+                                
+               
+               switch (track()->mode()) {
+               case ARDOUR::Destructive:
+                       destructive_track_mode_item->set_active ();
+                       break;
+               case ARDOUR::Normal:
+                       normal_track_mode_item->set_active ();
+                       break;
+               }
        }
 
        items.push_back (SeparatorElem());
@@ -464,6 +491,91 @@ RouteTimeAxisView::build_display_menu ()
        items.push_back (MenuElem (_("Remove"), mem_fun(*this, &RouteUI::remove_this_route)));
 }
 
+static bool __reset_item (RadioMenuItem* item)
+{
+       cerr << "reset item to true\n";
+       item->set_active ();
+       return false;
+}
+
+void
+RouteTimeAxisView::set_track_mode (TrackMode mode)
+{
+       RadioMenuItem* item;
+       RadioMenuItem* other_item;
+
+       switch (mode) {
+       case ARDOUR::Normal:
+               item = normal_track_mode_item;
+               other_item = destructive_track_mode_item;
+               break;
+       case ARDOUR::Destructive:
+               item = destructive_track_mode_item;
+               other_item = normal_track_mode_item;
+               break;
+       default:
+               fatal << string_compose (_("programming error: %1 %2"), "illegal track mode in RouteTimeAxisView::set_track_mode", mode) << endmsg;
+               /*NOTREACHED*/
+               return;
+       }
+
+       if (item->get_active () && track()->mode() != mode) {
+               _set_track_mode (track(), mode, other_item);
+       }
+}
+
+void
+RouteTimeAxisView::_set_track_mode (Track* track, TrackMode mode, RadioMenuItem* reset_item)
+{
+       bool needs_bounce;
+
+       if (!track->can_use_mode (mode, needs_bounce)) {
+
+               if (!needs_bounce) {
+                       /* cannot be done */
+                       Glib::signal_idle().connect (bind (sigc::ptr_fun (__reset_item), reset_item));
+                       return;
+               } else {
+                       cerr << "would bounce this one\n";
+                       return;
+               }
+       }
+
+       track->set_mode (mode);
+
+       rec_enable_button->remove ();
+       switch (mode) {
+       case ARDOUR::Normal:
+               rec_enable_button->add (*(manage (new Image (::get_icon (X_("record_normal_red"))))));
+               break;
+       case ARDOUR::Destructive:
+               rec_enable_button->add (*(manage (new Image (::get_icon (X_("record_tape_red"))))));
+               break;
+       }
+       rec_enable_button->show_all ();
+
+}
+
+void
+RouteTimeAxisView::track_mode_changed ()
+{
+       RadioMenuItem* item;
+       
+       switch (track()->mode()) {
+       case ARDOUR::Normal:
+               item = normal_track_mode_item;
+               break;
+       case ARDOUR::Destructive:
+               item = destructive_track_mode_item;
+               break;
+       default:
+               fatal << string_compose (_("programming error: %1 %2"), "illegal track mode in RouteTimeAxisView::set_track_mode", track()->mode()) << endmsg;
+               /*NOTREACHED*/
+               return;
+       }
+
+       item->set_active ();
+}
 
 void
 RouteTimeAxisView::show_timestretch (nframes_t start, nframes_t end)
@@ -710,7 +822,24 @@ RouteTimeAxisView::align_style_changed ()
 void
 RouteTimeAxisView::set_align_style (AlignStyle style)
 {
-       get_diskstream()->set_align_style (style);
+       RadioMenuItem* item;
+
+       switch (style) {
+       case ExistingMaterial:
+               item = align_existing_item;
+               break;
+       case CaptureTime:
+               item = align_capture_item;
+               break;
+       default:
+               fatal << string_compose (_("programming error: %1 %2"), "illegal align style in RouteTimeAxisView::set_align_style", style) << endmsg;
+               /*NOTREACHED*/
+               return;
+       }
+
+       if (item->get_active()) {
+               get_diskstream()->set_align_style (style);
+       }
 }
 
 void
@@ -782,7 +911,7 @@ RouteTimeAxisView::use_copy_playlist (bool prompt)
 
        if (name.length()) {
                ds->use_copy_playlist ();
-               pl->set_name (name);
+               ds->playlist()->set_name (name);
        }
 }
 
@@ -809,7 +938,7 @@ RouteTimeAxisView::use_new_playlist (bool prompt)
                prompter.set_initial_text (name);
                prompter.add_button (Gtk::Stock::NEW, Gtk::RESPONSE_ACCEPT);
                prompter.set_response_sensitive (Gtk::RESPONSE_ACCEPT, false);
-               
+
                switch (prompter.run ()) {
                case Gtk::RESPONSE_ACCEPT:
                        prompter.get_result (name);
@@ -822,7 +951,7 @@ RouteTimeAxisView::use_new_playlist (bool prompt)
 
        if (name.length()) {
                ds->use_new_playlist ();
-               pl->set_name (name);
+               ds->playlist()->set_name (name);
        }
 }
 
@@ -879,6 +1008,10 @@ RouteTimeAxisView::selection_click (GdkEventButton* ev)
        case Selection::Extend:
                /* not defined yet */
                break;
+
+       case Selection::Add:
+               editor.get_selection().add (*tracks);
+               break;
        }
 
        delete tracks;
@@ -998,7 +1131,12 @@ RouteTimeAxisView::visual_click ()
 void
 RouteTimeAxisView::hide_click ()
 {
+       // LAME fix for hide_button refresh fix
+       hide_button.set_sensitive(false);
+       
        editor.hide_track_in_display (*this);
+       
+       hide_button.set_sensitive(true);
 }
 
 boost::shared_ptr<Region>
@@ -1124,12 +1262,28 @@ RouteTimeAxisView::build_playlist_menu (Gtk::Menu * menu)
        if (playlist_menu) {
                delete playlist_menu;
        }
+
        playlist_menu = new Menu;
        playlist_menu->set_name ("ArdourContextMenu");
 
-       playlist_items.push_back (MenuElem (string_compose (_("Current: %1"), get_diskstream()->playlist()->name())));
-       playlist_items.push_back (SeparatorElem());
+       vector<Playlist*> playlists;
+       boost::shared_ptr<Diskstream> ds = get_diskstream();
+       RadioMenuItem::Group playlist_group;
+
+       _session.get_playlists (playlists);
        
+       for (vector<Playlist*>::iterator i = playlists.begin(); i != playlists.end(); ++i) {
+
+               if ((*i)->get_orig_diskstream_id() == ds->id()) {
+                       playlist_items.push_back (RadioMenuElem (playlist_group, (*i)->name(), bind (mem_fun (*this, &RouteTimeAxisView::use_playlist), (*i))));
+
+                       if (ds->playlist()->id() == (*i)->id()) {
+                               static_cast<RadioMenuItem*>(&playlist_items.back())->set_active();
+                       }
+               }
+       }
+
+       playlist_items.push_back (SeparatorElem());
        playlist_items.push_back (MenuElem (_("Rename"), mem_fun(*this, &RouteTimeAxisView::rename_current_playlist)));
        playlist_items.push_back (SeparatorElem());
 
@@ -1138,8 +1292,20 @@ RouteTimeAxisView::build_playlist_menu (Gtk::Menu * menu)
        playlist_items.push_back (SeparatorElem());
        playlist_items.push_back (MenuElem (_("Clear Current"), mem_fun(editor, &PublicEditor::clear_playlists)));
        playlist_items.push_back (SeparatorElem());
-       playlist_items.push_back (MenuElem(_("Select"), mem_fun(*this, &RouteTimeAxisView::show_playlist_selector)));
 
+       playlist_items.push_back (MenuElem(_("Select from all ..."), mem_fun(*this, &RouteTimeAxisView::show_playlist_selector)));
+}
+
+void
+RouteTimeAxisView::use_playlist (Playlist* pl)
+{
+       AudioPlaylist* apl = dynamic_cast<AudioPlaylist*> (pl);
+       
+       assert (is_track());
+
+       if (apl) {
+               get_diskstream()->use_playlist (apl);
+       }
 }
 
 void
index 1eb0cea00babbb6c6af1408de341edcbd3c7ad67..cefe954c9a5c31b9a762a43d92941253ec378f1c 100644 (file)
@@ -134,14 +134,6 @@ protected:
        
        gint edit_click  (GdkEventButton *);
 
-       void build_redirect_window ();
-       void redirect_click ();
-       void redirect_add ();
-       void redirect_remove ();
-       void redirect_edit ();
-       void redirect_relist ();
-       void redirect_row_selected (gint row, gint col, GdkEvent *ev);
-       void add_to_redirect_display (ARDOUR::Redirect *);
        void redirects_changed (void *);
        
        void add_redirect_to_subplugin_menu (boost::shared_ptr<ARDOUR::Redirect>);
@@ -164,14 +156,10 @@ protected:
        
        void reset_redirect_automation_curves ();
 
-       void update_automation_view (ARDOUR::AutomationType);
-       
        void take_name_changed (void *);
        void route_name_changed (void *);
        void name_entry_changed ();
 
-       void on_area_realize ();
-
        virtual void label_view ();
        
        void add_edit_group_menu_item (ARDOUR::RouteGroup *, Gtk::RadioMenuItem::Group*);
@@ -192,10 +180,8 @@ protected:
        void         playlist_click ();
        void         show_playlist_selector ();
        void         playlist_changed ();
-       void         playlist_state_changed (ARDOUR::Change);
        void         playlist_modified ();
 
-       void add_playlist_to_playlist_menu (ARDOUR::Playlist*);
        void rename_current_playlist ();
        
        void         automation_click ();
@@ -207,7 +193,6 @@ protected:
 
        void visual_click ();
        void hide_click ();
-       gint when_displayed (GdkEventAny*);
 
        void speed_changed ();
        
@@ -238,12 +223,20 @@ protected:
        Gtk::Menu           edit_group_menu;
        Gtk::RadioMenuItem* align_existing_item;
        Gtk::RadioMenuItem* align_capture_item;
+       Gtk::RadioMenuItem* normal_track_mode_item;
+       Gtk::RadioMenuItem* destructive_track_mode_item;
        Gtk::Menu*          playlist_menu;
        Gtk::Menu*          playlist_action_menu;
        Gtk::MenuItem*      playlist_item;
 
+       void use_playlist (ARDOUR::Playlist*);
+
        ArdourCanvas::SimpleRect* timestretch_rect;
-       
+
+       void set_track_mode (ARDOUR::TrackMode);
+       void _set_track_mode (ARDOUR::Track* track, ARDOUR::TrackMode mode, Gtk::RadioMenuItem* reset_item);
+       void track_mode_changed ();
+
        list<RedirectAutomationInfo*>   redirect_automation;
        vector<RedirectAutomationLine*> redirect_automation_curves;
 
index dc861fbbbb8cfead3bdc9ca6cf7ba2bac06d85f3..851c45aaa0234aeae87d77035ef600cd57551da4 100644 (file)
@@ -36,6 +36,8 @@
 #include "gui_thread.h"
 
 #include <ardour/route.h>
+#include <ardour/session.h>
+#include <ardour/audioengine.h>
 #include <ardour/audio_track.h>
 #include <ardour/audio_diskstream.h>
 #include <ardour/midi_track.h>
@@ -72,8 +74,15 @@ RouteUI::RouteUI (boost::shared_ptr<ARDOUR::Route> rt, ARDOUR::Session& sess, co
 
        _route->active_changed.connect (mem_fun (*this, &RouteUI::route_active_changed));
 
-        mute_button = manage (new BindableToggleButton (_route->mute_control(), m_name ));
-        solo_button = manage (new BindableToggleButton (_route->solo_control(), s_name ));
+       mute_button = manage (new BindableToggleButton (_route->mute_control(), m_name ));
+       solo_button = manage (new BindableToggleButton (_route->solo_control(), s_name ));
+
+       // mute_button->unset_flags (Gtk::CAN_FOCUS);
+       // solo_button->unset_flags (Gtk::CAN_FOCUS);
+
+       _route->mute_changed.connect (mem_fun(*this, &RouteUI::mute_changed));
+       _route->solo_changed.connect (mem_fun(*this, &RouteUI::solo_changed));
+       _route->solo_safe_changed.connect (mem_fun(*this, &RouteUI::solo_changed));
        
        if (is_track()) {
                boost::shared_ptr<Track> t = boost::dynamic_pointer_cast<Track>(_route);
@@ -83,7 +92,6 @@ RouteUI::RouteUI (boost::shared_ptr<ARDOUR::Route> rt, ARDOUR::Session& sess, co
                _session.RecordStateChanged.connect (mem_fun (*this, &RouteUI::session_rec_enable_changed));
 
                rec_enable_button = manage (new BindableToggleButton (t->rec_enable_control(), r_name ));
-
                rec_enable_button->unset_flags (Gtk::CAN_FOCUS);
                
                update_rec_display ();
@@ -114,7 +122,7 @@ RouteUI::mute_press(GdkEventButton* ev)
                                build_mute_menu();
                        }
 
-                       mute_menu->popup(0,0);
+                       mute_menu->popup(0,ev->time);
 
                } else {
 
@@ -124,6 +132,8 @@ RouteUI::mute_press(GdkEventButton* ev)
                                
                                if (!Keyboard::modifier_state_equals (ev->state, Keyboard::ModifierMask (Keyboard::Control))) {
                                        wait_for_release = true;
+                               } else {
+                                       return false;
                                }
                        }
 
@@ -189,7 +199,7 @@ RouteUI::solo_press(GdkEventButton* ev)
                                build_solo_menu ();
                        }
 
-                       solo_menu->popup (1, 0);
+                       solo_menu->popup (1, ev->time);
 
                } else {
 
@@ -200,6 +210,8 @@ RouteUI::solo_press(GdkEventButton* ev)
                                
                                if (!Keyboard::modifier_state_equals (ev->state, Keyboard::ModifierMask (Keyboard::Control))) {
                                        wait_for_release = true;
+                               } else {
+                                       return false;
                                }
                        }
 
@@ -277,6 +289,12 @@ RouteUI::solo_release(GdkEventButton* ev)
 bool
 RouteUI::rec_enable_press(GdkEventButton* ev)
 {
+       if (!_session.engine().connected()) {
+               MessageDialog msg (_("Not connected to JACK - cannot engage record"));
+               msg.run ();
+               return true;
+       }
+
        if (!ignore_toggle && is_track() && rec_enable_button) {
 
                if (ev->button == 2 && Keyboard::modifier_state_equals (ev->state, Keyboard::Control)) {
@@ -489,7 +507,7 @@ RouteUI::build_solo_menu (void)
        items.push_back (CheckMenuElem(*check));
        check->show_all();
 
-       items.push_back (SeparatorElem());
+       //items.push_back (SeparatorElem());
        // items.push_back (MenuElem (_("MIDI Bind"), mem_fun (*mute_button, &BindableToggleButton::midi_learn)));
        
 }
@@ -532,7 +550,7 @@ RouteUI::build_mute_menu(void)
        items.push_back (CheckMenuElem(*check));
        check->show_all();
 
-       items.push_back (SeparatorElem());
+       //items.push_back (SeparatorElem());
        // items.push_back (MenuElem (_("MIDI Bind"), mem_fun (*mute_button, &BindableToggleButton::midi_learn)));
 }
 
index eace2c6c2afe9d53a417e3f70cbd3854810798bb..bad47ac274393a0691ccf36a1ba94575e59b73ae 100644 (file)
@@ -156,8 +156,6 @@ class RouteUI : public virtual AxisView
 
        void reversibly_apply_route_boolean (string name, void (ARDOUR::Route::*func)(bool, void*), bool, void *);
        void reversibly_apply_track_boolean (string name, void (ARDOUR::Track::*func)(bool, void*), bool, void *);
-
-       sigc::signal<void> GoingAway;
 };
 
 #endif /* __ardour_route_ui__ */
index a1b1ae0da37a3ee3590d77d2229395899bab352b..c4336fba21bbf62746fcd4a6ac122b608c166125 100644 (file)
@@ -56,6 +56,7 @@ class Selection : public sigc::trackable
 
        enum Operation {
                Set,
+               Add,
                Toggle,
                Extend
        };
index 67084eb6a091b6eb4baa1bfdd752cca5d1100ee0..c4d6d7edfcbfa7a9fe92824204bcb422bb7ff727 100644 (file)
@@ -74,6 +74,7 @@ SoundFileBox::SoundFileBox ()
        main_box.pack_start(format, false, false);
        main_box.pack_start(channels, false, false);
        main_box.pack_start(samplerate, false, false);
+       main_box.pack_start(timecode, false, false);
        main_box.pack_start(field_view, true, true);
        main_box.pack_start(top_box, false, false);
        main_box.pack_start(bottom_box, false, false);
@@ -129,21 +130,25 @@ SoundFileBox::setup_labels (string filename)
        path = filename;
 
        string error_msg;
+
        if(!AudioFileSource::get_soundfile_info (filename, sf_info, error_msg)) {
                return false;
        }
 
        length.set_alignment (0.0f, 0.0f);
-       length.set_text (string_compose("Length: %1", PBD::length2string(sf_info.length, sf_info.samplerate)));
+       length.set_text (string_compose(_("Length: %1"), PBD::length2string(sf_info.length, sf_info.samplerate)));
 
        format.set_alignment (0.0f, 0.0f);
        format.set_text (sf_info.format_name);
 
        channels.set_alignment (0.0f, 0.0f);
-       channels.set_text (string_compose("Channels: %1", sf_info.channels));
+       channels.set_text (string_compose(_("Channels: %1"), sf_info.channels));
 
        samplerate.set_alignment (0.0f, 0.0f);
-       samplerate.set_text (string_compose("Samplerate: %1", sf_info.samplerate));
+       samplerate.set_text (string_compose(_("Samplerate: %1"), sf_info.samplerate));
+
+       timecode.set_alignment (0.0f, 0.0f);
+       timecode.set_text (string_compose (_("Timecode: %1"), PBD::length2string(sf_info.timecode, sf_info.samplerate)));
 
        setup_fields ();
 
@@ -190,9 +195,11 @@ SoundFileBox::play_btn_clicked ()
                return;
        }
 
-       static std::map<string, boost::shared_ptr<AudioRegion> > region_cache;
+       typedef std::map<string, boost::shared_ptr<AudioRegion> > RegionCache; 
+       static  RegionCache region_cache;
+       RegionCache::iterator the_region;
 
-       if (region_cache.find (path) == region_cache.end()) {
+       if ((the_region = region_cache.find (path)) == region_cache.end()) {
                SourceList srclist;
                boost::shared_ptr<AudioFileSource> afs;
                
@@ -211,18 +218,27 @@ SoundFileBox::play_btn_clicked ()
                        return;
                }
 
+               string rname;
+
+               _session->region_name (rname, Glib::path_get_basename(srclist[0]->name()), false);
+
                pair<string,boost::shared_ptr<AudioRegion> > newpair;
+               pair<RegionCache::iterator,bool> res;
+
+               newpair.first = path;
+               newpair.second = boost::dynamic_pointer_cast<AudioRegion> (RegionFactory::create (srclist, 0, srclist[0]->length(), rname, 0, Region::DefaultFlags, false));
 
-               _session->region_name (newpair.first, Glib::path_get_basename(srclist[0]->name()), false);
-               newpair.second = boost::dynamic_pointer_cast<AudioRegion> (RegionFactory::create (srclist, 0, srclist[0]->length(), newpair.first, 0, Region::DefaultFlags, false));
 
-               region_cache.insert (newpair);
+               res = region_cache.insert (newpair);
+               the_region = res.first;
        }
 
        play_btn.hide();
        stop_btn.show();
 
-       _session->audition_region(region_cache[path]);
+       boost::shared_ptr<Region> r = boost::static_pointer_cast<Region> (the_region->second);
+
+       _session->audition_region(r);
 }
 
 void
@@ -356,7 +372,7 @@ SoundFileOmega::SoundFileOmega (string title, ARDOUR::Session* s)
          split_check (_("Split Channels"))
 {
        if (mode_strings.empty()) {
-               mode_strings = PBD::internationalize (import_mode_strings);
+               mode_strings = I18N (import_mode_strings);
        }
 
        ARDOUR_UI::instance()->tooltips().set_tip(split_check, 
@@ -366,12 +382,12 @@ SoundFileOmega::SoundFileOmega (string title, ARDOUR::Session* s)
        ARDOUR_UI::instance()->tooltips().set_tip(*btn, 
                        _("Link to an external file"));
 
+       add_button (Gtk::Stock::CLOSE, Gtk::RESPONSE_CLOSE);
+
        btn = add_button (_("Import"), ResponseImport);
        ARDOUR_UI::instance()->tooltips().set_tip(*btn, 
                        _("Copy a file to the session folder"));
 
-       add_button (Gtk::Stock::CLOSE, Gtk::RESPONSE_CLOSE);
-
        Gtk::HBox *box = manage (new Gtk::HBox());
 
        Gtkmm2ext::set_popdown_strings (mode_combo, mode_strings);
index 8ef57d7b9f8539bce5ab024271fa01c7756435a7..d7c2c14014af4816ab58c58cefef54034b513d97 100644 (file)
@@ -77,6 +77,7 @@ class SoundFileBox : public Gtk::VBox
     Gtk::Label format;
     Gtk::Label channels;
     Gtk::Label samplerate;
+    Gtk::Label timecode;
 
     Gtk::TreeView field_view;
     Glib::RefPtr<Gtk::ListStore> fields;
index 191a9ffb544750dee70d4d46b5829d70c7c6c8b6..365cfea0d1a6a59e08d72cfc80cd6fdf4ed8c009 100644 (file)
@@ -63,7 +63,7 @@ StreamView::StreamView (RouteTimeAxisView& tv)
        canvas_rect = new ArdourCanvas::SimpleRect (*canvas_group);
        canvas_rect->property_x1() = 0.0;
        canvas_rect->property_y1() = 0.0;
-       canvas_rect->property_x2() = 1000000.0;
+       canvas_rect->property_x2() = _trackview.editor.frame_to_pixel (max_frames);
        canvas_rect->property_y2() = (double) tv.height;
        canvas_rect->property_outline_what() = (guint32) (0x1|0x2|0x8);  // outline ends and bottom 
        // (Fill/Outline colours set in derived classes)
index 2119efc722e25fbd3438ee70efa688124e946a26..ce0b6a4250386f4c1da318458ff42aec5be50fca 100644 (file)
@@ -234,7 +234,7 @@ TimeAxisView::show_at (double y, int& nth, VBox *parent)
                
                if (canvas_item_visible ((*i)->canvas_display)) {
                        ++nth;
-                       effective_height += (*i)->show_at (y + effective_height, nth, parent);
+                       effective_height += (*i)->show_at (y + 1 + effective_height, nth, parent);
                }
        }
 
@@ -286,18 +286,8 @@ TimeAxisView::controls_ebox_button_release (GdkEventButton* ev)
 void
 TimeAxisView::selection_click (GdkEventButton* ev)
 {
-       if (Keyboard::modifier_state_contains (ev->state, Keyboard::Shift)) {
-
-               if (editor.get_selection().selected (this)) {
-                       editor.get_selection().remove (this);
-               } else {
-                       editor.get_selection().add (this);
-               }
-
-       } else {
-
-               editor.get_selection().set (this);
-       }
+       Selection::Operation op = Keyboard::selection_type (ev->state);
+       editor.set_selected_track (*this, op, false);
 }
 
 void
@@ -383,8 +373,48 @@ TimeAxisView::set_height_pixels (uint32_t h)
 bool
 TimeAxisView::name_entry_key_release (GdkEventKey* ev)
 {
+       PublicEditor::TrackViewList *allviews = 0;
+       PublicEditor::TrackViewList::iterator i;
+
        switch (ev->keyval) {
+       case GDK_Escape:
+               name_entry.select_region (0,0);
+               controls_ebox.grab_focus ();
+               name_entry_changed ();
+               return true;
+
+       /* Shift+Tab Keys Pressed. Note that for Shift+Tab, GDK actually
+        * generates a different ev->keyval, rather than setting 
+        * ev->state.
+        */
+       case GDK_ISO_Left_Tab:
        case GDK_Tab:
+               name_entry_changed ();
+               allviews = editor.get_valid_views (0);
+               if (allviews != 0) {
+                       i = find (allviews->begin(), allviews->end(), this);
+                       if (ev->keyval == GDK_Tab) {
+                               if (i != allviews->end()) {
+                                       do {
+                                               if (++i == allviews->end()) { return true; }
+                                       } while((*i)->hidden());
+                               }
+                       } else {
+                               if (i != allviews->begin()) {
+                                       do {
+                                               if (--i == allviews->begin()) { return true; }
+                                       } while ((*i)->hidden());
+                               }
+                       }
+
+                       if ((*i)->height_style == Small) {
+                               (*i)->set_height(Smaller);
+                       }
+                       
+                       (*i)->name_entry.grab_focus();
+               }
+               return true;
+
        case GDK_Up:
        case GDK_Down:
                name_entry_changed ();
@@ -434,6 +464,7 @@ TimeAxisView::name_entry_focus_out (GdkEventFocus* ev)
        last_name_entry_key_press_event = 0;
        name_entry_key_timeout.disconnect ();
        name_entry.set_name ("EditorTrackNameDisplay");
+       name_entry.select_region (0,0);
        
        /* do the real stuff */
 
@@ -485,12 +516,14 @@ TimeAxisView::popup_display_menu (guint32 when)
        if (display_menu == 0) {
                build_display_menu ();
        }
+       editor.set_selected_track (*this, Selection::Add);
        display_menu->popup (1, when);  
 }
 
 gint
 TimeAxisView::size_click (GdkEventButton *ev)
 {
+       editor.set_selected_track (*this, Selection::Add);
        popup_size_menu (ev->time);
        return TRUE;
 }
index 76b237713adba8725cd99160f617e6faab8811ea..4d7c133770b1103a52c20e6192970908fc296421 100644 (file)
@@ -359,12 +359,25 @@ key_press_focus_accelerator_handler (Gtk::Window& window, GdkEventKey* ev)
        GtkWidget* focus = gtk_window_get_focus (win);
        bool special_handling_of_unmodified_accelerators = false;
 
+#undef  DEBUG_ACCELERATOR_HANDLING
+#ifdef  DEBUG_ACCELERATOR_HANDLING
+       bool debug = (getenv ("ARDOUR_DEBUG_ACCELERATOR_HANDLING") != 0);
+#endif
+
        if (focus) {
                if (GTK_IS_ENTRY(focus)) {
                        special_handling_of_unmodified_accelerators = true;
-               }
+               } 
        } 
 
+#ifdef DEBUG_ACCELERATOR_HANDLING
+       if (debug) {
+               cerr << "Key event: code = " << ev->keyval << " state = " << hex << ev->state << dec << " focus is an entry ? " 
+                    << special_handling_of_unmodified_accelerators
+                    << endl;
+       }
+#endif
+
        /* This exists to allow us to override the way GTK handles
           key events. The normal sequence is:
 
@@ -441,20 +454,40 @@ key_press_focus_accelerator_handler (Gtk::Window& window, GdkEventKey* ev)
 
                /* no special handling or modifiers in effect: accelerate first */
 
+#ifdef DEBUG_ACCELERATOR_HANDLING
+               if (debug) {
+                       cerr << "\tactivate, then propagate\n";
+               }
+#endif
                if (!gtk_window_activate_key (win, ev)) {
                        return gtk_window_propagate_key_event (win, ev);
                } else {
+#ifdef DEBUG_ACCELERATOR_HANDLING
+               if (debug) {
+                       cerr << "\tnot handled\n";
+               }
+#endif
                        return true;
                } 
        }
        
        /* no modifiers, propagate first */
        
+#ifdef DEBUG_ACCELERATOR_HANDLING
+               if (debug) {
+                       cerr << "\tactivate, then propagate\n";
+               }
+#endif
        if (!gtk_window_propagate_key_event (win, ev)) {
                return gtk_window_activate_key (win, ev);
        } 
 
 
+#ifdef DEBUG_ACCELERATOR_HANDLING
+       if (debug) {
+               cerr << "\tnot handled\n";
+       }
+#endif
        return true;
 }
 
index fc71795a7100b8bd91208352261b9e3b5bb187ba..24cafdbe67a0985b74bc3e660ab6d53c7ed11361 100644 (file)
@@ -199,7 +199,12 @@ VisualTimeAxis::visual_click()
 void
 VisualTimeAxis::hide_click()
 {
+       // LAME fix for hide_button display refresh
+       hide_button.set_sensitive(false);
+       
        editor.hide_track_in_display (*this);
+       
+       hide_button.set_sensitive(true);
 }
 
 
index 58a2bbf825e4128a652372f7cbf8900368cf8af1..98a1b362bb16d43081d113a20ab9c3a3892656c3 100644 (file)
@@ -14,7 +14,7 @@ ardour = env.Copy()
 
 domain = 'libardour'
 
-ardour.Append(DOMAIN = domain, MAJOR = 1, MINOR = 0, MICRO = 0)
+ardour.Append(DOMAIN = domain, MAJOR = 2, MINOR = 0, MICRO = 0)
 ardour.Append(CXXFLAGS = "-DPACKAGE=\\\"" + domain + "\\\"")
 ardour.Append(CXXFLAGS="-DLIBSIGC_DISABLE_DEPRECATED")
 ardour.Append(PACKAGE = domain)
@@ -44,6 +44,7 @@ buffer_set.cc
 meter.cc
 amp.cc
 panner.cc
+destructive_filesource.cc
 audiofilesource.cc
 audiofilter.cc
 audioregion.cc
@@ -64,7 +65,6 @@ crossfade.cc
 curve.cc
 cycle_timer.cc
 default_click.cc
-destructive_filesource.cc
 gain.cc
 gdither.cc
 globals.cc
@@ -105,7 +105,6 @@ sndfile_helpers.cc
 sndfilesource.cc
 source.cc
 source_factory.cc
-state_manager.cc
 tempo.cc
 utils.cc
 version.cc
@@ -242,7 +241,7 @@ ardour = conf.Finish ()
 ardour.Merge ([
             libraries['core'],
             libraries['xml'],
-            libraries['sndfile'],
+            libraries['sndfile-ardour'],
             libraries['raptor'],
             libraries['lrdf'],
             libraries['samplerate'],
@@ -260,8 +259,6 @@ if ardour['LIBLO']:
 if ardour['COREAUDIO'] or ardour['AUDIOUNITS']:
     ardour.Merge ([ libraries['appleutility'] ])
 
-ardour.VersionBuild(['version.cc', 'ardour/version.h'], 'SConscript')
-
 def SharedAsmObjectEmitter(target, source, env):
     for tgt in target:
         tgt.attributes.shared = 1
@@ -291,7 +288,9 @@ if env['NLS']:
 
 
 env.Alias('install', env.Install(os.path.join(install_prefix, 'lib/ardour2'), libardour))
-             
+
+env.Alias('version', ardour.VersionBuild(['version.cc', 'ardour/version.h'], []))
+
 env.Alias('tarball', env.Distribute (env['DISTTREE'],
                                     [ 'SConscript', 'i18n.h', 'gettext.h', 'sse_functions.s', 'sse_functions_64bit.s' ] +
                                     ardour_files + osc_files + vst_files + coreaudio_files + audiounit_files +
index 76b76b106140e28cef60952e2e743d4fc8b73793..4a95e094a9abfc75b070963ba2dff8559958c46c 100644 (file)
@@ -77,6 +77,8 @@ class AudioDiskstream : public Diskstream
        }
 
        void set_record_enabled (bool yn);
+       int set_destructive (bool yn);
+       bool can_become_destructive (bool& requires_bounce) const;
 
        float peak_power(uint32_t n=0) { 
                float x = channels[n].peak_power;
index fdf373a1cb168937cb3c1d52a6d2637c2919cabb..e87434b0fbd5f14d4a5dc919323227415b23495a 100644 (file)
@@ -37,6 +37,9 @@ class AudioTrack : public Track
        AudioTrack (Session&, const XMLNode&);
        ~AudioTrack ();
 
+       int set_mode (TrackMode m); 
+       bool can_use_mode (TrackMode m, bool& bounce_required);
+
        int roll (nframes_t nframes, nframes_t start_frame, nframes_t end_frame, 
                nframes_t offset, int declick, bool can_record, bool rec_monitors_input);
        
@@ -63,6 +66,8 @@ class AudioTrack : public Track
 
   protected:
        XMLNode& state (bool full);
+       
+       int _set_state (const XMLNode&, bool call_base);
 
   private:
        int  set_diskstream (boost::shared_ptr<AudioDiskstream>, void *);
index 8a51580f27752f7e0f96a355970975a90979e225..88591ab8458daebc33b29febacec1804aa54e737 100644 (file)
@@ -1,6 +1,6 @@
 /*
     Copyright (C) 2006 Paul Davis 
-       Written by Taybin Rutkin
+    Written by Taybin Rutkin
 
     This program is free software; you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
index af5f5cdb606de9777acae6619446fc0893b61bbc..bd609a7d80e75ece44cbeddae0536f7f90c1abb8 100644 (file)
@@ -31,6 +31,7 @@ struct SoundFileInfo {
     uint16_t    channels;
     int64_t     length;
     std::string format_name;
+    int64_t     timecode;
 };
 
 class AudioFileSource : public AudioSource {
@@ -81,6 +82,8 @@ class AudioFileSource : public AudioSource {
        void   mark_take (string);
        string take_id() const { return _take_id; }
 
+       bool is_embedded() const { return _is_embedded; }
+
        static void set_bwf_serial_number (int);
        
        static void set_search_path (string);
@@ -93,6 +96,9 @@ class AudioFileSource : public AudioSource {
        XMLNode& get_state ();
        int set_state (const XMLNode&);
 
+       bool destructive() const { return (_flags & Destructive); }
+       virtual bool set_destructive (bool yn) { return false; }
+
        /* this should really be protected, but C++ is getting stricter
           and creating slots from protected member functions is starting
           to cause issues.
@@ -121,9 +127,12 @@ class AudioFileSource : public AudioSource {
        string        _path;
        Flag          _flags;
        string        _take_id;
-       uint64_t       timeline_position;
+       int64_t       timeline_position;
        bool           file_is_new;
 
+       bool          _is_embedded;
+       static bool determine_embeddedness(string path);
+
        static string peak_dir;
        static string search_path;
 
@@ -133,7 +142,7 @@ class AudioFileSource : public AudioSource {
 
        static uint64_t header_position_offset;
 
-       virtual void set_timeline_position (nframes_t pos);
+       virtual void set_timeline_position (int64_t pos);
        virtual void set_header_timeline_position () = 0;
 
        bool find (std::string path, bool must_exist, bool& is_new);
index e14cfd018062e09d1fd5bde7d74a65c5491b9e63..53c7e68b824f31c6c760b230b449a30b38011326 100644 (file)
@@ -110,6 +110,7 @@ class AudioRegion : public Region
        void set_fade_out (FadeShape, nframes_t);
 
        void set_envelope_active (bool yn);
+       void set_default_envelope ();
 
        int separate_by_channel (ARDOUR::Session&, vector<AudioRegion*>&) const;
 
@@ -143,7 +144,6 @@ class AudioRegion : public Region
        void set_default_fades ();
        void set_default_fade_in ();
        void set_default_fade_out ();
-       void set_default_envelope ();
 
        void recompute_gain_at_end ();
        void recompute_gain_at_start ();
@@ -157,8 +157,11 @@ class AudioRegion : public Region
        void recompute_at_start ();
        void recompute_at_end ();
 
-       void envelope_changed (Change);
+       void envelope_changed ();
+       void fade_in_changed ();
+       void fade_out_changed ();
        void source_offset_changed ();
+       void listen_to_my_curves ();
 
        mutable Curve     _fade_in;
        FadeShape         _fade_in_shape;
@@ -171,6 +174,13 @@ class AudioRegion : public Region
 
   protected:
        int set_live_state (const XMLNode&, Change&, bool send);
+       
+       virtual bool verify_start (jack_nframes_t);
+       virtual bool verify_start_and_length (jack_nframes_t, jack_nframes_t);
+       virtual bool verify_start_mutable (jack_nframes_t&_start);
+       virtual bool verify_length (jack_nframes_t);
+       /*virtual void recompute_at_start () = 0;
+       virtual void recompute_at_end () = 0;*/
 };
 
 } /* namespace ARDOUR */
index db82acf894252ca8db932a5054a9714f89f9ac88..2ada2552369a490eee4d672ebab8d43fa35732c8 100644 (file)
@@ -70,7 +70,7 @@ const nframes_t frames_per_peak = 256;
        uint32_t read_data_count() const { return _read_data_count; }
        uint32_t write_data_count() const { return _write_data_count; }
 
-       int  read_peaks (PeakData *peaks, nframes_t npeaks, nframes_t start, nframes_t cnt, double samples_per_unit) const;
+       virtual int read_peaks (PeakData *peaks, nframes_t npeaks, nframes_t start, nframes_t cnt, double samples_per_unit) const;
        int  build_peaks ();
        bool peaks_ready (sigc::slot<void>, sigc::connection&) const;
 
index 22ab706f82bed73e946ac2532a2f0b6d57827b9f..e5c194e683b4b80d245b6b358efe556b824e8b28 100644 (file)
@@ -33,7 +33,6 @@
 #include <pbd/statefuldestructible.h> 
 
 #include <ardour/ardour.h>
-#include <ardour/state_manager.h>
 
 namespace ARDOUR {
        
@@ -54,14 +53,15 @@ struct ControlEvent {
 
 };
 
- class AutomationList : public StateManager, public PBD::StatefulDestructible
+class AutomationList : public PBD::StatefulDestructible
 {
   public:
        typedef std::list<ControlEvent*> AutomationEventList;
        typedef AutomationEventList::iterator iterator;
        typedef AutomationEventList::const_iterator const_iterator;
 
-       AutomationList(double default_value, bool no_state = false);
+       AutomationList (double default_value);
+       AutomationList (const XMLNode&);
        ~AutomationList();
 
        AutomationList (const AutomationList&);
@@ -85,8 +85,9 @@ struct ControlEvent {
 
        void reposition_for_rt_add (double when);
        void rt_add (double when, double value);
-       iterator add (double when, double value, iterator, bool ignore_mode = false);
-       void add (double when, double value, bool for_loading = false);
+       void add (double when, double value);
+       /* this should be private but old-school automation loading needs it in IO/Redirect */
+       void fast_simple_add (double when, double value);
 
        void reset_range (double start, double end);
        void erase_range (double start, double end);
@@ -151,13 +152,12 @@ struct ControlEvent {
                (obj.*method)(*this);
        }
 
-       UndoAction get_memento () const;
-       
-       virtual void store_state (XMLNode& node) const;
-       virtual void load_state (const XMLNode&);
+       sigc::signal<void> StateChanged;
 
-       XMLNode &get_state(void); 
+       XMLNodeget_state(void); 
        int set_state (const XMLNode &s);
+       XMLNode& state (bool full);
+       XMLNode& serialize_events ();
 
        void set_max_xval (double);
        double get_max_xval() const { return max_xval; }
@@ -188,12 +188,6 @@ struct ControlEvent {
 
   protected:
 
-       struct State : public ARDOUR::StateManager::State {
-           AutomationEventList events;
-
-           State (std::string why) : ARDOUR::StateManager::State (why) {}
-       };
-
        AutomationEventList events;
        mutable Glib::Mutex lock;
        bool   _frozen;
@@ -215,7 +209,6 @@ struct ControlEvent {
        double min_yval;
        double max_yval;
        double default_value;
-       bool   no_state;
 
        iterator rt_insertion_point;
        double   rt_pos;
@@ -242,14 +235,12 @@ struct ControlEvent {
 
        virtual double unlocked_eval (double where);
 
-       Change   restore_state (StateManager::State&);
-       StateManager::State* state_factory (std::string why) const;
-
        virtual ControlEvent* point_factory (double,double) const;
        virtual ControlEvent* point_factory (const ControlEvent&) const;
 
-
        AutomationList* cut_copy_clear (double, double, int op);
+
+       int deserialize_events (const XMLNode&);
 };
 
 } // namespace
index fe65e9d4336f61d88e2790b323229c5f1b1f8a34..8044190066c8ed38addc2a3214a2c48a37049e15 100644 (file)
@@ -80,7 +80,6 @@ CONFIG_VARIABLE (std::string, click_emphasis_sound, "click-emphasis-sound", "")
 CONFIG_VARIABLE (bool, auto_play, "auto-play", false)
 CONFIG_VARIABLE (bool, auto_return, "auto-return", false)
 CONFIG_VARIABLE (bool, auto_input, "auto-input", true)
-CONFIG_VARIABLE (bool, auto_loop, "auto-loop", false)
 CONFIG_VARIABLE (bool, punch_in, "punch-in", false)
 CONFIG_VARIABLE (bool, punch_out, "punch-out", false)
 CONFIG_VARIABLE (bool, plugins_stop_with_transport, "plugins-stop-with-transport", false)
index 668fe61102c5e9630646987faecee7e85e1e3b44..bd69c78e180d29ec1285d6bdcd8d409bc9da2b59 100644 (file)
@@ -38,6 +38,8 @@ class CoreAudioSource : public AudioFileSource {
        int flush_header () {return 0;};
        void set_header_timeline_position () {};
 
+       static int get_soundfile_info (string path, SoundFileInfo& _info, string& error_msg);
+
   protected:
        nframes_t read_unlocked (Sample *dst, nframes_t start, nframes_t cnt) const;
        nframes_t write_unlocked (Sample *dst, nframes_t cnt) { return 0; }
@@ -50,7 +52,7 @@ class CoreAudioSource : public AudioFileSource {
        mutable nframes_t tmpbufsize;
        mutable Glib::Mutex _tmpbuf_lock;
 
-       void init (const string &str);
+       void init (string str);
 };
 
 }; /* namespace ARDOUR */
index 87893ca2609a12de03608e0a748baeb432539a74..df984b74e0a4bf598d540d67e1908fc0dc6d165c 100644 (file)
@@ -51,9 +51,10 @@ class Curve : public AutomationList
        ~Curve ();
        Curve (const Curve& other);
        Curve (const Curve& other, double start, double end);
+       Curve (const XMLNode&);
 
-       bool rt_safe_get_vector (double x0, double x1, float *arg, size_t veclen);
-       void get_vector (double x0, double x1, float *arg, size_t veclen);
+       bool rt_safe_get_vector (double x0, double x1, float *arg, int32_t veclen);
+       void get_vector (double x0, double x1, float *arg, int32_t veclen);
 
        AutomationEventList::iterator closest_control_point_before (double xval);
        AutomationEventList::iterator closest_control_point_after (double xval);
@@ -66,22 +67,20 @@ class Curve : public AutomationList
        ControlEvent* point_factory (double,double) const;
        ControlEvent* point_factory (const ControlEvent&) const;
 
-       Change   restore_state (StateManager::State&);
-
   private:
        AutomationList::iterator last_bound;
 
        double unlocked_eval (double where);
        double multipoint_eval (double x);
 
-       void _get_vector (double x0, double x1, float *arg, size_t veclen);
+       void _get_vector (double x0, double x1, float *arg, int32_t veclen);
 
 };
 
 } // namespace ARDOUR
 
 extern "C" {
-       void curve_get_vector_from_c (void *arg, double, double, float*, size_t);
+       void curve_get_vector_from_c (void *arg, double, double, float*, int32_t);
 }
 
 #endif /* __ardour_curve_h__ */
index 1e75042ce9a1a4d4525fb615e4d1a6c9c6adda84..2e6f5d0e5785c8e105d895e953bf169042962b5c 100644 (file)
@@ -48,6 +48,8 @@ class DestructiveFileSource : public SndFileSource {
 
        static void setup_standard_crossfades (nframes_t sample_rate);
 
+       int read_peaks (PeakData *peaks, nframes_t npeaks, nframes_t start, nframes_t cnt, double samples_per_unit) const;
+
   protected:
        nframes_t write_unlocked (Sample *src, nframes_t cnt);
 
@@ -66,7 +68,7 @@ class DestructiveFileSource : public SndFileSource {
 
        void init ();
        nframes_t crossfade (Sample* data, nframes_t cnt, int dir);
-       void set_timeline_position (nframes_t);
+       void set_timeline_position (int64_t);
 };
 
 }
index 7a779b69bff8287e6cc993edee093cd35a4a3632..eb6d9362228e3c25d7b0f2f915452996d2d8e25b 100644 (file)
@@ -90,7 +90,8 @@ class IO;
        virtual void set_record_enabled (bool yn) = 0;
 
        bool destructive() const { return _flags & Destructive; }
-       virtual void set_destructive (bool yn);
+       virtual int set_destructive (bool yn) { return -1; }
+       virtual bool can_become_destructive (bool& requires_bounce) const { return false; }
 
        bool           hidden()      const { return _flags & Hidden; }
        bool           recordable()  const { return _flags & Recordable; }
@@ -137,6 +138,8 @@ class IO;
 
        void handle_input_change (IOChange, void *src);
 
+       void remove_region_from_last_capture (boost::weak_ptr<Region> wregion);
+
        sigc::signal<void>            RecordEnableChanged;
        sigc::signal<void>            SpeedChanged;
        sigc::signal<void>            ReverseChanged;
@@ -223,6 +226,7 @@ class IO;
        virtual bool realtime_set_speed (double, bool global_change);
 
        std::list<boost::shared_ptr<Region> > _last_capture_regions;
+
        virtual int use_pending_capture_data (XMLNode& node) = 0;
 
        virtual void get_input_sources () = 0;
index 5d917a8c2cc9d3dd44f0d7e86de544f50ede56f8..217fd898850db9f22591fbe147874a560df4da80 100644 (file)
@@ -89,15 +89,6 @@ class PortInsert : public Insert
        int32_t compute_output_streams (int32_t cnt) const;
 };
 
-struct PluginInsertState : public RedirectState
-{
-    PluginInsertState (std::string why) 
-           : RedirectState (why) {}
-    ~PluginInsertState() {}
-
-    PluginState plugin_state;
-};
-
 class PluginInsert : public Insert
 {
   public:
@@ -112,9 +103,6 @@ class PluginInsert : public Insert
        XMLNode& get_state(void);
        int set_state(const XMLNode&);
 
-       StateManager::State* state_factory (std::string why) const;
-       Change restore_state (StateManager::State&);
-
        void run (BufferSet& bufs, nframes_t start_frame, nframes_t end_frame, nframes_t nframes, nframes_t offset);
        void silence (nframes_t nframes, nframes_t offset);
        
@@ -160,9 +148,7 @@ class PluginInsert : public Insert
        nframes_t latency();
 
        void transport_stopped (nframes_t now);
-
-  protected:
-       void store_state (PluginInsertState&) const;
+       void automation_snapshot (nframes_t now);
 
   private:
 
index 56566149c0812ed417e74c9dd83698b7e2823ad4..f7e1993bb2eda240958ffd564a3be93c8a1cdc25 100644 (file)
@@ -36,7 +36,6 @@
 
 #include <ardour/ardour.h>
 #include <ardour/utils.h>
-#include <ardour/state_manager.h>
 #include <ardour/curve.h>
 #include <ardour/types.h>
 #include <ardour/data_type.h>
@@ -65,7 +64,7 @@ class BufferSet;
  * An IO can contain ports of varying types, making routes/inserts/etc with
  * varied combinations of types (eg MIDI and audio) possible.
  */
-class IO : public PBD::StatefulDestructible, public ARDOUR::StateManager
+class IO : public PBD::StatefulDestructible
 {
 
   public:
@@ -74,7 +73,9 @@ class IO : public PBD::StatefulDestructible, public ARDOUR::StateManager
        IO (Session&, string name, 
            int input_min = -1, int input_max = -1, 
            int output_min = -1, int output_max = -1,
-               DataType default_type = DataType::AUDIO);
+           DataType default_type = DataType::AUDIO);
+       
+       IO (Session&, const XMLNode&, DataType default_type = DataType::AUDIO);
        
        virtual ~IO();
 
@@ -82,18 +83,12 @@ class IO : public PBD::StatefulDestructible, public ARDOUR::StateManager
        ChanCount input_maximum() const { return _input_maximum; }
        ChanCount output_minimum() const { return _output_minimum; }
        ChanCount output_maximum() const { return _output_maximum; }
-
+       
        void set_input_minimum (ChanCount n);
        void set_input_maximum (ChanCount n);
        void set_output_minimum (ChanCount n);
        void set_output_maximum (ChanCount n);
        
-       // Do not write any new code using these
-       void set_input_minimum (int n);
-       void set_input_maximum (int n);
-       void set_output_minimum (int n);
-       void set_output_maximum (int n);
-
        DataType default_type() const         { return _default_type; }
        void     set_default_type(DataType t) { _default_type = t; }
 
@@ -187,9 +182,6 @@ class IO : public PBD::StatefulDestructible, public ARDOUR::StateManager
        XMLNode& get_state (void);
        int set_state (const XMLNode&);
 
-       virtual UndoAction get_memento() const;
-
-
        static int  disable_connecting (void);
 
        static int  enable_connecting (void);
@@ -224,6 +216,14 @@ public:
 
        /* automation */
 
+       static void set_automation_interval (jack_nframes_t frames) {
+               _automation_interval = frames;
+       }
+
+       static jack_nframes_t automation_interval() { 
+               return _automation_interval;
+       }
+
        void clear_automation ();
 
        bool gain_automation_recording() const { 
@@ -245,6 +245,7 @@ public:
        sigc::signal<void> gain_automation_style_changed;
 
        virtual void transport_stopped (nframes_t now);
+       void automation_snapshot (nframes_t now);
 
        ARDOUR::Curve& gain_automation_curve () { return _gain_automation_curve; }
 
@@ -304,10 +305,8 @@ public:
 
        GainControllable _gain_control;
 
-       /* state management */
-
-       Change               restore_state (State&);
-       StateManager::State* state_factory (std::string why) const;
+       nframes_t last_automation_snapshot;
+       static nframes_t _automation_interval;
 
        AutoState      _gain_automation_state;
        AutoStyle      _gain_automation_style;
@@ -315,11 +314,12 @@ public:
        bool     apply_gain_automation;
        Curve    _gain_automation_curve;
        
-       int  save_automation (const string&);
-       int  load_automation (const string&);
-       
        Glib::Mutex automation_lock;
 
+       virtual int set_automation_state (const XMLNode&);
+       virtual XMLNode& get_automation_state ();
+       virtual int load_automation (std::string path);
+
        /* AudioTrack::deprecated_use_diskstream_connections() needs these */
 
        int set_inputs (const string& str);
index 1f1c02d67cac36d19de28437576bb90119f66192..94f70bb4e8ecf02fcf249eeca8f0619883975f48 100644 (file)
@@ -36,7 +36,6 @@
 #include <pbd/statefuldestructible.h> 
 
 #include <ardour/ardour.h>
-#include <ardour/state_manager.h>
 
 using std::string;
 
@@ -131,7 +130,7 @@ class Location : public PBD::StatefulDestructible
        bool set_flag_internal (bool yn, Flags flag);
 };
 
-class Locations : public StateManager, public PBD::StatefulDestructible
+class Locations : public PBD::StatefulDestructible
 {
   public:
        typedef std::list<Location *> LocationList;
@@ -169,6 +168,7 @@ class Locations : public StateManager, public PBD::StatefulDestructible
        sigc::signal<void>           changed;
        sigc::signal<void,Location*> added;
        sigc::signal<void,Location*> removed;
+       sigc::signal<void,Change>    StateChanged;
 
        template<class T> void apply (T& obj, void (T::*method)(LocationList&)) {
                Glib::Mutex::Lock lm (lock);
@@ -180,26 +180,14 @@ class Locations : public StateManager, public PBD::StatefulDestructible
                (obj.*method)(locations, arg);
        }
 
-       UndoAction get_memento () const;
-
   private:
 
-       struct State : public ARDOUR::StateManager::State {
-           LocationList locations;
-           LocationList states;
-
-           State (std::string why) : ARDOUR::StateManager::State (why) {}
-       };
-
        LocationList       locations;
        Location          *current_location;
        mutable Glib::Mutex  lock;
 
        int set_current_unlocked (Location *);
        void location_changed (Location*);
-
-       Change   restore_state (StateManager::State&);
-       StateManager::State* state_factory (std::string why) const;
 };
 
 } // namespace ARDOUR
index e62121672f8ab83f84ae2cde582fe817d0054930..583cc23de5aa37ba0183ccebd6d12abdf43bbb83 100644 (file)
@@ -87,7 +87,7 @@ class MidiDiskstream : public Diskstream
 
        boost::shared_ptr<SMFSource> write_source () { return _write_source; }
        
-       void set_destructive (bool yn); // doom!
+       int set_destructive (bool yn); // doom!
 
   protected:
        friend class Session;
index a5c578b7cdd3f11a19d529541936b0797b79e142..2fa39a37df96fb6ba6407ad39e63bfdc5f337898 100644 (file)
@@ -84,9 +84,6 @@ class MidiRegion : public Region
        friend class Playlist;
 
   private:
-       StateManager::State* state_factory (std::string why) const;
-       Change restore_state (StateManager::State&);
-
        jack_nframes_t _read_at (const SourceList&, MidiRingBuffer& dst,
                jack_nframes_t position,
                jack_nframes_t dur, 
index 6cffe013185ff328e5490629ac28a489e89faa32..0347df5669e484bd181e71d67b9a4244b511edb9 100644 (file)
@@ -58,7 +58,7 @@ public:
        int use_diskstream (string name);
        int use_diskstream (const PBD::ID& id);
 
-       void set_mode (TrackMode m);
+       int set_mode (TrackMode m);
 
        void set_latency_delay (jack_nframes_t);
 
index 52311208408d8f66d0083a2f90213eeda6439860..79bff7d2a5bd6bad667a6f660460133c11698349 100644 (file)
@@ -85,18 +85,18 @@ class StreamPanner : public sigc::trackable, public Stateful
 
        virtual Curve& automation() = 0;
 
-       virtual int load (istream&, string path, uint32_t&) = 0;
-
-       virtual int save (ostream&) const = 0;
-
        sigc::signal<void> Changed;      /* for position */
        sigc::signal<void> StateChanged; /* for mute */
 
        int set_state (const XMLNode&);
        virtual XMLNode& state (bool full_state) = 0;
-
+       
        Panner & get_parent() { return parent; }
        
+       /* old school automation loading */
+
+       virtual int load (istream&, string path, uint32_t&) = 0;
+
   protected:
        friend class Panner;
        Panner& parent;
@@ -145,8 +145,6 @@ class BaseStereoPanner : public StreamPanner
 
        void distribute (AudioBuffer& src, BufferSet& obufs, gain_t gain_coeff, nframes_t nframes);
 
-       int load (istream&, string path, uint32_t&);
-       int save (ostream&) const;
        void snapshot (nframes_t now);
        void transport_stopped (nframes_t frame);
        void set_automation_state (AutoState);
@@ -154,6 +152,10 @@ class BaseStereoPanner : public StreamPanner
 
        Curve& automation() { return _automation; }
 
+       /* old school automation loading */
+
+       int load (istream&, string path, uint32_t&);
+
   protected:
        float left;
        float right;
@@ -207,10 +209,7 @@ class Multi2dPanner : public StreamPanner
 
        void distribute (AudioBuffer& src, BufferSet& obufs, gain_t gain_coeff, nframes_t nframes);
        void distribute_automated (AudioBuffer& src, BufferSet& obufs,
-                            nframes_t start, nframes_t end, nframes_t nframes, pan_t** buffers);
-
-       int load (istream&, string path, uint32_t&);
-       int save (ostream&) const;
+                                  nframes_t start, nframes_t end, nframes_t nframes, pan_t** buffers);
 
        static StreamPanner* factory (Panner&);
        static string name;
@@ -219,6 +218,10 @@ class Multi2dPanner : public StreamPanner
        XMLNode& get_state (void);
        int set_state (const XMLNode&);
 
+       /* old school automation loading */
+
+       int load (istream&, string path, uint32_t&);
+
   private:
        Curve _automation;
        void update ();
@@ -244,8 +247,6 @@ class Panner : public std::vector<StreamPanner*>, public Stateful, public sigc::
        /// The fundamental Panner function
        void distribute(BufferSet& src, BufferSet& dest, nframes_t start_frame, nframes_t end_frames, nframes_t nframes, nframes_t offset);
 
-       void set_name (string);
-
        bool bypassed() const { return _bypassed; }
        void set_bypassed (bool yn);
 
@@ -265,9 +266,6 @@ class Panner : public std::vector<StreamPanner*>, public Stateful, public sigc::
        AutoStyle automation_style() const;
        bool touching() const;
 
-       int load ();
-       int save () const;
-
        XMLNode& get_state (void);
        XMLNode& state (bool full);
        int      set_state (const XMLNode&);
@@ -304,12 +302,14 @@ class Panner : public std::vector<StreamPanner*>, public Stateful, public sigc::
        void set_position (float x, StreamPanner& orig);
        void set_position (float x, float y, StreamPanner& orig);
        void set_position (float x, float y, float z, StreamPanner& orig);
-       
+
+       /* old school automation */
+
+       int load ();
+
   private:
        void distribute_no_automation(BufferSet& src, BufferSet& dest, nframes_t nframes, nframes_t offset, gain_t gain_coeff);
 
-
-       string            automation_path;
        Session&         _session;
        uint32_t     current_outs;
        bool             _linked;
@@ -317,6 +317,11 @@ class Panner : public std::vector<StreamPanner*>, public Stateful, public sigc::
        LinkDirection    _link_direction;
 
        static float current_automation_version_number;
+
+       /* old school automation handling */
+
+       std::string automation_path;
+       void set_name (std::string);
 };
 
 } // namespace ARDOUR
index 93b30f42eff807c14dfaa59cab312925719daeac..831c9b39058c6f5c50f34083733bedbd67df1fa0 100644 (file)
@@ -63,8 +63,8 @@ class Playlist : public PBD::StatefulDestructible {
        void unref();
        uint32_t refcnt() const { return _refcnt; }
 
-       const string& name() const { return _name; }
-       void set_name (const string& str);
+       std::string name() const { return _name; }
+       void set_name (std::string str);
 
        const DataType& data_type() const { return _type; }
 
@@ -73,6 +73,7 @@ class Playlist : public PBD::StatefulDestructible {
 
        bool hidden() const { return _hidden; }
        bool empty() const;
+       uint32_t n_regions() const;
        nframes_t get_maximum_extent () const;
        layer_t top_layer() const;
 
@@ -91,19 +92,15 @@ class Playlist : public PBD::StatefulDestructible {
        void duplicate (boost::shared_ptr<Region>, nframes_t position, float times);
        void nudge_after (nframes_t start, nframes_t distance, bool forwards);
 
-       boost::shared_ptr<Region> find_region (const PBD::ID&) const;
-
        Playlist* cut  (list<AudioRange>&, bool result_is_hidden = true);
        Playlist* copy (list<AudioRange>&, bool result_is_hidden = true);
        int       paste (Playlist&, nframes_t position, float times);
 
-       uint32_t read_data_count() { return _read_data_count; }
-
-       RegionList* regions_at (nframes_t frame);
-       RegionList* regions_touched (nframes_t start, nframes_t end);
+       RegionList*                regions_at (nframes_t frame);
+       RegionList*                regions_touched (nframes_t start, nframes_t end);
+       boost::shared_ptr<Region>  find_region (const PBD::ID&) const;
        boost::shared_ptr<Region>  top_region_at (nframes_t frame);
-
-       boost::shared_ptr<Region>     find_next_region (nframes_t frame, RegionPoint point, int dir);
+       boost::shared_ptr<Region>  find_next_region (nframes_t frame, RegionPoint point, int dir);
 
        template<class T> void foreach_region (T *t, void (T::*func)(boost::shared_ptr<Region>, void *), void *arg);
        template<class T> void foreach_region (T *t, void (T::*func)(boost::shared_ptr<Region>));
index ae58fa9b7095b303e92bb88ee73e57619fc5fd90..79ae4516c59affe218dc2c876fc0a83ba8065ca8 100644 (file)
@@ -47,14 +47,6 @@ namespace ARDOUR {
 
 class Session;
 
-struct RedirectState : public StateManager::State {
-    RedirectState (string why) 
-           : StateManager::State (why) {}
-    ~RedirectState () {}
-
-    bool active;
-};
-
 class Redirect : public IO
 {
   public:
@@ -99,9 +91,6 @@ class Redirect : public IO
        XMLNode& get_state (void);
        int set_state (const XMLNode&);
 
-       StateManager::State* state_factory (string why) const;
-       Change restore_state (StateManager::State&);
-
        void *get_gui () const { return _gui; }
        void  set_gui (void *p) { _gui = p; }
 
@@ -110,9 +99,6 @@ class Redirect : public IO
                return 1.0f;
        }
 
-       int load_automation (string path);
-       int save_automation (string path);
-
        void what_has_automation (set<uint32_t>&) const;
        void what_has_visible_automation (set<uint32_t>&) const;
        const set<uint32_t>& what_can_be_automated () const { return can_automate_list; }
@@ -137,15 +123,19 @@ class Redirect : public IO
        void can_automate (uint32_t);
        set<uint32_t> can_automate_list;
 
-       void store_state (RedirectState&) const;
-
        virtual void automation_list_creation_callback (uint32_t, AutomationList&) {}
 
+       int set_automation_state (const XMLNode&);
+       XMLNode& get_automation_state ();
+       
   private:
        bool _active;
        Placement _placement;
        uint32_t _sort_key;
        void* _gui;  /* generic, we don't know or care what this is */
+
+       int old_set_automation_state (const XMLNode&);
+       int load_automation (std::string path);
 };
 
 } // namespace ARDOUR
index 627e556caded727e24d0d4284f90d90b19e1ad84..88bb294e5d65c8273fd4a1dd79e25876fd8b0f9f 100644 (file)
@@ -144,6 +144,7 @@ class Region : public PBD::StatefulDestructible, public boost::enable_shared_fro
        void special_set_position (nframes_t);
        void nudge_position (long, void *src);
 
+       bool at_natural_position () const;
        void move_to_natural_position (void *src);
 
        void trim_start (nframes_t new_position, void *src);
@@ -171,7 +172,7 @@ class Region : public PBD::StatefulDestructible, public boost::enable_shared_fro
        void set_playlist (ARDOUR::Playlist*);
 
        void source_deleted (boost::shared_ptr<Source>);
-
+       
        boost::shared_ptr<Source> source (uint32_t n=0) const { return _sources[ (n < _sources.size()) ? n : 0 ]; }
        uint32_t                  n_channels()          const { return _sources.size(); }
 
@@ -185,7 +186,7 @@ class Region : public PBD::StatefulDestructible, public boost::enable_shared_fro
        virtual int      set_state (const XMLNode&);
        virtual int      set_live_state (const XMLNode&, Change&, bool send);
 
-       boost::shared_ptr<Region> get_parent();
+       virtual boost::shared_ptr<Region> get_parent() const;
        
        uint64_t last_layer_op() const { return _last_layer_op; }
        void set_last_layer_op (uint64_t when);
@@ -214,10 +215,10 @@ class Region : public PBD::StatefulDestructible, public boost::enable_shared_fro
        void maybe_uncopy ();
        void first_edit ();
        
-       bool verify_start (jack_nframes_t);
-       bool verify_start_and_length (jack_nframes_t, jack_nframes_t);
-       bool verify_start_mutable (jack_nframes_t&_start);
-       bool verify_length (jack_nframes_t);
+       virtual bool verify_start (jack_nframes_t);
+       virtual bool verify_start_and_length (jack_nframes_t, jack_nframes_t);
+       virtual bool verify_start_mutable (jack_nframes_t&_start);
+       virtual bool verify_length (jack_nframes_t);
        virtual void recompute_at_start () = 0;
        virtual void recompute_at_end () = 0;
        
index 5c71bb16d385a935e2c52fb4b008085cacdcac1d..6bc37ee51efae7b54c62153e8f65abe23872e7d0 100644 (file)
@@ -72,8 +72,7 @@ class Route : public IO
 
        Route (Session&, std::string name, int input_min, int input_max, int output_min, int output_max,
               Flag flags = Flag(0), DataType default_type = DataType::AUDIO);
-       
-       Route (Session&, const XMLNode&);
+       Route (Session&, const XMLNode&, DataType default_type = DataType::AUDIO);
        virtual ~Route();
 
        std::string comment() { return _comment; }
@@ -205,11 +204,6 @@ class Route : public IO
 
        sigc::signal<void,void*> SelectedChanged;
 
-       /* undo */
-
-       UndoAction get_memento() const;
-       void set_state (state_id_t);
-
        int set_control_outs (const vector<std::string>& ports);
        IO* control_outs() { return _control_outs; }
 
@@ -238,6 +232,7 @@ class Route : public IO
                return _mute_control;
        }
        
+       void automation_snapshot (nframes_t now);
        void protect_automation ();
        
        void set_remote_control_id (uint32_t id);
@@ -317,13 +312,14 @@ class Route : public IO
        
        sigc::connection input_signal_connection;
 
-       state_id_t _current_state_id;
        ChanCount redirect_max_outs;
        uint32_t _remote_control_id;
 
        uint32_t pans_required() const;
        ChanCount n_process_buffers ();
 
+       virtual int _set_state (const XMLNode&, bool call_base);
+
   private:
        void init ();
 
index f06c4117a610a3f3e7d82c72c13ec7224aa25084..039bf923628b2d187e3c233ad84ac68f599dac12 100644 (file)
@@ -359,7 +359,10 @@ class Session : public PBD::StatefulDestructible
        void request_bounded_roll (nframes_t start, nframes_t end);
        void request_stop (bool abort = false);
        void request_locate (nframes_t frame, bool with_roll = false);
+
        void request_play_loop (bool yn);
+       bool get_play_loop () const { return play_loop; }
+
        nframes_t  last_transport_start() const { return _last_roll_location; }
        void goto_end ()   { request_locate (end_location->start(), false);}
        void goto_start () { request_locate (start_location->start(), false); }
@@ -562,7 +565,8 @@ class Session : public PBD::StatefulDestructible
        string new_region_name (string);
        string path_from_region_name (string name, string identifier);
 
-       boost::shared_ptr<Region> find_whole_file_parent (Region&);
+       boost::shared_ptr<Region> find_whole_file_parent (boost::shared_ptr<Region const>);
+       
        void find_equivalent_playlist_regions (boost::shared_ptr<Region>, std::vector<boost::shared_ptr<Region> >& result);
 
        boost::shared_ptr<Region>      XMLRegionFactory (const XMLNode&, bool full);
@@ -646,6 +650,7 @@ class Session : public PBD::StatefulDestructible
        uint32_t n_playlists() const;
 
        template<class T> void foreach_playlist (T *obj, void (T::*func)(Playlist *));
+       void get_playlists (std::vector<Playlist*>&);
 
        /* named selections */
 
@@ -757,16 +762,19 @@ class Session : public PBD::StatefulDestructible
        /* History (for editors, mixers, UIs etc.) */
 
        void undo (uint32_t n) {
-               history.undo (n);
+               _history.undo (n);
        }
+
        void redo (uint32_t n) {
-               history.redo (n);
+               _history.redo (n);
        }
 
-       uint32_t undo_depth() const { return history.undo_depth(); }
-       uint32_t redo_depth() const { return history.redo_depth(); }
-       string next_undo() const { return history.next_undo(); }
-       string next_redo() const { return history.next_redo(); }
+       UndoHistory& history() { return _history; }
+       
+       uint32_t undo_depth() const { return _history.undo_depth(); }
+       uint32_t redo_depth() const { return _history.redo_depth(); }
+       string next_undo() const { return _history.next_undo(); }
+       string next_redo() const { return _history.next_redo(); }
 
        void begin_reversible_command (string cmd_name);
        void commit_reversible_command (Command* cmd = 0);
@@ -775,11 +783,11 @@ class Session : public PBD::StatefulDestructible
                current_trans->add_command (cmd);
        }
 
-       std::map<PBD::ID, PBD::StatefulDestructible*> registry;
+       std::map<PBD::ID, PBD::StatefulThingWithGoingAway*> registry;
 
         // these commands are implemented in libs/ardour/session_command.cc
        Command *memento_command_factory(XMLNode *n);
-        void register_with_memento_command_factory(PBD::ID, PBD::StatefulDestructible *);
+        void register_with_memento_command_factory(PBD::ID, PBD::StatefulThingWithGoingAway *);
 
         class GlobalSoloStateCommand : public Command
         {
@@ -944,6 +952,8 @@ class Session : public PBD::StatefulDestructible
   private:
        int  create (bool& new_session, string* mix_template, nframes_t initial_length);
 
+       nframes_t compute_initial_length ();
+
        static const char* _template_suffix;
        static const char* _statefile_suffix;
        static const char* _pending_suffix;
@@ -1566,7 +1576,7 @@ class Session : public PBD::StatefulDestructible
 
        void reverse_diskstream_buffers ();
 
-       UndoHistory history;
+       UndoHistory _history;
        UndoTransaction* current_trans;
 
        GlobalRouteBooleanState get_global_route_boolean (bool (Route::*method)(void) const);
@@ -1658,7 +1668,7 @@ class Session : public PBD::StatefulDestructible
                            void* ptr,
                            float opt);
 
-       /* number of hardware audio ports we're using,
+       /* number of hardware ports we're using,
           based on max (requested,available)
        */
 
index 50fd5e68393af1685a2263d547bb729a0299c7ca..1d07f6888ded2a1e064b4e91f3c92a5eb2d3419c 100644 (file)
@@ -36,10 +36,7 @@ class SndFileSource : public AudioFileSource {
        /* constructor to be called for new in-session files */
 
        SndFileSource (Session&, std::string path, SampleFormat samp_format, HeaderFormat hdr_format, nframes_t rate, 
-                      Flag flags = AudioFileSource::Flag (AudioFileSource::Writable|
-                                                          AudioFileSource::Removable|
-                                                          AudioFileSource::RemovableIfEmpty|
-                                                          AudioFileSource::CanRename));
+                      Flag flags = SndFileSource::default_writable_flags);
                       
        /* constructor to be called for existing in-session files */
        
@@ -53,6 +50,18 @@ class SndFileSource : public AudioFileSource {
 
        nframes_t natural_position () const;
 
+       nframes_t last_capture_start_frame() const;
+       void mark_capture_start (nframes_t);
+       void mark_capture_end ();
+       void clear_capture_marks();
+
+       bool set_destructive (bool yn);
+
+       static void setup_standard_crossfades (nframes_t sample_rate);
+       static const AudioFileSource::Flag default_writable_flags;
+
+       static int get_soundfile_info (string path, SoundFileInfo& _info, string& error_msg);
+
   protected:
        void set_header_timeline_position ();
 
@@ -69,10 +78,32 @@ class SndFileSource : public AudioFileSource {
        mutable float *interleave_buf;
        mutable nframes_t interleave_bufsize;
 
-       void init (const string &str);
+       void init (string str);
        int open();
        void close();
        int setup_broadcast_info (nframes_t when, struct tm&, time_t);
+
+       /* destructive */
+
+       static nframes_t xfade_frames;
+       static gain_t* out_coefficient;
+       static gain_t* in_coefficient;
+
+       bool          _capture_start;
+       bool          _capture_end;
+       nframes_t      capture_start_frame;
+       nframes_t      file_pos; // unit is frames
+       nframes_t      xfade_out_count;
+       nframes_t      xfade_in_count;
+       Sample*        xfade_buf;
+
+       nframes_t crossfade (Sample* data, nframes_t cnt, int dir);
+       void set_timeline_position (int64_t);
+       nframes_t destructive_write_unlocked (Sample *dst, nframes_t cnt);
+       nframes_t nondestructive_write_unlocked (Sample *dst, nframes_t cnt);
+       void handle_header_position_change ();
+
+       static int64_t get_timecode_info (SNDFILE* sf, SF_BROADCAST_INFO* binfo, bool& exists);
 };
 
 } // namespace ARDOUR
index 8bf66f8b8d23a6c7356141dd06c69c212b2f7899..e94b1af54f87ede9f0a7f384c5a1db5530e2b60b 100644 (file)
@@ -22,6 +22,7 @@
 #define __ardour_source_h__
 
 #include <string>
+#include <set>
 
 #include <sigc++/signal.h>
 
@@ -33,6 +34,7 @@
 namespace ARDOUR {
 
 class Session;
+class Playlist;
 
 class Source : public PBD::StatefulDestructible
 {
@@ -57,22 +59,34 @@ class Source : public PBD::StatefulDestructible
 
        virtual void mark_for_remove() = 0;
        virtual void mark_streaming_write_completed () = 0;
-
+       
        XMLNode& get_state ();
        int set_state (const XMLNode&);
        
+       void use () { _in_use++; }
+       void disuse () { if (_in_use) { _in_use--; } }
+       
+       void add_playlist (ARDOUR::Playlist*);
+       void remove_playlist (ARDOUR::Playlist*);
+
+       uint32_t used() const;
+
+       
        static sigc::signal<void,Source*> SourceCreated;
 
   protected:
        void update_length (jack_nframes_t pos, jack_nframes_t cnt);
-
+       
        Session&          _session;
        string            _name;
        DataType          _type;
        time_t            _timestamp;
        jack_nframes_t    _length;
 
+       std::set<ARDOUR::Playlist*> _playlists;
+
   private:
+       uint32_t          _in_use;
 };
 
 }
diff --git a/libs/ardour/ardour/state_manager.h b/libs/ardour/ardour/state_manager.h
deleted file mode 100644 (file)
index e123b2c..0000000
+++ /dev/null
@@ -1,56 +0,0 @@
-#ifndef __ardour_state_manager_h__
-#define __ardour_state_manager_h__
-
-#include <list>
-#include <string>
-#include <set>
-
-#include <sigc++/signal.h>
-
-#include <ardour/ardour.h>
-
-namespace ARDOUR {
-
-typedef uint32_t state_id_t;
-
-class StateManager : public virtual sigc::trackable
-{
-  public:
-       struct State {
-           std::string operation;
-           State (std::string why) : operation (why) {}
-           virtual ~State() {}
-       };
-
-       typedef std::list<State*> StateMap;
-
-       StateManager ();
-       virtual ~StateManager ();
-       
-       virtual void drop_all_states ();
-       virtual void use_state (state_id_t);
-       virtual void save_state (std::string why);
-
-       sigc::signal<void,Change> StateChanged;
-
-       state_id_t _current_state_id;
-
-       virtual bool should_save_state () const { return true; }
-
-       static void prohibit_save ();
-       static void allow_save (const char* why, bool dosave);
-
-  protected:
-       static bool _allow_save;
-       static sigc::signal<void,const char*> SaveAllowed;
-
-       StateMap   states;
-
-       virtual Change   restore_state (State&) = 0;
-       virtual State* state_factory (std::string why) const = 0;
-       virtual void   send_state_changed (Change);
-};
-
-} // namespace ARDOUR
-
-#endif /* __ardour_state_manager_h__ */
index 7cdbe56cf2839ab7b93a2372199dd26c5c353143..f8751b5d2bc8587a460179b0bf75cda1500ec16b 100644 (file)
@@ -34,7 +34,6 @@
 #include <sigc++/signal.h>
 
 #include <ardour/ardour.h>
-#include <ardour/state_manager.h>
 
 class XMLNode;
 
@@ -162,17 +161,7 @@ class TempoSection : public MetricSection, public Tempo {
 
 typedef list<MetricSection*> Metrics;
 
-class TempoMapState : public StateManager::State {
-  public:
-       TempoMapState (std::string why) 
-               : StateManager::State (why) {
-               metrics = new Metrics;
-       }
-
-       Metrics *metrics;
-};
-
-class TempoMap : public StateManager, public PBD::StatefulDestructible
+class TempoMap : public PBD::StatefulDestructible
 {
   public:
 
@@ -246,8 +235,6 @@ class TempoMap : public StateManager, public PBD::StatefulDestructible
        void dump (std::ostream&) const;
        void clear ();
 
-       UndoAction get_memento() const;
-
        /* this is a helper class that we use to be able to keep
           track of which meter *AND* tempo are in effect at
           a given point in time.
@@ -279,6 +266,8 @@ class TempoMap : public StateManager, public PBD::StatefulDestructible
        Metric metric_at (nframes_t) const;
         void bbt_time_with_metric (nframes_t, BBT_Time&, const Metric&) const;
 
+       sigc::signal<void,ARDOUR::Change> StateChanged;
+
   private:
        static Tempo    _default_tempo;
        static Meter    _default_meter;
@@ -309,16 +298,6 @@ class TempoMap : public StateManager, public PBD::StatefulDestructible
 
        int move_metric_section (MetricSection&, const BBT_Time& to);
        void do_insert (MetricSection* section);
-
-       Change  restore_state (StateManager::State&);
-       StateManager::State* state_factory (std::string why) const;
-
-       bool        in_set_state;
-
-       /* override state_manager::save_state so we can check in_set_state */
-
-       void save_state (std::string why);
-
 };
 
 }; /* namespace ARDOUR */
index 243d0db46d14f5108449bc9781a8fc0adaf32974..d7a2da2f469b0987efbfb2faf3d3a6229a2e4791 100644 (file)
@@ -39,6 +39,11 @@ class Track : public Route
        
        int set_name (string str, void *src);
 
+       TrackMode mode () const { return _mode; }
+       virtual int set_mode (TrackMode m) { return false; }
+       virtual bool can_use_mode (TrackMode m, bool& bounce_required) { return false; }
+       sigc::signal<void> TrackModeChanged;
+
        virtual int roll (nframes_t nframes, nframes_t start_frame, nframes_t end_frame, 
                nframes_t offset, int declick, bool can_record, bool rec_monitors_input) = 0;
        
@@ -57,9 +62,6 @@ class Track : public Route
        virtual int use_diskstream (string name) = 0;
        virtual int use_diskstream (const PBD::ID& id) = 0;
 
-       TrackMode mode() const { return _mode; }
-       void      set_mode (TrackMode m);
-
        nframes_t update_total_latency();
        void           set_latency_delay (nframes_t);
 
@@ -88,7 +90,6 @@ class Track : public Route
        
        void set_meter_point (MeterPoint, void* src);
        
-       sigc::signal<void> ModeChanged;
        sigc::signal<void> DiskstreamChanged;
        sigc::signal<void> FreezeChange;
 
index 61e5f35c95ce8bc24c95580ad5eaf82e5dbcce29..1138b5208f462b4ead8f9006c2341c5cadeb8f37 100644 (file)
@@ -89,11 +89,17 @@ namespace ARDOUR {
                Play = 0x4
        };
 
+       std::string auto_state_to_string (AutoState);
+       AutoState string_to_auto_state (std::string);
+
        enum AutoStyle {
                Absolute = 0x1,
                Trim = 0x2
        };
 
+       std::string auto_style_to_string (AutoStyle);
+       AutoStyle string_to_auto_style (std::string);
+
        enum AlignStyle {
                CaptureTime,
                ExistingMaterial
index 7b8246868c19f0fd38a497077e2e0f8737674ce7..8034341bccbf6e3b95a0bc40cdafff813212a137 100644 (file)
@@ -31,7 +31,6 @@
 #include <sigc++/signal.h>
 #include <pbd/stateful.h> 
 #include <jack/types.h>
-#include <ardour/plugin_state.h>
 #include <ardour/plugin.h>
 
 using std::string;
index f08d38a9b9c11f2880f66e84f46b33d3ae7a50df..9c5f5233b702c888c819b7f62559219982fb215a 100644 (file)
@@ -383,7 +383,7 @@ AudioDiskstream::setup_destructive_playlist ()
 void
 AudioDiskstream::use_destructive_playlist ()
 {
-       /* this is called from the XML-based constructor. when its done,
+       /* this is called from the XML-based constructor or ::set_destructive. when called,
           we already have a playlist and a region, but we need to
           set up our sources for write. we use the sources associated 
           with the (presumed single, full-extent) region.
@@ -402,6 +402,10 @@ AudioDiskstream::use_destructive_playlist ()
                throw failed_constructor();
        }
 
+       /* be sure to stretch the region out to the maximum length */
+
+       region->set_length (max_frames - region->position(), this);
+
        uint32_t n;
        ChannelList::iterator chan;
 
@@ -409,6 +413,10 @@ AudioDiskstream::use_destructive_playlist ()
                (*chan).write_source = boost::dynamic_pointer_cast<AudioFileSource>(region->source (n));
                assert((*chan).write_source);
                (*chan).write_source->set_allow_remove_if_empty (false);
+
+               /* this might be false if we switched modes, so force it */
+
+               (*chan).write_source->set_destructive (true);
        }
 
        /* the source list will never be reset for a destructive track */
@@ -1544,6 +1552,9 @@ AudioDiskstream::transport_stopped (struct tm& when, time_t twhen, bool abort_ca
 
        } else {
 
+               string whole_file_region_name;
+               whole_file_region_name = region_name_from_path (channels[0].write_source->name());
+
                /* Register a new region with the Session that
                   describes the entire source. Do this first
                   so that any sub-regions will obviously be
@@ -1552,7 +1563,7 @@ AudioDiskstream::transport_stopped (struct tm& when, time_t twhen, bool abort_ca
                
                try {
                        boost::shared_ptr<Region> rx (RegionFactory::create (srcs, channels[0].write_source->last_capture_start_frame(), total_capture, 
-                                                                            region_name_from_path (channels[0].write_source->name()), 
+                                                                            whole_file_region_name,
                                                                             0, AudioRegion::Flag (AudioRegion::DefaultFlags|AudioRegion::Automatic|AudioRegion::WholeFile)));
 
                        region = boost::dynamic_pointer_cast<AudioRegion> (rx);
@@ -1575,7 +1586,8 @@ AudioDiskstream::transport_stopped (struct tm& when, time_t twhen, bool abort_ca
                for (buffer_position = channels[0].write_source->last_capture_start_frame(), ci = capture_info.begin(); ci != capture_info.end(); ++ci) {
                        
                        string region_name;
-                       _session.region_name (region_name, channels[0].write_source->name(), false);
+
+                       _session.region_name (region_name, whole_file_region_name, false);
                        
                        // cerr << _name << ": based on ci of " << (*ci)->start << " for " << (*ci)->frames << " add region " << region_name << endl;
                        
@@ -1589,9 +1601,9 @@ AudioDiskstream::transport_stopped (struct tm& when, time_t twhen, bool abort_ca
                                continue; /* XXX is this OK? */
                        }
                        
-                       _last_capture_regions.push_back (region);
+                       region->GoingAway.connect (bind (mem_fun (*this, &Diskstream::remove_region_from_last_capture), boost::weak_ptr<Region>(region)));
                        
-                       // cerr << "add new region, buffer position = " << buffer_position << " @ " << (*ci)->start << endl;
+                       _last_capture_regions.push_back (region);
                        
                        i_am_the_modifier++;
                        _playlist->add_region (region, (*ci)->start);
@@ -2234,3 +2246,70 @@ AudioDiskstream::use_pending_capture_data (XMLNode& node)
 
        return 0;
 }
+
+int
+AudioDiskstream::set_destructive (bool yn)
+{
+       bool bounce_ignored;
+
+       if (yn != destructive()) {
+               
+               if (yn) {
+                       /* requestor should already have checked this and
+                          bounced if necessary and desired 
+                       */
+                       if (!can_become_destructive (bounce_ignored)) {
+                               return -1;
+                       }
+                       _flags |= Destructive;
+                       use_destructive_playlist ();
+               } else {
+                       _flags &= ~Destructive;
+                       reset_write_sources (true, true);
+               }
+       }
+
+       return 0;
+}
+
+bool
+AudioDiskstream::can_become_destructive (bool& requires_bounce) const
+{
+       if (!_playlist) {
+               requires_bounce = false;
+               return false;
+       }
+
+       /* is there only one region ? */
+
+       if (_playlist->n_regions() != 1) {
+               requires_bounce = true;
+               return false;
+       }
+
+       boost::shared_ptr<Region> first = _playlist->find_next_region (_session.current_start_frame(), Start, 1);
+       assert (first);
+
+       /* do the source(s) for the region cover the session start position ? */
+       
+       if (first->position() != _session.current_start_frame()) {
+               if (first->start() > _session.current_start_frame()) {
+                       requires_bounce = true;
+                       return false;
+               }
+       }
+
+       /* is the source used by only 1 playlist ? */
+
+       boost::shared_ptr<AudioRegion> afirst = boost::dynamic_pointer_cast<AudioRegion> (first);
+
+       assert (afirst);
+
+       if (afirst->source()->used() > 1) {
+               requires_bounce = true; 
+               return false;
+       }
+
+       requires_bounce = false;
+       return true;
+}
index 94b80df178e599efd25c6f9aa32bd4fde635b2f1..335cb020ae07cb1f33edd9d14d716ece9f9b2275 100644 (file)
@@ -546,7 +546,7 @@ AudioPlaylist::set_state (const XMLNode& node)
        }
 
        thaw ();
-       in_set_state++;
+       in_set_state--;
 
        return 0;
 }
@@ -639,12 +639,10 @@ AudioPlaylist::destroy_region (boost::shared_ptr<Region> region)
 
        { 
                RegionLock rlock (this);
-               RegionList::iterator i;
-               RegionList::iterator tmp;
 
-               for (i = regions.begin(); i != regions.end(); ) {
+               for (RegionList::iterator i = regions.begin(); i != regions.end(); ) {
                        
-                       tmp = i;
+                       RegionList::iterator tmp = i;
                        ++tmp;
                        
                        if ((*i) == region) {
@@ -654,6 +652,21 @@ AudioPlaylist::destroy_region (boost::shared_ptr<Region> region)
                        
                        i = tmp;
                }
+
+               for (set<boost::shared_ptr<Region> >::iterator x = all_regions.begin(); x != all_regions.end(); ) {
+
+                       set<boost::shared_ptr<Region> >::iterator xtmp = x;
+                       ++xtmp;
+                       
+                       if ((*x) == region) {
+                               all_regions.erase (x);
+                               changed = true;
+                       }
+                       
+                       x = xtmp;
+               }
+
+               region->set_playlist (0);
        }
 
        for (c = _crossfades.begin(); c != _crossfades.end(); ) {
index a6cbce2c1e912d58a1deb4967a191616ca72cf43..f2681acebaffb4c0115129c5879f6a06d8e4bed2 100644 (file)
@@ -65,13 +65,44 @@ AudioTrack::AudioTrack (Session& sess, string name, Route::Flag flag, TrackMode
 AudioTrack::AudioTrack (Session& sess, const XMLNode& node)
        : Track (sess, node)
 {
-       set_state (node);
+       _set_state (node, false);
 }
 
 AudioTrack::~AudioTrack ()
 {
 }
 
+int
+AudioTrack::set_mode (TrackMode m)
+{
+       if (m != _mode) {
+
+               if (_diskstream->set_destructive (m == Destructive)) {
+                       return -1;
+               }
+
+               _mode = m;
+               
+               TrackModeChanged (); /* EMIT SIGNAL */
+       }
+
+       return 0;
+}
+
+bool
+AudioTrack::can_use_mode (TrackMode m, bool& bounce_required)
+{
+       switch (m) {
+       case Normal:
+               bounce_required = false;
+               return true;
+               
+       case Destructive:
+       default:
+               return _diskstream->can_become_destructive (bounce_required);
+       }
+}
+
 int
 AudioTrack::deprecated_use_diskstream_connections ()
 {
@@ -88,10 +119,10 @@ AudioTrack::deprecated_use_diskstream_connections ()
 
        diskstream->deprecated_io_node = 0;
 
-       set_input_minimum (-1);
-       set_input_maximum (-1);
-       set_output_minimum (-1);
-       set_output_maximum (-1);
+       set_input_minimum (ChanCount::ZERO);
+       set_input_maximum (ChanCount::INFINITE);
+       set_output_minimum (ChanCount::ZERO);
+       set_output_maximum (ChanCount::INFINITE);
        
        if ((prop = node.property ("gain")) != 0) {
                set_gain (atof (prop->value().c_str()), this);
@@ -187,12 +218,20 @@ AudioTrack::audio_diskstream() const
 
 int
 AudioTrack::set_state (const XMLNode& node)
+{
+       return _set_state (node, true);
+}
+
+int
+AudioTrack::_set_state (const XMLNode& node, bool call_base)
 {
        const XMLProperty *prop;
        XMLNodeConstIterator iter;
 
-       if (Route::set_state (node)) {
-               return -1;
+       if (call_base) {
+               if (Route::_set_state (node, call_base)) {
+                       return -1;
+               }
        }
 
        if ((prop = node.property (X_("mode"))) != 0) {
@@ -494,6 +533,16 @@ AudioTrack::roll (nframes_t nframes, nframes_t start_frame, nframes_t end_frame,
        nframes_t transport_frame;
        boost::shared_ptr<AudioDiskstream> diskstream = audio_diskstream();
        
+       {
+               Glib::RWLock::ReaderLock lm (redirect_lock, Glib::TRY_LOCK);
+               if (lm.locked()) {
+                       // automation snapshot can also be called from the non-rt context
+                       // and it uses the redirect list, so we take the lock out here
+                       automation_snapshot (start_frame);
+               }
+       }
+
+       
        if (n_outputs().get_total() == 0 && _redirects.empty()) {
                return 0;
        }
@@ -761,7 +810,7 @@ AudioTrack::freeze (InterThreadInfo& itt)
                return;
        }
 
-       if (_session.write_one_audio_track (*this, 0, _session.current_end_frame(), true, srcs, itt)) {
+       if (_session.write_one_audio_track (*this, _session.current_start_frame(), _session.current_end_frame(), true, srcs, itt)) {
                return;
        }
 
@@ -780,8 +829,7 @@ AudioTrack::freeze (InterThreadInfo& itt)
                                FreezeRecordInsertInfo* frii  = new FreezeRecordInsertInfo ((*r)->get_state(), insert);
                                
                                frii->id = insert->id();
-                               frii->memento = (*r)->get_memento();
-                               
+
                                _freeze_record.insert_info.push_back (frii);
                                
                                /* now deactivate the insert */
@@ -802,7 +850,7 @@ AudioTrack::freeze (InterThreadInfo& itt)
                                                                 false));
 
        new_playlist->set_orig_diskstream_id (diskstream->id());
-       new_playlist->add_region (region, 0);
+       new_playlist->add_region (region, _session.current_start_frame());
        new_playlist->set_frozen (true);
        region->set_locked (true);
 
index 70541fce55627a27dfd81da7c3dd7de56cdcb4c6..b0cd64c8d1f304e04d85af7ddc176ed4b57ddf2e 100644 (file)
@@ -21,6 +21,7 @@
 #include <unistd.h>
 #include <cerrno>
 #include <vector>
+#include <exception>
 
 #include <glibmm/timer.h>
 #include <pbd/pthread_utils.h>
index 3078521466a0fe6b54c72ce8edf1b4510a15421c..16cb990ec22ed70c43d32e6ea207339f913fa8ca 100644 (file)
@@ -36,7 +36,6 @@
 #include <ardour/audiofilesource.h>
 #include <ardour/sndfile_helpers.h>
 #include <ardour/sndfilesource.h>
-#include <ardour/destructive_filesource.h>
 #include <ardour/session.h>
 #include <ardour/source_factory.h>
 
@@ -66,6 +65,7 @@ AudioFileSource::AudioFileSource (Session& s, string idstr, Flag flags)
        : AudioSource (s, idstr), _flags (flags)
 {
        /* constructor used for existing external to session files. file must exist already */
+       _is_embedded = AudioFileSource::determine_embeddedness (idstr);
 
        if (init (idstr, true)) {
                throw failed_constructor ();
@@ -77,6 +77,7 @@ AudioFileSource::AudioFileSource (Session& s, std::string path, Flag flags, Samp
        : AudioSource (s, path), _flags (flags)
 {
        /* constructor used for new internal-to-session files. file cannot exist */
+       _is_embedded = false;
 
        if (init (path, false)) {
                throw failed_constructor ();
@@ -105,6 +106,12 @@ AudioFileSource::~AudioFileSource ()
        }
 }
 
+bool
+AudioFileSource::determine_embeddedness (std::string path)
+{
+       return (path.find("/") == 0);
+}
+
 bool
 AudioFileSource::removable () const
 {
@@ -170,80 +177,16 @@ bool
 AudioFileSource::get_soundfile_info (string path, SoundFileInfo& _info, string& error_msg)
 {
 #ifdef HAVE_COREAUDIO
-       OSStatus err = noErr;
-    FSRef ref; 
-       ExtAudioFileRef af = 0;
-       size_t size;
-    CFStringRef name;
-
-    err = FSPathMakeRef ((UInt8*)path.c_str(), &ref, 0);
-       if (err != noErr) {
-        ExtAudioFileDispose (af);
-               goto libsndfile;
-       }
-
-       err = ExtAudioFileOpen(&ref, &af);
-       if (err != noErr) {
-        ExtAudioFileDispose (af);
-               goto libsndfile;
+       if (CoreAudioSource::get_soundfile_info (path, _info, error_msg) == 0) {
+               return true;
        }
-
-       AudioStreamBasicDescription absd;
-       memset(&absd, 0, sizeof(absd));
-       size = sizeof(AudioStreamBasicDescription);
-       err = ExtAudioFileGetProperty(af,
-                       kExtAudioFileProperty_FileDataFormat, &size, &absd);
-       if (err != noErr) {
-        ExtAudioFileDispose (af);
-               goto libsndfile;
-       }
-
-       _info.samplerate = absd.mSampleRate;
-       _info.channels   = absd.mChannelsPerFrame;
-
-    size = sizeof(_info.length);
-    err = ExtAudioFileGetProperty(af, kExtAudioFileProperty_FileLengthFrames, &size, &_info.length);
-    if (err != noErr) {
-        ExtAudioFileDispose (af);
-               goto libsndfile;
-    }
-
-       size = sizeof(CFStringRef);
-       err = AudioFormatGetProperty(
-                       kAudioFormatProperty_FormatName, sizeof(absd), &absd, &size, &name);
-       if (err != noErr) {
-        ExtAudioFileDispose (af);
-               goto libsndfile;
-       }
-
-       _info.format_name = CFStringRefToStdString(name);
-
-    ExtAudioFileDispose (af);
-       return true;
-       
-libsndfile:
 #endif // HAVE_COREAUDIO
 
-       SNDFILE *sf;
-       SF_INFO sf_info;
-
-       sf_info.format = 0; // libsndfile says to clear this before sf_open().
-
-       if ((sf = sf_open ((char*) path.c_str(), SFM_READ, &sf_info)) == 0) { 
-               char errbuf[256];
-               error_msg = sf_error_str (0, errbuf, sizeof (errbuf) - 1);
-               return false;
+       if (SndFileSource::get_soundfile_info (path, _info, error_msg) != 0) {
+               return true;
        }
 
-       sf_close (sf);
-
-       _info.samplerate  = sf_info.samplerate;
-       _info.channels    = sf_info.channels;
-       _info.length      = sf_info.frames;
-       _info.format_name = string_compose("Format: %1, %2",
-                                          sndfile_major_format(sf_info.format),
-                                          sndfile_minor_format(sf_info.format));
-       return true;
+       return false;
 }
 
 XMLNode&
@@ -277,6 +220,17 @@ AudioFileSource::set_state (const XMLNode& node)
 
        }
 
+       if ((prop = node.property (X_("name"))) != 0) {
+               _is_embedded = AudioFileSource::determine_embeddedness (prop->value());
+       } else {
+               _is_embedded = false;
+       }
+
+       if ((prop = node.property (X_("destructive"))) != 0) {
+               /* old style, from the period when we had DestructiveFileSource */
+               _flags = Flag (_flags | Destructive);
+       }
+
        return 0;
 }
 
@@ -318,6 +272,11 @@ AudioFileSource::mark_take (string id)
 int
 AudioFileSource::move_to_trash (const string trash_dir_name)
 {
+       if (is_embedded()) {
+               cerr << "tried to move an embedded region to trash" << endl;
+               return -1;
+       }
+
        string newpath;
 
        if (!writable()) {
@@ -465,7 +424,11 @@ AudioFileSource::find (string pathstr, bool must_exist, bool& isnew)
                /* external files and/or very very old style sessions include full paths */
                
                _path = pathstr;
-               _name = pathstr.substr (pathstr.find_last_of ('/') + 1);
+               if (is_embedded()) {
+                       _name = pathstr;
+               } else {
+                       _name = pathstr.substr (pathstr.find_last_of ('/') + 1);
+               }
                
                if (access (_path.c_str(), R_OK) != 0) {
 
@@ -521,7 +484,7 @@ AudioFileSource::handle_header_position_change ()
 }
 
 void
-AudioFileSource::set_timeline_position (nframes_t pos)
+AudioFileSource::set_timeline_position (int64_t pos)
 {
        timeline_position = pos;
 }
index 0f4e3807b14d68832c044903fed2a15cc6a567dd..939f9c02dd083b95198d2e7aa48ba6ec87841e14 100644 (file)
@@ -75,7 +75,7 @@ AudioRegion::AudioRegion (boost::shared_ptr<AudioSource> src, nframes_t start, n
        set_default_fades ();
        set_default_envelope ();
 
-       _envelope.StateChanged.connect (mem_fun (*this, &AudioRegion::envelope_changed));
+       listen_to_my_curves ();
 }
 
 /* Basic AudioRegion constructor (one channel) */
@@ -95,7 +95,7 @@ AudioRegion::AudioRegion (boost::shared_ptr<AudioSource> src, nframes_t start, n
        set_default_fades ();
        set_default_envelope ();
 
-       _envelope.StateChanged.connect (mem_fun (*this, &AudioRegion::envelope_changed));
+       listen_to_my_curves ();
 }
 
 /* Basic AudioRegion constructor (many channels) */
@@ -110,7 +110,7 @@ AudioRegion::AudioRegion (SourceList& srcs, nframes_t start, nframes_t length, c
        set_default_fades ();
        set_default_envelope ();
 
-       _envelope.StateChanged.connect (mem_fun (*this, &AudioRegion::envelope_changed));
+       listen_to_my_curves ();
 }
 
 
@@ -148,7 +148,7 @@ AudioRegion::AudioRegion (boost::shared_ptr<const AudioRegion> other, nframes_t
 
        _scale_amplitude = other->_scale_amplitude;
 
-       _envelope.StateChanged.connect (mem_fun (*this, &AudioRegion::envelope_changed));
+       listen_to_my_curves ();
        
        assert(_type == DataType::AUDIO);
 }
@@ -165,7 +165,7 @@ AudioRegion::AudioRegion (boost::shared_ptr<const AudioRegion> other)
        _fade_in_disabled = 0;
        _fade_out_disabled = 0;
        
-       _envelope.StateChanged.connect (mem_fun (*this, &AudioRegion::envelope_changed));
+       listen_to_my_curves ();
 
        assert(_type == DataType::AUDIO);
 }
@@ -187,7 +187,7 @@ AudioRegion::AudioRegion (boost::shared_ptr<AudioSource> src, const XMLNode& nod
                throw failed_constructor();
        }
 
-       _envelope.StateChanged.connect (mem_fun (*this, &AudioRegion::envelope_changed));
+       listen_to_my_curves ();
 
        assert(_type == DataType::AUDIO);
 }
@@ -205,16 +205,69 @@ AudioRegion::AudioRegion (SourceList& srcs, const XMLNode& node)
                throw failed_constructor();
        }
 
-       _envelope.StateChanged.connect (mem_fun (*this, &AudioRegion::envelope_changed));
+       listen_to_my_curves ();
 
        assert(_type == DataType::AUDIO);
 }
 
 AudioRegion::~AudioRegion ()
 {
-       cerr << "====== " << _name << " DESTRUCTOR @ " << this << endl;
-       notify_callbacks ();
-       GoingAway (); /* EMIT SIGNAL */
+}
+
+void
+AudioRegion::listen_to_my_curves ()
+{
+       _envelope.StateChanged.connect (mem_fun (*this, &AudioRegion::envelope_changed));
+       _fade_in.StateChanged.connect (mem_fun (*this, &AudioRegion::fade_in_changed));
+       _fade_out.StateChanged.connect (mem_fun (*this, &AudioRegion::fade_out_changed));
+}
+
+bool
+AudioRegion::verify_length (nframes_t len)
+{
+       boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(source());
+
+       if (afs && afs->destructive()) {
+               return true;
+       } else {
+               return Region::verify_length(len);
+       }
+}
+
+bool
+AudioRegion::verify_start_and_length (nframes_t new_start, nframes_t new_length)
+{
+       boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(source());
+
+       if (afs && afs->destructive()) {
+               return true;
+       } else {
+               return verify_start_and_length(new_start, new_length);
+       }
+}
+
+bool
+AudioRegion::verify_start (nframes_t pos)
+{
+       boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(source());
+
+       if (afs && afs->destructive()) {
+               return true;
+       } else {
+               return verify_start(pos);
+       }
+}
+
+bool
+AudioRegion::verify_start_mutable (nframes_t& new_start)
+{
+       boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(source());
+
+       if (afs && afs->destructive()) {
+               return true;
+       } else {
+               return verify_start_mutable(new_start);
+       }
 }
 
 void
@@ -239,7 +292,7 @@ AudioRegion::read_peaks (PeakData *buf, nframes_t npeaks, nframes_t offset, nfra
        if (chan_n >= _sources.size()) {
                return 0; 
        }
-       
+
        if (audio_source(chan_n)->read_peaks (buf, npeaks, offset, cnt, samples_per_unit)) {
                return 0;
        } else {
@@ -450,7 +503,7 @@ AudioRegion::state (bool full)
                if ((_flags & DefaultFadeIn)) {
                        child->add_property (X_("default"), X_("yes"));
                } else {
-                       _fade_in.store_state (*child);
+                       child->add_child_nocopy (_fade_in.get_state ());
                }
 
                child->add_property (X_("active"), _fade_in_disabled ? X_("no") : X_("yes"));
@@ -460,9 +513,9 @@ AudioRegion::state (bool full)
                if ((_flags & DefaultFadeOut)) {
                        child->add_property (X_("default"), X_("yes"));
                } else {
-                       _fade_out.store_state (*child);
+                       child->add_child_nocopy (_fade_out.get_state ());
                }
-
+               
                child->add_property (X_("active"), _fade_out_disabled ? X_("no") : X_("yes"));
        }
        
@@ -473,6 +526,7 @@ AudioRegion::state (bool full)
                
                // If there are only two points, the points are in the start of the region and the end of the region
                // so, if they are both at 1.0f, that means the default region.
+
                if (_envelope.size() == 2 &&
                    _envelope.front()->value == 1.0f &&
                    _envelope.back()->value==1.0f) {
@@ -484,7 +538,7 @@ AudioRegion::state (bool full)
                if (default_env) {
                        child->add_property ("default", "yes");
                } else {
-                       _envelope.store_state (*child);
+                       child->add_child_nocopy (_envelope.get_state ());
                }
 
        } else {
@@ -545,34 +599,28 @@ AudioRegion::set_live_state (const XMLNode& node, Change& what_changed, bool sen
                        
                        _envelope.clear ();
 
-                       if ((prop = child->property ("default")) != 0) {
+                       if ((prop = child->property ("default")) != 0 || _envelope.set_state (*child)) {
                                set_default_envelope ();
-                       } else {
-                               _envelope.load_state (*child);
                        }
 
                        _envelope.set_max_xval (_length);
                        _envelope.truncate_end (_length);
-                       
+
                } else if (child->name() == "FadeIn") {
                        
                        _fade_in.clear ();
                        
-                       if ((prop = child->property ("default")) != 0 || (prop = child->property ("steepness")) != 0) {
+                       if ((prop = child->property ("default")) != 0 || (prop = child->property ("steepness")) != 0 || _fade_in.set_state (*child)) {
                                set_default_fade_in ();
-                       } else {
-                               _fade_in.load_state (*child);
-                       }
+                       } 
 
                } else if (child->name() == "FadeOut") {
                        
                        _fade_out.clear ();
 
-                       if ((prop = child->property ("default")) != 0 || (prop = child->property ("steepness")) != 0) {
+                       if ((prop = child->property ("default")) != 0 || (prop = child->property ("steepness")) != 0 || _fade_out.set_state (*child)) {
                                set_default_fade_out ();
-                       } else {
-                               _fade_out.load_state (*child);
-                       }
+                       } 
                } 
        }
 
@@ -1030,7 +1078,19 @@ AudioRegion::normalize_to (float target_dB)
 }
 
 void
-AudioRegion::envelope_changed (Change ignored)
+AudioRegion::fade_in_changed ()
+{
+       send_change (FadeInChanged);
+}
+
+void
+AudioRegion::fade_out_changed ()
+{
+       send_change (FadeOutChanged);
+}
+
+void
+AudioRegion::envelope_changed ()
 {
        send_change (EnvelopeChanged);
 }
@@ -1083,8 +1143,10 @@ AudioRegion::speed_mismatch (float sr) const
 void
 AudioRegion::source_offset_changed ()
 {
-       if (boost::dynamic_pointer_cast<DestructiveFileSource>(_sources.front())) {
-               set_start (source()->natural_position(), this);
+       boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(_sources.front());
+
+       if (afs && afs->destructive()) {
+               // set_start (source()->natural_position(), this);
                set_position (source()->natural_position(), this);
        } 
 }
index 419fe9240c6c8b35c48417da117d65e2ed658d00..93165b7fe4a13fcd0a330189f3fb015f800d6be1 100644 (file)
@@ -368,26 +368,29 @@ AudioSource::initialize_peakfile (bool newfile, string audio_path)
                                error << string_compose(_("AudioSource: cannot stat peakfile \"%1\""), peakpath) << endmsg;
                                return -1;
                        }
-               } else {
                        
-                       /* we found it in the peaks dir */
-               }
-               
-               if (statbuf.st_size == 0) {
                        _peaks_built = false;
+
                } else {
-                       // Check if the audio file has changed since the peakfile was built.
-                       struct stat stat_file;
-                       int err = stat (audio_path.c_str(), &stat_file);
                        
-                       if (!err && stat_file.st_mtime > statbuf.st_mtime){
+                       /* we found it in the peaks dir, so check it out */
+
+                       if (statbuf.st_size == 0) {
                                _peaks_built = false;
                        } else {
-                               _peaks_built = true;
+                               // Check if the audio file has changed since the peakfile was built.
+                               struct stat stat_file;
+                               int err = stat (audio_path.c_str(), &stat_file);
+                               
+                               if (!err && stat_file.st_mtime > statbuf.st_mtime){
+                                       _peaks_built = false;
+                               } else {
+                                       _peaks_built = true;
+                               }
                        }
                }
        }
-       
+
        if (!newfile && !_peaks_built && _build_missing_peakfiles && _build_peakfiles) {
                build_peaks_from_scratch ();
        } 
index f286b11607319cd7b10931088176d8871aca2a83..5cc2f50e386d60cf4bde0aebfaef860b76d1d426 100644 (file)
 #include <climits>
 #include <float.h>
 #include <cmath>
+#include <sstream>
 #include <algorithm>
 #include <sigc++/bind.h>
 #include <ardour/automation_event.h>
+#include <pbd/convert.h>
 
 #include "i18n.h"
 
@@ -46,14 +48,13 @@ static void dumpit (const AutomationList& al, string prefix = "")
 }
 #endif
 
-AutomationList::AutomationList (double defval, bool with_state)
+AutomationList::AutomationList (double defval)
 {
        _frozen = false;
        changed_when_thawed = false;
        _state = Off;
        _style = Absolute;
        _touching = false;
-       no_state = with_state;
        min_yval = FLT_MIN;
        max_yval = FLT_MAX;
        max_xval = 0; // means "no limit" 
@@ -63,10 +64,6 @@ AutomationList::AutomationList (double defval, bool with_state)
        lookup_cache.left = -1;
        lookup_cache.range.first = events.end();
 
-       if (!no_state) {
-               save_state (_("initial"));
-       }
-
         AutomationListCreated(this);
 }
 
@@ -83,7 +80,6 @@ AutomationList::AutomationList (const AutomationList& other)
        _touching = other._touching;
        _dirty = false;
        rt_insertion_point = events.end();
-       no_state = other.no_state;
        lookup_cache.left = -1;
        lookup_cache.range.first = events.end();
 
@@ -111,7 +107,6 @@ AutomationList::AutomationList (const AutomationList& other, double start, doubl
        _touching = other._touching;
        _dirty = false;
        rt_insertion_point = events.end();
-       no_state = other.no_state;
        lookup_cache.left = -1;
        lookup_cache.range.first = events.end();
 
@@ -128,32 +123,36 @@ AutomationList::AutomationList (const AutomationList& other, double start, doubl
        delete section;
 
        mark_dirty ();
+
         AutomationListCreated(this);
 }
 
-AutomationList::~AutomationList()
+AutomationList::AutomationList (const XMLNode& node)
 {
-       std::set<ControlEvent*> all_events;
-       AutomationList::State* asp;
+       _frozen = false;
+       changed_when_thawed = false;
+       _touching = false;
+       min_yval = FLT_MIN;
+       max_yval = FLT_MAX;
+       max_xval = 0; // means "no limit" 
+       _dirty = false;
+       _state = Off;
+       _style = Absolute;
+       rt_insertion_point = events.end();
+       lookup_cache.left = -1;
+       lookup_cache.range.first = events.end();
+       
+       set_state (node);
 
-       GoingAway ();
+        AutomationListCreated(this);
+}
 
+AutomationList::~AutomationList()
+{
+       GoingAway ();
+       
        for (AutomationEventList::iterator x = events.begin(); x != events.end(); ++x) {
-               all_events.insert (*x);
-       }
-
-       for (StateMap::iterator i = states.begin(); i != states.end(); ++i) {
-
-               if ((asp = dynamic_cast<AutomationList::State*> (*i)) != 0) {
-                       
-                       for (AutomationEventList::iterator x = asp->events.begin(); x != asp->events.end(); ++x) {
-                               all_events.insert (*x);
-                       }
-               }
-       }
-
-       for (std::set<ControlEvent*>::iterator i = all_events.begin(); i != all_events.end(); ++i) {
-               delete (*i);
+               delete (*x);
        }
 }
 
@@ -194,7 +193,7 @@ AutomationList::maybe_signal_changed ()
        if (_frozen) {
                changed_when_thawed = true;
        } else {
-               StateChanged (Change (0));
+               StateChanged ();
        }
 }
 
@@ -236,9 +235,6 @@ AutomationList::clear ()
        {
                Glib::Mutex::Lock lm (lock);
                events.clear ();
-               if (!no_state) {
-                       save_state (_("cleared"));
-               }
                mark_dirty ();
        }
 
@@ -270,7 +266,6 @@ void AutomationList::_x_scale (double factor)
                (*i)->when = floor ((*i)->when * factor);
        }
 
-       save_state ("x-scaled");
        mark_dirty ();
 }
 
@@ -370,12 +365,19 @@ AutomationList::rt_add (double when, double value)
        maybe_signal_changed ();
 }
 
+void
+AutomationList::fast_simple_add (double when, double value)
+{
+       /* to be used only for loading pre-sorted data from saved state */
+       events.insert (events.end(), point_factory (when, value));
+}
+
 #undef last_rt_insertion_point
 
 void
-AutomationList::add (double when, double value, bool for_loading)
+AutomationList::add (double when, double value)
 {
-       /* this is for graphical editing and loading data from storage */
+       /* this is for graphical editing */
 
        {
                Glib::Mutex::Lock lm (lock);
@@ -407,15 +409,9 @@ AutomationList::add (double when, double value, bool for_loading)
                } 
 
                mark_dirty ();
-
-               if (!no_state && !for_loading) {
-                       save_state (_("added event"));
-               }
        }
 
-       if (!for_loading) {
-               maybe_signal_changed ();
-       }
+       maybe_signal_changed ();
 }
 
 void
@@ -425,9 +421,6 @@ AutomationList::erase (AutomationList::iterator i)
                Glib::Mutex::Lock lm (lock);
                events.erase (i);
                reposition_for_rt_add (0);
-               if (!no_state) {
-                       save_state (_("removed event"));
-               }
                mark_dirty ();
        }
        maybe_signal_changed ();
@@ -440,9 +433,6 @@ AutomationList::erase (AutomationList::iterator start, AutomationList::iterator
                Glib::Mutex::Lock lm (lock);
                events.erase (start, end);
                reposition_for_rt_add (0);
-               if (!no_state) {
-                       save_state (_("removed multiple events"));
-               }
                mark_dirty ();
        }
        maybe_signal_changed ();
@@ -471,10 +461,6 @@ AutomationList::reset_range (double start, double endt)
                        
                        reset = true;
 
-                       if (!no_state) {
-                               save_state (_("removed range"));
-                       }
-
                        mark_dirty ();
                }
        }
@@ -502,9 +488,6 @@ AutomationList::erase_range (double start, double endt)
                        events.erase (s, e);
                        reposition_for_rt_add (0);
                        erased = true;
-                       if (!no_state) {
-                               save_state (_("removed range"));
-                       }
                        mark_dirty ();
                }
                
@@ -532,10 +515,6 @@ AutomationList::move_range (iterator start, iterator end, double xdelta, double
                        ++start;
                }
 
-               if (!no_state) {
-                       save_state (_("event range adjusted"));
-               }
-
                mark_dirty ();
        }
 
@@ -554,10 +533,6 @@ AutomationList::modify (iterator iter, double when, double val)
                Glib::Mutex::Lock lm (lock);
                (*iter)->when = when;
                (*iter)->value = val;
-               if (!no_state) {
-                       save_state (_("event adjusted"));
-               }
-
                mark_dirty ();
        }
        
@@ -609,44 +584,10 @@ AutomationList::thaw ()
 {
        _frozen = false;
        if (changed_when_thawed) {
-                StateChanged(Change(0)); /* EMIT SIGNAL */
+               StateChanged(); /* EMIT SIGNAL */
        }
 }
 
-StateManager::State*
-AutomationList::state_factory (std::string why) const
-{
-       State* state = new State (why);
-
-       for (AutomationEventList::const_iterator x = events.begin(); x != events.end(); ++x) {
-               state->events.push_back (point_factory (**x));
-       }
-
-       return state;
-}
-
-Change
-AutomationList::restore_state (StateManager::State& state) 
-{
-       {
-               Glib::Mutex::Lock lm (lock);
-               State* lstate = dynamic_cast<State*> (&state);
-
-               events.clear ();
-               for (AutomationEventList::const_iterator x = lstate->events.begin(); x != lstate->events.end(); ++x) {
-                       events.push_back (point_factory (**x));
-               }
-       }
-
-       return Change (0);
-}
-
-UndoAction
-AutomationList::get_memento () const
-{
-  return sigc::bind (mem_fun (*(const_cast<AutomationList*> (this)), &StateManager::use_state), _current_state_id);
-}
-
 void
 AutomationList::set_max_xval (double x)
 {
@@ -670,10 +611,6 @@ AutomationList::truncate_end (double last_coordinate)
                double last_val;
 
                if (events.empty()) {
-                       fatal << _("programming error:")
-                             << "AutomationList::truncate_end() called on an empty list"
-                             << endmsg;
-                       /*NOTREACHED*/
                        return;
                }
 
@@ -1083,9 +1020,6 @@ AutomationList::cut_copy_clear (double start, double end, int op)
 
                if (changed) {
                        reposition_for_rt_add (0);
-                       if (!no_state) {
-                               save_state (_("cut/copy/clear"));
-                       }
                }
 
                mark_dirty ();
@@ -1115,10 +1049,6 @@ AutomationList::copy (iterator start, iterator end)
                        
                        x = tmp;
                }
-
-               if (!no_state) {
-                       save_state (_("copy"));
-               }
        }
 
        return nal;
@@ -1183,11 +1113,6 @@ AutomationList::paste (AutomationList& alist, double pos, float times)
                }
 
                reposition_for_rt_add (0);
-
-               if (!no_state) {
-                       save_state (_("paste"));
-               }
-
                mark_dirty ();
        }
 
@@ -1207,64 +1132,220 @@ AutomationList::point_factory (const ControlEvent& other) const
        return new ControlEvent (other);
 }
 
-void
-AutomationList::store_state (XMLNode& node) const
+XMLNode&
+AutomationList::get_state ()
 {
+       return state (true);
+}
+
+XMLNode&
+AutomationList::state (bool full)
+{
+       XMLNode* root = new XMLNode (X_("AutomationList"));
+       char buf[64];
        LocaleGuard lg (X_("POSIX"));
 
-       for (const_iterator i = const_begin(); i != const_end(); ++i) {
-               char buf[64];
-               
-               XMLNode *pointnode = new XMLNode ("point");
-               
-               snprintf (buf, sizeof (buf), "%" PRIu32, (nframes_t) floor ((*i)->when));
-               pointnode->add_property ("x", buf);
-               snprintf (buf, sizeof (buf), "%.12g", (*i)->value);
-               pointnode->add_property ("y", buf);
+       root->add_property ("id", _id.to_s());
 
-               node.add_child_nocopy (*pointnode);
+       snprintf (buf, sizeof (buf), "%.12g", default_value);
+       root->add_property ("default", buf);
+       snprintf (buf, sizeof (buf), "%.12g", min_yval);
+       root->add_property ("min_yval", buf);
+       snprintf (buf, sizeof (buf), "%.12g", max_yval);
+       root->add_property ("max_yval", buf);
+       snprintf (buf, sizeof (buf), "%.12g", max_xval);
+       root->add_property ("max_xval", buf);
+
+       if (full) {
+               root->add_property ("state", auto_state_to_string (_state));
+       } else {
+               /* never save anything but Off for automation state to a template */
+               root->add_property ("state", auto_state_to_string (Off));
        }
+
+       root->add_property ("style", auto_style_to_string (_style));
+
+       if (!events.empty()) {
+               root->add_child_nocopy (serialize_events());
+       }
+
+       return *root;
 }
 
-void
-AutomationList::load_state (const XMLNode& node)
+XMLNode&
+AutomationList::serialize_events ()
 {
-       const XMLNodeList& elist = node.children();
-       XMLNodeConstIterator i;
-       XMLProperty* prop;
-       nframes_t x;
-       double y;
+       XMLNode* node = new XMLNode (X_("events"));
+       stringstream str;
+
+       for (iterator xx = events.begin(); xx != events.end(); ++xx) {
+               str << (double) (*xx)->when;
+               str << ' ';
+               str <<(double) (*xx)->value;
+               str << '\n';
+       }
+
+       /* XML is a bit wierd */
+
+       XMLNode* content_node = new XMLNode (X_("foo")); /* it gets renamed by libxml when we set content */
+       content_node->set_content (str.str());
+
+       node->add_child_nocopy (*content_node);
+
+       return *node;
+}
+
+int
+AutomationList::deserialize_events (const XMLNode& node)
+{
+       if (node.children().empty()) {
+               return -1;
+       }
+
+       XMLNode* content_node = node.children().front();
 
+       if (content_node->content().empty()) {
+               return -1;
+       }
+
+       freeze ();
        clear ();
        
-       for (i = elist.begin(); i != elist.end(); ++i) {
-               
-               if ((prop = (*i)->property ("x")) == 0) {
-                       error << _("automation list: no x-coordinate stored for control point (point ignored)") << endmsg;
-                       continue;
+       stringstream str (content_node->content());
+       
+       double x;
+       double y;
+       bool ok = true;
+       
+       while (str) {
+               str >> x;
+               if (!str) {
+                       break;
                }
-               x = atoi (prop->value().c_str());
-               
-               if ((prop = (*i)->property ("y")) == 0) {
-                       error << _("automation list: no y-coordinate stored for control point (point ignored)") << endmsg;
-                       continue;
+               str >> y;
+               if (!str) {
+                       ok = false;
+                       break;
                }
-               y = atof (prop->value().c_str());
-               
-               add (x, y);
+               fast_simple_add (x, y);
+       }
+       
+       if (!ok) {
+               clear ();
+               error << _("automation list: cannot load coordinates from XML, all points ignored") << endmsg;
+       } else {
+               mark_dirty ();
+               reposition_for_rt_add (0);
+               maybe_signal_changed ();
        }
-}
 
-XMLNode &AutomationList::get_state ()
-{
-    XMLNode *node = new XMLNode("AutomationList");
-    store_state(*node);
-    return *node;
+       thaw ();
+       return 0;
 }
 
-int AutomationList::set_state(const XMLNode &s)
+int
+AutomationList::set_state (const XMLNode& node)
 {
-    load_state(s);
-    return 0;
+       XMLNodeList nlist = node.children();
+       XMLNode* nsos;
+       XMLNodeIterator niter;
+       const XMLProperty* prop;
+
+       if (node.name() == X_("events")) {
+               /* partial state setting*/
+               return deserialize_events (node);
+       }
+       
+       if (node.name() == X_("Envelope") || node.name() == X_("FadeOut") || node.name() == X_("FadeIn")) {
+
+               if ((nsos = node.child (X_("AutomationList")))) {
+                       /* new school in old school clothing */
+                       return set_state (*nsos);
+               }
+
+               /* old school */
+
+               const XMLNodeList& elist = node.children();
+               XMLNodeConstIterator i;
+               XMLProperty* prop;
+               jack_nframes_t x;
+               double y;
+               
+               clear ();
+               
+               for (i = elist.begin(); i != elist.end(); ++i) {
+                       
+                       if ((prop = (*i)->property ("x")) == 0) {
+                               error << _("automation list: no x-coordinate stored for control point (point ignored)") << endmsg;
+                               continue;
+                       }
+                       x = atoi (prop->value().c_str());
+                       
+                       if ((prop = (*i)->property ("y")) == 0) {
+                               error << _("automation list: no y-coordinate stored for control point (point ignored)") << endmsg;
+                               continue;
+                       }
+                       y = atof (prop->value().c_str());
+                       
+                       add (x, y);
+               }
+               
+               return 0;
+       }
+
+       if (node.name() != X_("AutomationList") ) {
+               error << string_compose (_("AutomationList: passed XML node called %1, not \"AutomationList\" - ignored"), node.name()) << endmsg;
+               return -1;
+       }
+       
+       if ((prop = node.property ("id")) != 0) {
+               _id = prop->value ();
+               /* update session AL list */
+               AutomationListCreated(this);
+       }
+       
+       if ((prop = node.property (X_("default"))) != 0){ 
+               default_value = atof (prop->value());
+       } else {
+               default_value = 0.0;
+       }
+
+       if ((prop = node.property (X_("style"))) != 0) {
+               _style = string_to_auto_style (prop->value());
+       } else {
+               _style = Absolute;
+       }
+
+       if ((prop = node.property (X_("state"))) != 0) {
+               _state = string_to_auto_state (prop->value());
+       } else {
+               _state = Off;
+       }
+
+       if ((prop = node.property (X_("min_yval"))) != 0) {
+               min_yval = atof (prop->value ());
+       } else {
+               min_yval = FLT_MIN;
+       }
+
+       if ((prop = node.property (X_("max_yval"))) != 0) {
+               max_yval = atof (prop->value ());
+       } else {
+               max_yval = FLT_MAX;
+       }
+
+       if ((prop = node.property (X_("max_xval"))) != 0) {
+               max_xval = atof (prop->value ());
+       } else {
+               max_xval = 0; // means "no limit ;
+       }
+
+       for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
+               if ((*niter)->name() == X_("events")) {
+                       deserialize_events (*(*niter));
+               }
+       }
+       
+       return 0;
 }
 
index 1ff6c28ef36482af33dc87d5fc2e860b289f4359..a7152547472d6cdb516d7064ed897c7c2f18bb10 100644 (file)
@@ -36,6 +36,13 @@ ControlProtocolManager::~ControlProtocolManager()
        }
 
        control_protocols.clear ();
+
+       
+       for (list<ControlProtocolInfo*>::iterator p = control_protocol_info.begin(); p != control_protocol_info.end(); ++p) {
+               delete (*p);
+       }
+
+       control_protocol_info.clear();
                
 }
 
@@ -68,6 +75,12 @@ ControlProtocolManager::drop_session ()
                        delete *p;
                }
                control_protocols.clear ();
+
+               for (list<ControlProtocolInfo*>::iterator p = control_protocol_info.begin(); p != control_protocol_info.end(); ++p) {
+                       delete *p;
+               }
+
+               control_protocol_info.clear();
        }
 }
 
@@ -122,6 +135,15 @@ ControlProtocolManager::teardown (ControlProtocolInfo& cpi)
                list<ControlProtocol*>::iterator p = find (control_protocols.begin(), control_protocols.end(), cpi.protocol);
                if (p != control_protocols.end()) {
                        control_protocols.erase (p);
+               } else {
+                       cerr << "Programming error: ControlProtocolManager::teardown() called for " << cpi.name << ", but it was not found in control_protocols" << endl;
+               }
+
+               list<ControlProtocolInfo*>::iterator p2 = find (control_protocol_info.begin(), control_protocol_info.end(), &cpi);
+               if (p2 != control_protocol_info.end()) {
+                       control_protocol_info.erase (p2);
+               } else {
+                       cerr << "Programming error: ControlProtocolManager::teardown() called for " << cpi.name << ", but it was not found in control_protocol_info" << endl;
                }
        }
        
index c8cbb7a40db9cb2c283100d3946b59b47b15e2cd..3c81b18fd4fb2ee129a8d230d4fb180f75e234b6 100644 (file)
@@ -43,7 +43,7 @@ CoreAudioSource::CoreAudioSource (Session& s, const string& idstr, Flag flags)
 }
 
 void 
-CoreAudioSource::init (const string& idstr)
+CoreAudioSource::init (string idstr)
 {
        string::size_type pos;
 
@@ -84,10 +84,6 @@ CoreAudioSource::init (const string& idstr)
                error << string_compose ("CoreAudioSource: %1 (%2)", cax.mOperation, name()) << endmsg;
                throw failed_constructor ();
        }
-       
-       if (_build_peakfiles) {
-               _need_peakfile = true;
-       }
 }
 
 CoreAudioSource::~CoreAudioSource ()
@@ -189,3 +185,53 @@ CoreAudioSource::update_header (nframes_t when, struct tm&, time_t)
 {
        return 0;
 }
+
+int
+CoreAudioSource::get_soundfile_info (string path, SoundFileInfo& _info, string& error_msg)
+{
+       FSRef ref; 
+       ExtAudioFileRef af = 0;
+       size_t size;
+       CFStringRef name;
+       int ret = -1;
+
+       if (FSPathMakeRef ((UInt8*)path.c_str(), &ref, 0) != noErr) {
+               goto out;
+       }
+       
+       if (ExtAudioFileOpen(&ref, &af) != noErr) {
+               goto out;
+       }
+       
+       AudioStreamBasicDescription absd;
+       memset(&absd, 0, sizeof(absd));
+       size = sizeof(AudioStreamBasicDescription);
+       if (ExtAudioFileGetProperty (af, kExtAudioFileProperty_FileDataFormat, &size, &absd) != noErr) {
+               goto out;
+       }
+       
+       _info.samplerate = absd.mSampleRate;
+       _info.channels   = absd.mChannelsPerFrame;
+
+       size = sizeof(_info.length);
+       if (ExtAudioFileGetProperty(af, kExtAudioFileProperty_FileLengthFrames, &size, &_info.length) != noErr) {
+               goto out;
+       }
+       
+       size = sizeof(CFStringRef);
+       if (AudioFormatGetProperty(kAudioFormatProperty_FormatName, sizeof(absd), &absd, &size, &name) != noErr) {
+               goto out;
+       }
+
+       _info.format_name = CFStringRefToStdString(name);
+
+       // XXX it would be nice to find a way to get this information if it exists
+
+       _info.timecode = 0;
+       ret = 0;
+       
+  out:
+       ExtAudioFileDispose (af);
+       return ret;
+       
+}
index 7d62c5bc9422ba027f1d2b8a36f67635a1335e45..8465094775b8f6cca356061fa6fbbfeb253467cd 100644 (file)
@@ -40,14 +40,11 @@ using namespace ARDOUR;
 using namespace sigc;
 using namespace PBD;
 
-sigc::signal<void, Curve*> Curve::CurveCreated;
-
 Curve::Curve (double minv, double maxv, double canv, bool nostate)
-       : AutomationList (canv, nostate)
+       : AutomationList (canv)
 {
        min_yval = minv;
        max_yval = maxv;
-        CurveCreated(this);
 }
 
 Curve::Curve (const Curve& other)
@@ -55,7 +52,6 @@ Curve::Curve (const Curve& other)
 {
        min_yval = other.min_yval;
        max_yval = other.max_yval;
-        CurveCreated(this);
 }
 
 Curve::Curve (const Curve& other, double start, double end)
@@ -63,7 +59,11 @@ Curve::Curve (const Curve& other, double start, double end)
 {
        min_yval = other.min_yval;
        max_yval = other.max_yval;
-        CurveCreated(this);
+}
+
+Curve::Curve (const XMLNode& node)
+       : AutomationList (node)
+{
 }
 
 Curve::~Curve ()
@@ -73,7 +73,7 @@ Curve::~Curve ()
 void
 Curve::solve ()
 {
-       size_t npoints;
+       uint32_t npoints;
 
        if (!_dirty) {
                return;
@@ -88,7 +88,7 @@ Curve::solve ()
 
                double x[npoints];
                double y[npoints];
-               size_t i;
+               uint32_t i;
                AutomationEventList::iterator xx;
 
                for (i = 0, xx = events.begin(); xx != events.end(); ++xx, ++i) {
@@ -207,7 +207,7 @@ Curve::solve ()
 }
 
 bool
-Curve::rt_safe_get_vector (double x0, double x1, float *vec, size_t veclen)
+Curve::rt_safe_get_vector (double x0, double x1, float *vec, int32_t veclen)
 {
        Glib::Mutex::Lock lm (lock, Glib::TRY_LOCK);
 
@@ -220,19 +220,19 @@ Curve::rt_safe_get_vector (double x0, double x1, float *vec, size_t veclen)
 }
 
 void
-Curve::get_vector (double x0, double x1, float *vec, size_t veclen)
+Curve::get_vector (double x0, double x1, float *vec, int32_t veclen)
 {
        Glib::Mutex::Lock lm (lock);
        _get_vector (x0, x1, vec, veclen);
 }
 
 void
-Curve::_get_vector (double x0, double x1, float *vec, size_t veclen)
+Curve::_get_vector (double x0, double x1, float *vec, int32_t veclen)
 {
        double rx, dx, lx, hx, max_x, min_x;
-       size_t i;
-       size_t original_veclen;
-       size_t npoints;
+       int32_t i;
+       int32_t original_veclen;
+       int32_t npoints;
 
         if ((npoints = events.size()) == 0) {
                  for (i = 0; i < veclen; ++i) {
@@ -263,7 +263,7 @@ Curve::_get_vector (double x0, double x1, float *vec, size_t veclen)
                */
 
                double frac = (min_x - x0) / (x1 - x0);
-               size_t subveclen = (size_t) floor (veclen * frac);
+               int32_t subveclen = (int32_t) floor (veclen * frac);
                
                subveclen = min (subveclen, veclen);
 
@@ -281,7 +281,7 @@ Curve::_get_vector (double x0, double x1, float *vec, size_t veclen)
 
                double frac = (x1 - max_x) / (x1 - x0);
 
-               size_t subveclen = lrintf (original_veclen * frac);
+               int32_t subveclen = (int32_t) floor (original_veclen * frac);
 
                float val;
                
@@ -435,18 +435,10 @@ Curve::point_factory (const ControlEvent& other) const
        return new CurvePoint (other.when, other.value);
 }
 
-Change
-Curve::restore_state (StateManager::State& state)
-{
-       mark_dirty ();
-       return AutomationList::restore_state (state);
-}
-
-
 extern "C" {
 
 void 
-curve_get_vector_from_c (void *arg, double x0, double x1, float* vec, size_t vecsize)
+curve_get_vector_from_c (void *arg, double x0, double x1, float* vec, int32_t vecsize)
 {
        static_cast<Curve*>(arg)->get_vector (x0, x1, vec, vecsize);
 }
index e160ffd6089d6de79872d23b496a53b93c2e5d41..fcd85bfe8f117b6bd5fb50f16e3b0f88464cc3c5 100644 (file)
@@ -55,8 +55,10 @@ typedef off_t off64_t;
 #include <fcntl.h>
 
 #include <pbd/error.h>
+#include <pbd/stacktrace.h>
 #include <ardour/destructive_filesource.h>
 #include <ardour/utils.h>
+#include <ardour/session.h>
 
 #include "i18n.h"
 
@@ -289,7 +291,7 @@ DestructiveFileSource::write_unlocked (Sample* data, nframes_t cnt)
                _capture_end = false;
                
                /* move to the correct location place */
-               file_pos = capture_start_frame;
+               file_pos = capture_start_frame - timeline_position;
                
                // split cnt in half
                nframes_t subcnt = cnt / 2;
@@ -343,17 +345,16 @@ DestructiveFileSource::write_unlocked (Sample* data, nframes_t cnt)
        } else {
 
                /* in the middle of recording */
-               
 
                if (write_float (data, file_pos, cnt) != cnt) {
                        return 0;
                }
        }
-       
+
        old_file_pos = file_pos;
        update_length (file_pos, cnt);
        file_pos += cnt;
-       
+
        if (_build_peakfiles) {
                PeakBuildRecord *pbr = 0;
                
@@ -409,7 +410,15 @@ DestructiveFileSource::handle_header_position_change ()
 }
 
 void
-DestructiveFileSource::set_timeline_position (nframes_t pos)
+DestructiveFileSource::set_timeline_position (int64_t)
 {
        //destructive track timeline postion does not change except at instantion or when header_position_offset (session start) changes
 }
+
+int
+DestructiveFileSource::read_peaks (PeakData *peaks, nframes_t npeaks, nframes_t start, nframes_t cnt, double samples_per_unit) const
+{
+       // cerr << _name << " read peaks at " << start << " for " << cnt << " tpos = " << timeline_position << endl;
+       return AudioFileSource::read_peaks (peaks, npeaks, start, cnt, samples_per_unit);
+}
+       
index e9f8499981bd56612270f17318aa19f854bfda34..5f6f3956cfd5b5154720733c8c26ae829ed20b34 100644 (file)
@@ -390,14 +390,14 @@ Diskstream::set_name (string str)
 }
 
 void
-Diskstream::set_destructive (bool yn)
+Diskstream::remove_region_from_last_capture (boost::weak_ptr<Region> wregion)
 {
-       if (yn != destructive()) {
-               reset_write_sources (true, true);
-               if (yn) {
-                       _flags |= Destructive;
-               } else {
-                       _flags &= ~Destructive;
-               }
+       boost::shared_ptr<Region> region (wregion.lock());
+
+       if (!region) {
+               return;
        }
+       
+       _last_capture_regions.remove (region);
 }
+
index 9b5bea9d3ae640db2b0ce858d8c2561bfa395a00..f92660470c0b92583224ef8fa6ce724cd75dc3b3 100644 (file)
@@ -128,6 +128,8 @@ setup_midi (AudioEngine& engine     )
                }
                
                MIDI::Manager::instance()->add_port (request);
+
+               nports++;
        }
 
        if (nports > 1) {
index 71a3dccab8784cb936ffcde33663ef8c5346e204..5d68c79edd9bab1496341771b0670877efcb2735 100644 (file)
@@ -2,6 +2,7 @@
 #define __i18n_h__
 
 #include <pbd/compose.h>
+#include <pbd/convert.h>
 #include "gettext.h"
 
 #include <vector>
@@ -10,5 +11,6 @@
 #define _(Text)  dgettext (PACKAGE,Text)
 #define N_(Text) gettext_noop (Text)
 #define X_(Text) Text
+#define I18N(Array) PBD::internationalize (PACKAGE, Array)
 
 #endif // __i18n_h__
index b557017ec70536726c08e31f464eadd747a2ba41..034b043763022a5ed9a087111d0caeff870d1b3e 100644 (file)
@@ -85,8 +85,6 @@ PluginInsert::PluginInsert (Session& s, boost::shared_ptr<Plugin> plug, Placemen
        
        init ();
 
-       save_state (_("initial state"));
-
        {
                Glib::Mutex::Lock em (_session.engine().process_lock());
                IO::MoreChannels (max(input_streams(), output_streams()));
@@ -104,8 +102,6 @@ PluginInsert::PluginInsert (Session& s, const XMLNode& node)
 
        set_automatable ();
 
-       save_state (_("initial state"));
-
        _plugins[0]->ParameterChanged.connect (mem_fun (*this, &PluginInsert::parameter_changed));
 
        {
@@ -129,8 +125,6 @@ PluginInsert::PluginInsert (const PluginInsert& other)
 
        init ();
 
-       save_state (_("initial state"));
-
        RedirectCreated (this); /* EMIT SIGNAL */
 }
 
@@ -324,6 +318,23 @@ PluginInsert::connect_and_run (BufferSet& bufs, nframes_t nframes, nframes_t off
        /* leave remaining channel buffers alone */
 }
 
+void
+PluginInsert::automation_snapshot (nframes_t now)
+{
+       map<uint32_t,AutomationList*>::iterator li;
+       
+       for (li = parameter_automation.begin(); li != parameter_automation.end(); ++li) {
+               
+               AutomationList *alist = ((*li).second);
+               if (alist != 0 && alist->automation_write ()) {
+                       
+                       float val = _plugins[0]->get_parameter ((*li).first);
+                       alist->rt_add (now, val);
+                       last_automation_snapshot = now;
+               }
+       }
+}
+
 void
 PluginInsert::transport_stopped (nframes_t now)
 {
@@ -785,35 +796,6 @@ PluginInsert::latency()
        return _plugins[0]->latency ();
 }
        
-void
-PluginInsert::store_state (PluginInsertState& state) const
-{
-       Redirect::store_state (state);
-       _plugins[0]->store_state (state.plugin_state);
-}
-
-Change
-PluginInsert::restore_state (StateManager::State& state)
-{
-       PluginInsertState* pistate = dynamic_cast<PluginInsertState*> (&state);
-
-       Redirect::restore_state (state);
-
-       _plugins[0]->restore_state (pistate->plugin_state);
-
-       return Change (0);
-}
-
-StateManager::State*
-PluginInsert::state_factory (std::string why) const
-{
-       PluginInsertState* state = new PluginInsertState (why);
-
-       store_state (*state);
-
-       return state;
-}
-
 ARDOUR::PluginType
 PluginInsert::type ()
 {
@@ -851,7 +833,6 @@ PortInsert::PortInsert (Session& s, Placement p)
        : Insert (s, p, 1, -1, 1, -1)
 {
        init ();
-       save_state (_("initial state"));
        RedirectCreated (this); /* EMIT SIGNAL */
 }
 
@@ -859,7 +840,6 @@ PortInsert::PortInsert (const PortInsert& other)
        : Insert (other._session, other.placement(), 1, -1, 1, -1)
 {
        init ();
-       save_state (_("initial state"));
        RedirectCreated (this); /* EMIT SIGNAL */
 }
 
@@ -1013,10 +993,10 @@ PortInsert::configure_io (int32_t ignored_magic, int32_t in, int32_t out)
           to the number of input ports we need.
        */
 
-       set_output_maximum (in);
-       set_output_minimum (in);
-       set_input_maximum (out);
-       set_input_minimum (out);
+       set_output_maximum (ChanCount(_default_type, in));
+       set_output_minimum (ChanCount(_default_type, in));
+       set_input_maximum (ChanCount(_default_type, out));
+       set_input_minimum (ChanCount(_default_type, out));
 
        if (in < 0) {
                in = n_outputs ().get(_default_type);
@@ -1026,8 +1006,7 @@ PortInsert::configure_io (int32_t ignored_magic, int32_t in, int32_t out)
                out = n_inputs ().get(_default_type);
        }
 
-       // FIXME
-       return ensure_io (ChanCount(_default_type, in), ChanCount(_default_type, out), false, this);
+       return ensure_io (ChanCount(_default_type, out), ChanCount(_default_type, in), false, this);
 }
 
 int32_t
index af5473368b6caa4b0c59065e555e4cdf92b14d10..60e7ec3f4283aa5f4bad4339fb963042e675f4a6 100644 (file)
@@ -60,7 +60,7 @@ using namespace std;
 using namespace ARDOUR;
 using namespace PBD;
 
-static float current_automation_version_number = 1.0;
+nframes_t    IO::_automation_interval = 0;
 
 const string                 IO::state_node_name = "IO";
 bool                         IO::connecting_legal = false;
@@ -137,6 +137,8 @@ IO::IO (Session& s, string name,
 
        apply_gain_automation = false;
        
+       last_automation_snapshot = 0;
+
        _gain_automation_state = Off;
        _gain_automation_style = Absolute;
 
@@ -149,6 +151,43 @@ IO::IO (Session& s, string name,
        
        // Connect to our own MoreChannels signal to connect output buffers
        IO::MoreChannels.connect (mem_fun (*this, &IO::attach_buffers));
+
+       _session.add_controllable (&_gain_control);
+}
+
+IO::IO (Session& s, const XMLNode& node, DataType dt)
+       : _session (s),
+      _output_buffers(new BufferSet()),
+         _default_type (dt),
+         _gain_control (X_("gaincontrol"), *this),
+         _gain_automation_curve (0, 0, 0) // all reset in set_state()
+{
+       // FIXME: hack
+       _meter = new PeakMeter (_session);
+
+       _panner = 0;
+       deferred_state = 0;
+       no_panner_reset = false;
+       _desired_gain = 1.0;
+       _gain = 1.0;
+       _input_connection = 0;
+       _output_connection = 0;
+
+       apply_gain_automation = false;
+
+       set_state (node);
+
+       {
+               // IO::Meter is emitted from another thread so the
+               // Meter signal must be protected.
+               Glib::Mutex::Lock guard (m_meter_signal_lock);
+               m_meter_connection = Meter.connect (mem_fun (*this, &IO::meter));
+       }
+       
+       // Connect to our own MoreChannels signal to connect output buffers
+       IO::MoreChannels.connect (mem_fun (*this, &IO::attach_buffers));
+
+       _session.add_controllable (&_gain_control);
 }
 
 IO::~IO ()
@@ -1234,66 +1273,20 @@ IO::state (bool full_state)
        /* automation */
 
        if (full_state) {
+
+               XMLNode* autonode = new XMLNode (X_("Automation"));
+               autonode->add_child_nocopy (get_automation_state());
+               node->add_child_nocopy (*autonode);
+
                snprintf (buf, sizeof (buf), "0x%x", (int) _gain_automation_curve.automation_state());
        } else {
                /* never store anything except Off for automation state in a template */
                snprintf (buf, sizeof (buf), "0x%x", ARDOUR::Off); 
        }
-       node->add_property ("automation-state", buf);
-       snprintf (buf, sizeof (buf), "0x%x", (int) _gain_automation_curve.automation_style());
-       node->add_property ("automation-style", buf);
-
-       /* XXX same for pan etc. */
 
        return *node;
 }
 
-int
-IO::connecting_became_legal ()
-{
-       int ret;
-
-       if (pending_state_node == 0) {
-               fatal << _("IO::connecting_became_legal() called without a pending state node") << endmsg;
-               /*NOTREACHED*/
-               return -1;
-       }
-
-       connection_legal_c.disconnect ();
-
-       ret = make_connections (*pending_state_node);
-
-       if (ports_legal) {
-               delete pending_state_node;
-               pending_state_node = 0;
-       }
-
-       return ret;
-}
-
-int
-IO::ports_became_legal ()
-{
-       int ret;
-
-       if (pending_state_node == 0) {
-               fatal << _("IO::ports_became_legal() called without a pending state node") << endmsg;
-               /*NOTREACHED*/
-               return -1;
-       }
-
-       port_legal_c.disconnect ();
-
-       ret = create_ports (*pending_state_node);
-
-       if (connecting_legal) {
-               delete pending_state_node;
-               pending_state_node = 0;
-       }
-
-       return ret;
-}
-
 int
 IO::set_state (const XMLNode& node)
 {
@@ -1312,7 +1305,7 @@ IO::set_state (const XMLNode& node)
 
        if ((prop = node.property ("name")) != 0) {
                _name = prop->value();
-               _panner->set_name (_name);
+               /* used to set panner name with this, but no more */
        } 
 
        if ((prop = node.property ("id")) != 0) {
@@ -1338,32 +1331,29 @@ IO::set_state (const XMLNode& node)
                _gain = _desired_gain;
        }
 
+       if ((prop = node.property ("automation-state")) != 0 || (prop = node.property ("automation-style")) != 0) {
+               /* old school automation handling */
+       }
+
        for (iter = node.children().begin(); iter != node.children().end(); ++iter) {
 
                if ((*iter)->name() == "Panner") {
+                       if (_panner == 0) {
+                               _panner = new Panner (_name, _session);
+                       }
                        _panner->set_state (**iter);
                }
 
+               if ((*iter)->name() == X_("Automation")) {
+
+                       set_automation_state (*(*iter)->children().front());
+               }
+
                if ((*iter)->name() == X_("gaincontrol")) {
                        _gain_control.set_state (**iter);
-                       _session.add_controllable (&_gain_control);
                }
        }
 
-       if ((prop = node.property ("automation-state")) != 0) {
-
-               long int x;
-               x = strtol (prop->value().c_str(), 0, 16);
-               set_gain_automation_state (AutoState (x));
-       }
-
-       if ((prop = node.property ("automation-style")) != 0) {
-
-              long int x;
-               x = strtol (prop->value().c_str(), 0, 16);
-               set_gain_automation_style (AutoStyle (x));
-       }
-       
        if (ports_legal) {
 
                if (create_ports (node)) {
@@ -1396,9 +1386,146 @@ IO::set_state (const XMLNode& node)
                pending_state_node = new XMLNode (node);
        }
 
+       last_automation_snapshot = 0;
+
        return 0;
 }
 
+int
+IO::set_automation_state (const XMLNode& node)
+{
+       return _gain_automation_curve.set_state (node);
+}
+
+XMLNode&
+IO::get_automation_state ()
+{
+       return (_gain_automation_curve.get_state ());
+}
+
+int
+IO::load_automation (string path)
+{
+       string fullpath;
+       ifstream in;
+       char line[128];
+       uint32_t linecnt = 0;
+       float version;
+       LocaleGuard lg (X_("POSIX"));
+
+       fullpath = _session.automation_dir();
+       fullpath += path;
+
+       in.open (fullpath.c_str());
+
+       if (!in) {
+               fullpath = _session.automation_dir();
+               fullpath += _session.snap_name();
+               fullpath += '-';
+               fullpath += path;
+
+               in.open (fullpath.c_str());
+
+               if (!in) {
+                       error << string_compose(_("%1: cannot open automation event file \"%2\""), _name, fullpath) << endmsg;
+                       return -1;
+               }
+       }
+
+       clear_automation ();
+
+       while (in.getline (line, sizeof(line), '\n')) {
+               char type;
+               jack_nframes_t when;
+               double value;
+
+               if (++linecnt == 1) {
+                       if (memcmp (line, "version", 7) == 0) {
+                               if (sscanf (line, "version %f", &version) != 1) {
+                                       error << string_compose(_("badly formed version number in automation event file \"%1\""), path) << endmsg;
+                                       return -1;
+                               }
+                       } else {
+                               error << string_compose(_("no version information in automation event file \"%1\""), path) << endmsg;
+                               return -1;
+                       }
+
+                       continue;
+               }
+
+               if (sscanf (line, "%c %" PRIu32 " %lf", &type, &when, &value) != 3) {
+                       warning << string_compose(_("badly formatted automation event record at line %1 of %2 (ignored)"), linecnt, path) << endmsg;
+                       continue;
+               }
+
+               switch (type) {
+               case 'g':
+                       _gain_automation_curve.fast_simple_add (when, value);
+                       break;
+
+               case 's':
+                       break;
+
+               case 'm':
+                       break;
+
+               case 'p':
+                       /* older (pre-1.0) versions of ardour used this */
+                       break;
+
+               default:
+                       warning << _("dubious automation event found (and ignored)") << endmsg;
+               }
+       }
+
+       return 0;
+}
+
+int
+IO::connecting_became_legal ()
+{
+       int ret;
+
+       if (pending_state_node == 0) {
+               fatal << _("IO::connecting_became_legal() called without a pending state node") << endmsg;
+               /*NOTREACHED*/
+               return -1;
+       }
+
+       connection_legal_c.disconnect ();
+
+       ret = make_connections (*pending_state_node);
+
+       if (ports_legal) {
+               delete pending_state_node;
+               pending_state_node = 0;
+       }
+
+       return ret;
+}
+int
+IO::ports_became_legal ()
+{
+       int ret;
+
+       if (pending_state_node == 0) {
+               fatal << _("IO::ports_became_legal() called without a pending state node") << endmsg;
+               /*NOTREACHED*/
+               return -1;
+       }
+
+       port_legal_c.disconnect ();
+
+       ret = create_ports (*pending_state_node);
+
+       if (connecting_legal) {
+               delete pending_state_node;
+               pending_state_node = 0;
+       }
+
+       return ret;
+}
+
 int
 IO::create_ports (const XMLNode& node)
 {
@@ -1701,42 +1828,6 @@ IO::set_name (string name, void* src)
         return 0;
 }
 
-void
-IO::set_input_minimum (int n)
-{
-       if (n < 0)
-               _input_minimum = ChanCount::ZERO;
-       else
-               _input_minimum = ChanCount(_default_type, n);
-}
-
-void
-IO::set_input_maximum (int n)
-{
-       if (n < 0)
-               _input_maximum = ChanCount::INFINITE;
-       else
-               _input_maximum = ChanCount(_default_type, n);
-}
-
-void
-IO::set_output_minimum (int n)
-{
-       if (n < 0)
-               _output_minimum = ChanCount::ZERO;
-       else
-               _output_minimum = ChanCount(_default_type, n);
-}
-
-void
-IO::set_output_maximum (int n)
-{
-       if (n < 0)
-               _output_maximum = ChanCount::INFINITE;
-       else
-               _output_maximum = ChanCount(_default_type, n);
-}
-
 void
 IO::set_input_minimum (ChanCount n)
 {
@@ -2046,25 +2137,6 @@ IO::GainControllable::get_value (void) const
        return direct_gain_to_control (io.effective_gain());
 }
 
-UndoAction
-IO::get_memento() const
-{
-  return sigc::bind (mem_fun (*(const_cast<IO *>(this)), &StateManager::use_state), _current_state_id);
-}
-
-Change
-IO::restore_state (StateManager::State& state)
-{
-       return Change (0);
-}
-
-StateManager::State*
-IO::state_factory (std::string why) const
-{
-       StateManager::State* state = new StateManager::State (why);
-       return state;
-}
-
 void
 IO::setup_peak_meters()
 {
@@ -2096,118 +2168,6 @@ IO::meter ()
        _meter->meter();
 }
 
-int
-IO::save_automation (const string& path)
-{
-       string fullpath;
-       ofstream out;
-
-       fullpath = _session.automation_dir();
-       fullpath += path;
-
-       out.open (fullpath.c_str());
-
-       if (!out) {
-               error << string_compose(_("%1: could not open automation event file \"%2\""), _name, fullpath) << endmsg;
-               return -1;
-       }
-
-       out << X_("version ") << current_automation_version_number << endl;
-
-       /* XXX use apply_to_points to get thread safety */
-       
-       for (AutomationList::iterator i = _gain_automation_curve.begin(); i != _gain_automation_curve.end(); ++i) {
-               out << "g " << (nframes_t) floor ((*i)->when) << ' ' << (*i)->value << endl;
-       }
-
-       _panner->save ();
-
-       return 0;
-}
-
-int
-IO::load_automation (const string& path)
-{
-       string fullpath;
-       ifstream in;
-       char line[128];
-       uint32_t linecnt = 0;
-       float version;
-       LocaleGuard lg (X_("POSIX"));
-
-       fullpath = _session.automation_dir();
-       fullpath += path;
-
-       in.open (fullpath.c_str());
-
-       if (!in) {
-               fullpath = _session.automation_dir();
-               fullpath += _session.snap_name();
-               fullpath += '-';
-               fullpath += path;
-               in.open (fullpath.c_str());
-               if (!in) {
-                       error << string_compose(_("%1: cannot open automation event file \"%2\" (%2)"), _name, fullpath, strerror (errno)) << endmsg;
-                       return -1;
-               }
-       }
-
-       clear_automation ();
-
-       while (in.getline (line, sizeof(line), '\n')) {
-               char type;
-               nframes_t when;
-               double value;
-
-               if (++linecnt == 1) {
-                       if (memcmp (line, "version", 7) == 0) {
-                               if (sscanf (line, "version %f", &version) != 1) {
-                                       error << string_compose(_("badly formed version number in automation event file \"%1\""), path) << endmsg;
-                                       return -1;
-                               }
-                       } else {
-                               error << string_compose(_("no version information in automation event file \"%1\""), path) << endmsg;
-                               return -1;
-                       }
-
-                       if (version != current_automation_version_number) {
-                               error << string_compose(_("mismatched automation event file version (%1)"), version) << endmsg;
-                               return -1;
-                       }
-
-                       continue;
-               }
-
-               if (sscanf (line, "%c %" PRIu32 " %lf", &type, &when, &value) != 3) {
-                       warning << string_compose(_("badly formatted automation event record at line %1 of %2 (ignored)"), linecnt, path) << endmsg;
-                       continue;
-               }
-
-               switch (type) {
-               case 'g':
-                       _gain_automation_curve.add (when, value, true);
-                       break;
-
-               case 's':
-                       break;
-
-               case 'm':
-                       break;
-
-               case 'p':
-                       /* older (pre-1.0) versions of ardour used this */
-                       break;
-
-               default:
-                       warning << _("dubious automation event found (and ignored)") << endmsg;
-               }
-       }
-
-       _gain_automation_curve.save_state (_("loaded from disk"));
-
-       return 0;
-}
-       
 void
 IO::clear_automation ()
 {
@@ -2226,6 +2186,7 @@ IO::set_gain_automation_state (AutoState state)
 
                if (state != _gain_automation_curve.automation_state()) {
                        changed = true;
+                       last_automation_snapshot = 0;
                        _gain_automation_curve.set_automation_state (state);
                        
                        if (state != Off) {
@@ -2323,6 +2284,21 @@ IO::end_pan_touch (uint32_t which)
 
 }
 
+void
+IO::automation_snapshot (nframes_t now)
+{
+       if (last_automation_snapshot > now || (now - last_automation_snapshot) > _automation_interval) {
+
+               if (gain_automation_recording()) {
+                       _gain_automation_curve.rt_add (now, gain());
+               }
+               
+               _panner->snapshot (now);
+
+               last_automation_snapshot = now;
+       }
+}
+
 void
 IO::transport_stopped (nframes_t frame)
 {
@@ -2330,10 +2306,6 @@ IO::transport_stopped (nframes_t frame)
 
        if (_gain_automation_curve.automation_state() != Off) {
                
-               if (gain_automation_recording()) {
-                       _gain_automation_curve.save_state (_("automation write/touch"));
-               }
-
                /* the src=0 condition is a special signal to not propagate 
                   automation gain changes into the mix group when locating.
                */
index 39331cfda644284474e453a165b6ac8cc049004a..e09a59d42f607ddb99ba8683225681e1ce7bcdfc 100644 (file)
@@ -372,27 +372,16 @@ Locations::Locations ()
 
 {
        current_location = 0;
-       save_state (_("initial"));
 }
 
 Locations::~Locations () 
 {
-       std::set<Location*> all_locations;
-       
-       for (StateMap::iterator siter = states.begin(); siter != states.end(); ++siter) {
-
-               State* lstate = dynamic_cast<State*> (*siter);
-
-               for (LocationList::iterator liter = lstate->locations.begin(); liter != lstate->locations.end(); ++liter) {
-                       all_locations.insert (*liter);
-               }
-
-               for (LocationList::iterator siter = lstate->states.begin(); siter != lstate->states.end(); ++siter) {
-                       all_locations.insert (*siter);
-               }
+       for (LocationList::iterator i = locations.begin(); i != locations.end(); ) {
+               LocationList::iterator tmp = i;
+               ++tmp;
+               delete *i;
+               i = tmp;
        }
-
-       set_delete (&all_locations);
 }
 
 int
@@ -431,22 +420,22 @@ Locations::clear ()
 {
        {
                Glib::Mutex::Lock lm (lock);
-               LocationList::iterator tmp;
+
                for (LocationList::iterator i = locations.begin(); i != locations.end(); ) {
-                       tmp = i;
+
+                       LocationList::iterator tmp = i;
                        ++tmp;
+
                        if (!(*i)->is_end() && !(*i)->is_start()) {
                                locations.erase (i);
                        }
+
                        i = tmp;
                }
 
-               locations.clear ();
                current_location = 0;
        }
 
-       save_state (_("clear"));
-       
        changed (); /* EMIT SIGNAL */
        current_changed (0); /* EMIT SIGNAL */
 }      
@@ -470,8 +459,6 @@ Locations::clear_markers ()
                }
        }
 
-       save_state (_("clear markers"));
-       
        changed (); /* EMIT SIGNAL */
 }      
 
@@ -498,8 +485,6 @@ Locations::clear_ranges ()
                current_location = 0;
        }
 
-       save_state (_("clear ranges"));
-
        changed (); /* EMIT SIGNAL */
        current_changed (0); /* EMIT SIGNAL */
 }      
@@ -516,8 +501,6 @@ Locations::add (Location *loc, bool make_current)
                }
        }
        
-       save_state (_("add"));
-
        added (loc); /* EMIT SIGNAL */
 
        if (make_current) {
@@ -554,9 +537,8 @@ Locations::remove (Location *loc)
        }
        
        if (was_removed) {
-               save_state (_("remove"));
-
-                removed (loc); /* EMIT SIGNAL */
+               
+               removed (loc); /* EMIT SIGNAL */
 
                if (was_current) {
                         current_changed (0); /* EMIT SIGNAL */
@@ -569,7 +551,6 @@ Locations::remove (Location *loc)
 void
 Locations::location_changed (Location* loc)
 {
-       save_state (X_("location changed"));
        changed (); /* EMIT SIGNAL */
 }
 
@@ -599,7 +580,10 @@ Locations::set_state (const XMLNode& node)
        }
        
        nlist = node.children();
-       
+
+       locations.clear ();
+       current_location = 0;
+
        {
                Glib::Mutex::Lock lm (lock);
 
@@ -809,45 +793,6 @@ Locations::auto_punch_location () const
        return 0;
 }      
 
-StateManager::State*
-Locations::state_factory (std::string why) const
-{
-       State* state = new State (why);
-
-       state->locations = locations;
-       
-       for (LocationList::const_iterator i = locations.begin(); i != locations.end(); ++i) {
-               state->states.push_back (new Location (**i));
-       }
-
-       return state;
-}
-
-Change
-Locations::restore_state (StateManager::State& state) 
-{
-       {
-               Glib::Mutex::Lock lm (lock);
-               State* lstate = dynamic_cast<State*> (&state);
-
-               locations = lstate->locations;
-               LocationList& states = lstate->states;
-               LocationList::iterator l, s;
-
-               for (l = locations.begin(), s = states.begin(); s != states.end(); ++s, ++l) {
-                       (*l) = (*s);
-               }
-       }
-
-       return Change (0);
-}
-
-UndoAction
-Locations::get_memento () const
-{
-  return sigc::bind (mem_fun (*(const_cast<Locations*> (this)), &StateManager::use_state), _current_state_id);
-}
-
 uint32_t
 Locations::num_range_markers () const
 {
index 8247aac217c3249ffb305c04fe81d6be44f155b7..b1ec7da965c57e40c92a799b8bcea291339ef87b 100644 (file)
@@ -295,11 +295,12 @@ MidiDiskstream::use_copy_playlist ()
 
 /** Overloaded from parent to die horribly
  */
-void
+int
 MidiDiskstream::set_destructive (bool yn)
 {
        assert( ! destructive());
        assert( ! yn);
+       return -1;
 }
 
 void
index 36e5e051165d84eb71230b3802d2c3c778455ef2..d33d19ce67d33e5ae594dc12b62efc7ccc9bc35e 100644 (file)
@@ -106,7 +106,6 @@ MidiRegion::MidiRegion (SourceList& srcs, const XMLNode& node)
 
 MidiRegion::~MidiRegion ()
 {
-       GoingAway (); /* EMIT SIGNAL */
 }
 
 jack_nframes_t
index f6d0a220193dc1cb3b92b9f4964e6991d83ee33c..a18d0c20ce8c038fcc2315725b94a1533dac9e6f 100644 (file)
@@ -619,14 +619,21 @@ MidiTrack::unfreeze ()
        FreezeChange (); /* EMIT SIGNAL */
 }
 
-void
+int
 MidiTrack::set_mode (TrackMode m)
 {
-       if (_diskstream) {
-               if (_mode != m) {
-                       _mode = m;
-                       _diskstream->set_destructive (m == Destructive);
-                       ModeChanged();
+       assert(_diskstream);
+
+       if (m != _mode) {
+
+               if (_diskstream->set_destructive (m == Destructive)) {
+                       return -1;
                }
+
+               _mode = m;
+               
+               TrackModeChanged (); /* EMIT SIGNAL */
        }
+
+       return 0;
 }
index 0f6e78f84bf0e9129c948595169aaf45d4e1472c..ee8e100e4aa3931fbe95a7fcfde4e3a1acc387f7 100644 (file)
@@ -75,6 +75,8 @@ StreamPanner::StreamPanner (Panner& p)
 {
        _muted = false;
 
+       parent.session().add_controllable (&_control);
+
        x = 0.5;
        y = 0.5;
        z = 0.5;
@@ -210,11 +212,6 @@ BaseStereoPanner::transport_stopped (nframes_t frame)
        _automation.reposition_for_rt_add (frame);
 
        if (_automation.automation_state() != Off) {
-               
-               if (_automation.automation_write()) {
-                       _automation.save_state (_("automation write pass"));
-               }
-
                set_position (_automation.eval (frame));
        }
 }
@@ -238,29 +235,6 @@ BaseStereoPanner::set_automation_state (AutoState state)
        }
 }
 
-int
-BaseStereoPanner::save (ostream& out) const
-{
-       LocaleGuard lg (X_("POSIX"));
-
-       /* force a single format for numeric data to ease session interchange
-          across national boundaries.
-       */
-
-       out << "begin" << endl;
-
-       for (AutomationList::const_iterator i = _automation.const_begin(); i != _automation.const_end(); ++i) {
-               out << '\t' << (nframes_t) floor ((*i)->when) << ' ' << (*i)->value << endl;
-               if (!out) {
-                       error << string_compose (_("error writing pan automation file (%s)"), strerror (errno)) << endmsg;
-                       return -1;
-               }
-       }
-       out << "end" << endl;
-
-       return 0;
-}
-                               
 int
 BaseStereoPanner::load (istream& in, string path, uint32_t& linecnt)
 {
@@ -270,7 +244,7 @@ BaseStereoPanner::load (istream& in, string path, uint32_t& linecnt)
        _automation.clear ();
 
        while (in.getline (line, sizeof (line), '\n')) {
-               nframes_t when;
+               jack_nframes_t when;
                double value;
 
                ++linecnt;
@@ -284,13 +258,12 @@ BaseStereoPanner::load (istream& in, string path, uint32_t& linecnt)
                        continue;
                }
 
-               _automation.add (when, value, true);
+               _automation.fast_simple_add (when, value);
        }
 
        /* now that we are done loading */
 
-       _automation.save_state (_("loaded from disk"));
-       _automation.StateChanged (Change (0));
+       _automation.StateChanged ();
 
        return 0;
 }
@@ -543,17 +516,13 @@ EqualPowerStereoPanner::state (bool full_state)
        snprintf (buf, sizeof (buf), "%.12g", x); 
        root->add_property (X_("x"), buf);
        root->add_property (X_("type"), EqualPowerStereoPanner::name);
-       if (full_state) {
-               snprintf (buf, sizeof (buf), "0x%x", _automation.automation_state()); 
-       } else {
-               /* never store automation states other than off in a template */
-               snprintf (buf, sizeof (buf), "0x%x", ARDOUR::Off); 
-       }
-       root->add_property (X_("automation-state"), buf);
-       snprintf (buf, sizeof (buf), "0x%x", _automation.automation_style()); 
-       root->add_property (X_("automation-style"), buf);
+
+       XMLNode* autonode = new XMLNode (X_("Automation"));
+       autonode->add_child_nocopy (_automation.state (full_state));
+       root->add_child_nocopy (*autonode);
 
        StreamPanner::add_state (*root);
+
        root->add_child_nocopy (_control.get_state ());
 
        return *root;
@@ -563,7 +532,6 @@ int
 EqualPowerStereoPanner::set_state (const XMLNode& node)
 {
        const XMLProperty* prop;
-       int x;
        float pos;
        LocaleGuard lg (X_("POSIX"));
 
@@ -572,29 +540,24 @@ EqualPowerStereoPanner::set_state (const XMLNode& node)
                set_position (pos, true);
        } 
 
-       if ((prop = node.property (X_("automation-state")))) {
-               sscanf (prop->value().c_str(), "0x%x", &x);
-               _automation.set_automation_state ((AutoState) x);
-
-               if (x != Off) {
-                       set_position (_automation.eval (parent.session().transport_frame()));
-               }
-       }
-
-       if ((prop = node.property (X_("automation-style")))) {
-               sscanf (prop->value().c_str(), "0x%x", &x);
-               _automation.set_automation_style ((AutoStyle) x);
-       }
-
        StreamPanner::set_state (node);
 
        for (XMLNodeConstIterator iter = node.children().begin(); iter != node.children().end(); ++iter) {
+
                if ((*iter)->name() == X_("panner")) {
+
                        _control.set_state (**iter);
-                       parent.session().add_controllable (&_control);
+
+               } else if ((*iter)->name() == X_("Automation")) {
+
+                       _automation.set_state (*((*iter)->children().front()));
+
+                       if (_automation.automation_state() != Off) {
+                               set_position (_automation.eval (parent.session().transport_frame()));
+                       }
                }
        }
-       
+
        return 0;
 }
 
@@ -765,12 +728,6 @@ Multi2dPanner::load (istream& in, string path, uint32_t& linecnt)
        return 0;
 }
 
-int
-Multi2dPanner::save (ostream& out) const
-{
-       return 0;
-}
-
 XMLNode&
 Multi2dPanner::get_state (void)
 {
@@ -790,6 +747,8 @@ Multi2dPanner::state (bool full_state)
        root->add_property (X_("y"), buf);
        root->add_property (X_("type"), Multi2dPanner::name);
 
+       /* XXX no meaningful automation yet */
+
        return *root;
 }
 
@@ -827,6 +786,7 @@ Panner::Panner (string name, Session& s)
        : _session (s)
 {
        set_name (name);
+
        _linked = false;
        _link_direction = SameDirection;
        _bypassed = false;
@@ -856,17 +816,6 @@ Panner::set_link_direction (LinkDirection ld)
        }
 }
 
-void
-Panner::set_name (string str)
-{
-       automation_path = _session.automation_dir();
-       automation_path += _session.snap_name();
-       automation_path += "-pan-";
-       automation_path += legalize_for_path (str);
-       automation_path += ".automation";
-}
-
-
 void
 Panner::set_bypassed (bool yn)
 {
@@ -883,7 +832,6 @@ Panner::reset (uint32_t nouts, uint32_t npans)
        uint32_t n;
        bool changed = false;
 
-
        if (nouts < 2 || (nouts == outputs.size() && npans == size())) {
                return;
        } 
@@ -1095,102 +1043,6 @@ Panner::clear_automation ()
        _session.set_dirty ();
 }      
 
-int
-Panner::save () const
-{
-       ofstream out (automation_path.c_str());
-       
-       if (!out) {
-               error << string_compose (_("cannot open pan automation file \"%1\" for saving (%2)"), automation_path, strerror (errno))
-                     << endmsg;
-               return -1;
-       }
-
-       out << X_("version ") << current_automation_version_number << endl;
-
-       for (vector<StreamPanner*>::const_iterator i = begin(); i != end(); ++i) {
-               if ((*i)->save (out)) {
-                       return -1;
-               }
-       }
-
-       return 0;
-}
-
-int
-Panner::load ()
-{
-       char line[128];
-       uint32_t linecnt = 0;
-       float version;
-       iterator sp;
-       LocaleGuard lg (X_("POSIX"));
-
-       if (automation_path.length() == 0) {
-               return 0;
-       }
-       
-       if (access (automation_path.c_str(), F_OK)) {
-               return 0;
-       }
-
-       ifstream in (automation_path.c_str());
-
-       if (!in) {
-               error << string_compose (_("cannot open pan automation file %1 (%2)"),
-                                 automation_path, strerror (errno))
-                     << endmsg;
-               return -1;
-       }
-
-       sp = begin();
-
-       while (in.getline (line, sizeof(line), '\n')) {
-
-               if (++linecnt == 1) {
-                       if (memcmp (line, X_("version"), 7) == 0) {
-                               if (sscanf (line, "version %f", &version) != 1) {
-                                       error << string_compose(_("badly formed version number in pan automation event file \"%1\""), automation_path) << endmsg;
-                                       return -1;
-                               }
-                       } else {
-                               error << string_compose(_("no version information in pan automation event file \"%1\" (first line = %2)"), 
-                                                automation_path, line) << endmsg;
-                               return -1;
-                       }
-
-                       if (version != current_automation_version_number) {
-                               error << string_compose(_("mismatched pan automation event file version (%1)"), version) << endmsg;
-                               return -1;
-                       }
-
-                       continue;
-               }
-
-               if (strlen (line) == 0 || line[0] == '#') {
-                       continue;
-               }
-
-               if (strcmp (line, "begin") == 0) {
-                       
-                       if (sp == end()) {
-                               error << string_compose (_("too many panner states found in pan automation file %1"),
-                                                 automation_path)
-                                     << endmsg;
-                               return -1;
-                       }
-
-                       if ((*sp)->load (in, automation_path, linecnt)) {
-                               return -1;
-                       }
-                       
-                       ++sp;
-               }
-       }
-
-       return 0;
-}
-
 struct PanPlugins {
     string name;
     uint32_t nouts;
@@ -1215,10 +1067,6 @@ Panner::state (bool full)
        XMLNode* root = new XMLNode (X_("Panner"));
        char buf[32];
 
-       for (iterator p = begin(); p != end(); ++p) {
-               root->add_child_nocopy ((*p)->state (full));
-       }
-
        root->add_property (X_("linked"), (_linked ? "yes" : "no"));
        snprintf (buf, sizeof (buf), "%d", _link_direction);
        root->add_property (X_("link_direction"), buf);
@@ -1235,10 +1083,8 @@ Panner::state (bool full)
                root->add_child_nocopy (*onode);
        }
 
-       if (full) {
-               if (save () == 0) {
-                       root->add_property (X_("automation"), Glib::path_get_basename (automation_path));
-               }
+       for (vector<StreamPanner*>::const_iterator i = begin(); i != end(); ++i) {
+               root->add_child_nocopy ((*i)->state (full));
        }
 
        return *root;
@@ -1329,7 +1175,7 @@ Panner::set_state (const XMLNode& node)
                }       
        }
 
-       /* don't try to load automation if it wasn't marked as existing */
+       /* don't try to do old-school automation loading if it wasn't marked as existing */
 
        if ((prop = node.property (X_("automation")))) {
 
@@ -1629,3 +1475,83 @@ Panner::distribute (BufferSet& inbufs, BufferSet& outbufs, nframes_t start_frame
        }
 }
 
+/* old school automation handling */
+
+void
+Panner::set_name (string str)
+{
+       automation_path = _session.automation_dir();
+       automation_path += _session.snap_name();
+       automation_path += "-pan-";
+       automation_path += legalize_for_path (str);
+       automation_path += ".automation";
+}
+
+int
+Panner::load ()
+{
+       char line[128];
+       uint32_t linecnt = 0;
+       float version;
+       iterator sp;
+       LocaleGuard lg (X_("POSIX"));
+
+       if (automation_path.length() == 0) {
+               return 0;
+       }
+       
+       if (access (automation_path.c_str(), F_OK)) {
+               return 0;
+       }
+
+       ifstream in (automation_path.c_str());
+
+       if (!in) {
+               error << string_compose (_("cannot open pan automation file %1 (%2)"),
+                                 automation_path, strerror (errno))
+                     << endmsg;
+               return -1;
+       }
+
+       sp = begin();
+
+       while (in.getline (line, sizeof(line), '\n')) {
+
+               if (++linecnt == 1) {
+                       if (memcmp (line, X_("version"), 7) == 0) {
+                               if (sscanf (line, "version %f", &version) != 1) {
+                                       error << string_compose(_("badly formed version number in pan automation event file \"%1\""), automation_path) << endmsg;
+                                       return -1;
+                               }
+                       } else {
+                               error << string_compose(_("no version information in pan automation event file \"%1\" (first line = %2)"), 
+                                                automation_path, line) << endmsg;
+                               return -1;
+                       }
+
+                       continue;
+               }
+
+               if (strlen (line) == 0 || line[0] == '#') {
+                       continue;
+               }
+
+               if (strcmp (line, "begin") == 0) {
+                       
+                       if (sp == end()) {
+                               error << string_compose (_("too many panner states found in pan automation file %1"),
+                                                 automation_path)
+                                     << endmsg;
+                               return -1;
+                       }
+
+                       if ((*sp)->load (in, automation_path, linecnt)) {
+                               return -1;
+                       }
+                       
+                       ++sp;
+               }
+       }
+
+       return 0;
+}
index ee60a53d667d7616ae23b97576f03a0ebee9e537..d439cf126536fc2a0361cd6e9b48bd6d46fe0b3c 100644 (file)
@@ -90,10 +90,8 @@ Playlist::Playlist (Session& sess, const XMLNode& node, DataType type, bool hide
 
        init (hide);
        _name = "unnamed"; /* reset by set_state */
-       
-       if (set_state (node)) {
-               throw failed_constructor();
-       }
+
+       /* derived class calls set_state() */
 }
 
 Playlist::Playlist (const Playlist& other, string namestr, bool hide)
@@ -264,11 +262,19 @@ Playlist::Playlist (Playlist& pl)
 
 Playlist::~Playlist ()
 {
+       { 
+               RegionLock rl (this);
+
+               for (set<boost::shared_ptr<Region> >::iterator i = all_regions.begin(); i != all_regions.end(); ++i) {
+                       (*i)->set_playlist (0);
+               }
+       }
+
        /* GoingAway must be emitted by derived classes */
 }
 
 void
-Playlist::set_name (const string& str)
+Playlist::set_name (string str)
 {
        /* in a typical situation, a playlist is being used
           by one diskstream and also is referenced by the
@@ -563,8 +569,6 @@ Playlist::remove_region_internal (boost::shared_ptr<Region>region, bool delay_so
        RegionList::iterator i;
        nframes_t old_length = 0;
 
-       cerr << "removing region " << region->name() << " holding = " << holding_state() << endl;
-
        if (!holding_state()) {
                old_length = _get_maximum_extent();
        }
@@ -1140,6 +1144,7 @@ Playlist::region_changed_proxy (Change what_changed, boost::weak_ptr<Region> wea
                return;
        }
 
+
        /* this makes a virtual call to the right kind of playlist ... */
 
        region_changed (what_changed, region);
@@ -1259,6 +1264,7 @@ Playlist::find_next_region (nframes_t frame, RegionPoint point, int dir)
        boost::shared_ptr<Region> ret;
        nframes_t closest = max_frames;
 
+
        for (RegionList::iterator i = regions.begin(); i != regions.end(); ++i) {
 
                nframes_t distance;
@@ -1280,7 +1286,7 @@ Playlist::find_next_region (nframes_t frame, RegionPoint point, int dir)
                switch (dir) {
                case 1: /* forwards */
 
-                       if (pos > frame) {
+                       if (pos >= frame) {
                                if ((distance = pos - frame) < closest) {
                                        closest = distance;
                                        ret = r;
@@ -1291,7 +1297,7 @@ Playlist::find_next_region (nframes_t frame, RegionPoint point, int dir)
 
                default: /* backwards */
 
-                       if (pos < frame) {
+                       if (pos <= frame) {
                                if ((distance = frame - pos) < closest) {
                                        closest = distance;
                                        ret = r;
@@ -1455,13 +1461,21 @@ Playlist::state (bool full_state)
 bool
 Playlist::empty() const
 {
+       RegionLock rlock (const_cast<Playlist *>(this), false);
        return regions.empty();
 }
 
-ARDOUR::nframes_t
+uint32_t
+Playlist::n_regions() const
+{
+       RegionLock rlock (const_cast<Playlist *>(this), false);
+       return regions.size();
+}
+
+nframes_t
 Playlist::get_maximum_extent () const
 {
-       RegionLock rlock (const_cast<Playlist *>(this));
+       RegionLock rlock (const_cast<Playlist *>(this), false);
        return _get_maximum_extent ();
 }
 
@@ -1488,7 +1502,7 @@ Playlist::bump_name (string name, Session &session)
 
        do {
                newname = Playlist::bump_name_once (newname);
-       } while (session.playlist_by_name(newname)!=NULL);
+       } while (session.playlist_by_name (newname)!=NULL);
 
        return newname;
 }
index bdd4d0ada6f9b727175ff810235574759941aa30..b24b2619d3624bd80e07a395a8921e41643da25a 100644 (file)
@@ -86,7 +86,6 @@ PluginManager::PluginManager ()
        }
 
        refresh ();
-
        if (_manager == 0) {
                _manager = this;
        }
@@ -109,7 +108,7 @@ PluginManager::ladspa_refresh ()
        _ladspa_plugin_info.clear ();
 
        if (ladspa_path.length() == 0) {
-               ladspa_path = "/usr/local/lib/ladspa:/usr/lib/ladspa";
+               ladspa_path = "/usr/local/lib64/ladspa:/usr/local/lib/ladspa:/usr/lib64/ladspa:/usr/lib/ladspa:/Library/Audio/Plug-Ins/LADSPA";
        }
 
        ladspa_discover_from_path (ladspa_path);
diff --git a/libs/ardour/po/sv_SE.po b/libs/ardour/po/sv_SE.po
new file mode 100644 (file)
index 0000000..ddc7f10
--- /dev/null
@@ -0,0 +1,2025 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR "Paul Davis"
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: ardour\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2006-10-03 00:39+0200\n"
+"PO-Revision-Date: 2006-10-03 01:09+GMT+1\n"
+"Last-Translator: Petter Sundlöf <petter.sundlof@findus.dhs.org>\n"
+"Language-Team: Swedish <sv@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: libs/ardour/diskstream.cc:258
+msgid "Location \"%1\" not valid for track loop (start >= end)"
+msgstr ""
+
+#: libs/ardour/audio_diskstream.cc:298
+msgid "AudioDiskstream: Playlist \"%1\" isn't an audio playlist"
+msgstr ""
+
+#: libs/ardour/audio_diskstream.cc:349
+msgid "AudioDiskstream %1: there is no existing playlist to make a copy of!"
+msgstr ""
+
+#: libs/ardour/audio_diskstream.cc:924 libs/ardour/audio_diskstream.cc:935
+msgid ""
+"AudioDiskstream %1: when refilling, cannot read %2 from playlist at frame %3"
+msgstr ""
+
+#: libs/ardour/audio_diskstream.cc:1069
+msgid "AudioDiskstream %1: cannot read %2 from playlist at frame %3"
+msgstr ""
+
+#: libs/ardour/audio_diskstream.cc:1412 libs/ardour/audio_diskstream.cc:1429
+msgid "AudioDiskstream %1: cannot write to disk"
+msgstr ""
+
+#: libs/ardour/audio_diskstream.cc:1473
+msgid "AudioDiskstream \"%1\": cannot flush captured data to disk!"
+msgstr ""
+
+#: libs/ardour/audio_diskstream.cc:1563
+msgid "%1: could not create region for complete audio file"
+msgstr ""
+
+#: libs/ardour/audio_diskstream.cc:1587
+msgid "AudioDiskstream: could not create region for captured audio!"
+msgstr ""
+
+#: libs/ardour/audio_diskstream.cc:1643
+msgid "programmer error: %1"
+msgstr ""
+
+#: libs/ardour/audio_diskstream.cc:1929
+msgid "AudioDiskstream: channel %1 out of range"
+msgstr ""
+
+#: libs/ardour/audio_diskstream.cc:1952
+msgid "%1:%2 new capture file not initialized correctly"
+msgstr ""
+
+#: libs/ardour/audio_diskstream.cc:2178
+msgid "%1: cannot restore pending capture source file %2"
+msgstr ""
+
+#: libs/ardour/audio_diskstream.cc:2200
+msgid "%1: incorrect number of pending sources listed - ignoring them all"
+msgstr ""
+
+#: libs/ardour/audio_diskstream.cc:2215
+msgid "%1: cannot create whole-file region from pending capture sources"
+msgstr ""
+
+#: libs/ardour/audio_diskstream.cc:2227
+msgid "%1: cannot create region from pending capture sources"
+msgstr ""
+
+#: libs/ardour/audio_library.cc:92
+msgid "channels"
+msgstr ""
+
+#: libs/ardour/audio_library.cc:93
+msgid "samplerate"
+msgstr ""
+
+#: libs/ardour/audio_library.cc:94
+msgid "resolution"
+msgstr ""
+
+#: libs/ardour/audio_library.cc:95
+msgid "format"
+msgstr ""
+
+#: libs/ardour/audio_library.cc:102
+msgid "Could not open %1.  Audio Library not saved"
+msgstr ""
+
+#: libs/ardour/audio_playlist.cc:53 libs/ardour/audio_playlist.cc:63
+#: libs/ardour/audio_playlist.cc:74 libs/ardour/audio_playlist.cc:121
+#: libs/ardour/insert.cc:84 libs/ardour/insert.cc:103
+#: libs/ardour/insert.cc:128 libs/ardour/insert.cc:862
+#: libs/ardour/insert.cc:870 libs/ardour/send.cc:39 libs/ardour/send.cc:53
+#: libs/ardour/send.cc:62 libs/ardour/session_state.cc:1128
+#: libs/ardour/session_state.cc:1170
+msgid "initial state"
+msgstr ""
+
+#: libs/ardour/audio_playlist.cc:261 libs/ardour/audio_playlist.cc:743
+msgid ""
+"programming error: non-audio Region passed to remove_overlap in audio "
+"playlist"
+msgstr ""
+
+#: libs/ardour/audio_playlist.cc:388
+msgid ""
+"programming error: non-audio Region tested for overlap in audio playlist"
+msgstr ""
+
+#: libs/ardour/audio_playlist.cc:851
+msgid "xfade change"
+msgstr ""
+
+#: libs/ardour/audio_playlist.cc:874
+msgid "region modified"
+msgstr ""
+
+#: libs/ardour/audio_track.cc:105 libs/ardour/io.cc:1696
+#: libs/ardour/io.cc:1762
+msgid "Unknown connection \"%1\" listed for input of %2"
+msgstr ""
+
+#: libs/ardour/audio_track.cc:107 libs/ardour/io.cc:1698
+#: libs/ardour/io.cc:1764
+msgid "in 1"
+msgstr ""
+
+#: libs/ardour/audio_track.cc:108 libs/ardour/io.cc:1699
+#: libs/ardour/io.cc:1765
+msgid "No input connections available as a replacement"
+msgstr ""
+
+#: libs/ardour/audio_track.cc:112 libs/ardour/io.cc:1703
+#: libs/ardour/io.cc:1769
+msgid "Connection %1 was not available - \"in 1\" used instead"
+msgstr ""
+
+#: libs/ardour/audio_track.cc:121 libs/ardour/io.cc:1778
+msgid "improper input channel list in XML node (%1)"
+msgstr ""
+
+#: libs/ardour/audio_track.cc:162 libs/ardour/audio_track.cc:175
+msgid "AudioTrack: audio diskstream \"%1\" not known by session"
+msgstr ""
+
+#: libs/ardour/audio_track.cc:216
+msgid "programming error: AudioTrack given state without diskstream!"
+msgstr ""
+
+#: libs/ardour/audioengine.cc:146
+msgid "cannot activate JACK client"
+msgstr ""
+
+#: libs/ardour/audioengine.cc:421
+msgid "register input port called before engine was started"
+msgstr ""
+
+#: libs/ardour/audioengine.cc:457
+msgid "register output port called before engine was started"
+msgstr ""
+
+#: libs/ardour/audioengine.cc:539
+msgid "connect called before engine was started"
+msgstr ""
+
+#: libs/ardour/audioengine.cc:555
+msgid "AudioEngine: cannot connect %1 (%2) to %3 (%4)"
+msgstr ""
+
+#: libs/ardour/audioengine.cc:568 libs/ardour/audioengine.cc:597
+msgid "disconnect called before engine was started"
+msgstr ""
+
+#: libs/ardour/audioengine.cc:655
+msgid "get_port_by_name() called before engine was started"
+msgstr ""
+
+#: libs/ardour/audioengine.cc:699
+msgid "get_ports called before engine was started"
+msgstr ""
+
+#: libs/ardour/audioengine.cc:817
+msgid "get_nth_physical called before engine was started"
+msgstr ""
+
+#: libs/ardour/audioengine.cc:845
+msgid "get_port_total_latency() called with no JACK client connection"
+msgstr ""
+
+#: libs/ardour/audioengine.cc:851
+msgid "get_port_total_latency() called before engine was started"
+msgstr ""
+
+#: libs/ardour/audioengine.cc:982
+msgid "Unable to connect to JACK server"
+msgstr ""
+
+#: libs/ardour/audioengine.cc:985
+msgid "Could not connect to JACK server as  \"%1\""
+msgstr ""
+
+#: libs/ardour/audioengine.cc:990
+msgid "JACK server started"
+msgstr ""
+
+#: libs/ardour/audioengine.cc:1024
+msgid "cannot shutdown connection to JACK"
+msgstr ""
+
+#: libs/ardour/audioengine.cc:1049
+msgid "failed to connect to JACK"
+msgstr ""
+
+#: libs/ardour/audioengine.cc:1067
+msgid "could not reregister %1"
+msgstr ""
+
+#: libs/ardour/audioengine.cc:1125
+msgid "could not reconnect %1 and %2 (err = %3)"
+msgstr ""
+
+#: libs/ardour/audiofilesource.cc:355 libs/ardour/session_state.cc:2575
+msgid ""
+"there are already 1000 files with names like %1; versioning discontinued"
+msgstr ""
+
+#: libs/ardour/audiofilesource.cc:369 libs/ardour/session_state.cc:2589
+msgid "cannot rename audio file source from %1 to %2 (%3)"
+msgstr ""
+
+#: libs/ardour/audiofilesource.cc:376 libs/ardour/session_state.cc:2604
+msgid "cannot remove peakfile %1 for %2 (%3)"
+msgstr ""
+
+#: libs/ardour/audiofilesource.cc:420
+msgid "FileSource: search path not set"
+msgstr ""
+
+#: libs/ardour/audiofilesource.cc:444
+msgid ""
+"FileSource: \"%1\" is ambigous when searching %2\n"
+"\t"
+msgstr ""
+
+#: libs/ardour/audiofilesource.cc:450
+msgid "Filesource: cannot find required file (%1): while searching %2"
+msgstr ""
+
+#: libs/ardour/audiofilesource.cc:473
+msgid "Filesource: cannot find required file (%1): %2"
+msgstr ""
+
+#: libs/ardour/audiofilesource.cc:478
+msgid "Filesource: cannot check for existing file (%1): %2"
+msgstr ""
+
+#: libs/ardour/audiofilesource.cc:534 libs/ardour/insert.cc:532
+#: libs/ardour/session.cc:1967 libs/ardour/sndfilesource.cc:109
+msgid "programming error: %1"
+msgstr ""
+
+#: libs/ardour/audiofilesource.cc:540
+msgid ""
+"Programming error! Ardour tried to rename a file over another file! It's "
+"safe to continue working, but please report this to the developers."
+msgstr ""
+
+#: libs/ardour/audiofilesource.cc:545
+msgid "cannot rename audio file for %1 to %2"
+msgstr ""
+
+#: libs/ardour/audiofilter.cc:47
+msgid "audiofilter: error creating name for new audio file based on %1"
+msgstr ""
+
+#: libs/ardour/audiofilter.cc:57
+msgid "audiofilter: error creating new audio file %1 (%2)"
+msgstr ""
+
+#: libs/ardour/audioregion.cc:888 libs/ardour/audioregion.cc:950
+msgid "fade in change"
+msgstr ""
+
+#: libs/ardour/audioregion.cc:1321
+#, c-format
+msgid "normalized to %.2fdB"
+msgstr ""
+
+#: libs/ardour/audioregion.cc:1339
+msgid "envelope change"
+msgstr ""
+
+#: libs/ardour/audiosource.cc:144
+msgid "poll on peak request pipe failed (%1)"
+msgstr ""
+
+#: libs/ardour/audiosource.cc:151
+msgid "Error on peak thread request pipe"
+msgstr ""
+
+#: libs/ardour/audiosource.cc:184
+msgid "Error reading from peak request pipe"
+msgstr ""
+
+#: libs/ardour/audiosource.cc:216 libs/ardour/session_butler.cc:80
+#: libs/ardour/session_midi.cc:1073
+msgid "Cannot create transport request signal pipe (%1)"
+msgstr ""
+
+#: libs/ardour/audiosource.cc:221 libs/ardour/audiosource.cc:226
+msgid "UI: cannot set O_NONBLOCK on peak request pipe (%1)"
+msgstr ""
+
+#: libs/ardour/audiosource.cc:231
+msgid "AudioSource: could not create peak thread"
+msgstr ""
+
+#: libs/ardour/audiosource.cc:326
+msgid "cannot rename peakfile for %1 from %2 to %3 (%4)"
+msgstr ""
+
+#: libs/ardour/audiosource.cc:368
+msgid "AudioSource: cannot stat peakfile \"%1\""
+msgstr ""
+
+#: libs/ardour/audiosource.cc:466
+msgid "cannot read sample data for unscaled peak computation"
+msgstr ""
+
+#: libs/ardour/audiosource.cc:486 libs/ardour/audiosource.cc:557
+#: libs/ardour/audiosource.cc:793 libs/ardour/audiosource.cc:882
+msgid "AudioSource: cannot open peakpath \"%1\" (%2)"
+msgstr ""
+
+#: libs/ardour/audiosource.cc:657
+msgid "AudioSource[%1]: peak read - cannot read %2 samples at offset %3"
+msgstr ""
+
+#: libs/ardour/audiosource.cc:804
+msgid "%1: could not write read raw data for peak computation (%2)"
+msgstr ""
+
+#: libs/ardour/audiosource.cc:829
+msgid "%1: could not write peak file data (%2)"
+msgstr ""
+
+#: libs/ardour/auditioner.cc:118
+msgid "Auditioning of non-audio regions not yet supported"
+msgstr ""
+
+#: libs/ardour/automation_event.cc:67 libs/ardour/location.cc:375
+#: libs/ardour/tempo.cc:226
+msgid "initial"
+msgstr ""
+
+#: libs/ardour/automation_event.cc:240
+msgid "cleared"
+msgstr ""
+
+#: libs/ardour/automation_event.cc:412
+msgid "added event"
+msgstr ""
+
+#: libs/ardour/automation_event.cc:429
+msgid "removed event"
+msgstr ""
+
+#: libs/ardour/automation_event.cc:444
+msgid "removed multiple events"
+msgstr ""
+
+#: libs/ardour/automation_event.cc:475 libs/ardour/automation_event.cc:506
+msgid "removed range"
+msgstr ""
+
+#: libs/ardour/automation_event.cc:536
+msgid "event range adjusted"
+msgstr ""
+
+#: libs/ardour/automation_event.cc:558
+msgid "event adjusted"
+msgstr ""
+
+#: libs/ardour/automation_event.cc:673 libs/ardour/automation_event.cc:778
+#: libs/ardour/panner.cc:889
+msgid "programming error:"
+msgstr ""
+
+#: libs/ardour/automation_event.cc:1087
+msgid "cut/copy/clear"
+msgstr ""
+
+#: libs/ardour/automation_event.cc:1120
+msgid "copy"
+msgstr ""
+
+#: libs/ardour/automation_event.cc:1188 libs/ardour/playlist.cc:960
+msgid "paste"
+msgstr ""
+
+#: libs/ardour/automation_event.cc:1243
+msgid ""
+"automation list: no x-coordinate stored for control point (point ignored)"
+msgstr ""
+
+#: libs/ardour/automation_event.cc:1249
+msgid ""
+"automation list: no y-coordinate stored for control point (point ignored)"
+msgstr ""
+
+#: libs/ardour/configuration.cc:87
+msgid "loading system configuration file %1"
+msgstr ""
+
+#: libs/ardour/configuration.cc:90
+msgid "Ardour: cannot read system configuration file \"%1\""
+msgstr ""
+
+#: libs/ardour/configuration.cc:97
+msgid "Ardour: system configuration file \"%1\" not loaded successfully."
+msgstr ""
+
+#: libs/ardour/configuration.cc:111
+msgid "loading user configuration file %1"
+msgstr ""
+
+#: libs/ardour/configuration.cc:114
+msgid "Ardour: cannot read configuration file \"%1\""
+msgstr ""
+
+#: libs/ardour/configuration.cc:121
+msgid "Ardour: user configuration file \"%1\" not loaded successfully."
+msgstr ""
+
+#: libs/ardour/configuration.cc:141
+msgid "Config file %1 not saved"
+msgstr ""
+
+#: libs/ardour/configuration.cc:226
+msgid "ill-formed MIDI port specification in ardour rcfile (ignored)"
+msgstr ""
+
+#: libs/ardour/connection.cc:183
+msgid "Node for Connection has no \"name\" property"
+msgstr ""
+
+#: libs/ardour/connection.cc:191
+msgid "Node for Connection has no \"connections\" property"
+msgstr ""
+
+#: libs/ardour/connection.cc:227 libs/ardour/io.cc:1838
+msgid "IO: badly formed string in XML node for inputs \"%1\""
+msgstr ""
+
+#: libs/ardour/connection.cc:232 libs/ardour/io.cc:1843
+msgid "bad input string in XML node \"%1\""
+msgstr ""
+
+#: libs/ardour/control_protocol_manager.cc:84
+msgid "control protocol name \"%1\" has no descriptor"
+msgstr ""
+
+#: libs/ardour/control_protocol_manager.cc:89
+msgid "control protocol name \"%1\" could not be initialized"
+msgstr ""
+
+#: libs/ardour/control_protocol_manager.cc:145
+msgid "Instantiating mandatory control protocol %1"
+msgstr ""
+
+#: libs/ardour/control_protocol_manager.cc:179
+msgid "Control protocol %1 not usable"
+msgstr ""
+
+#: libs/ardour/control_protocol_manager.cc:192
+msgid "Control surface protocol discovered: \"%1\""
+msgstr ""
+
+#: libs/ardour/control_protocol_manager.cc:210
+msgid "ControlProtocolManager: cannot load module \"%1\" (%2)"
+msgstr ""
+
+#: libs/ardour/control_protocol_manager.cc:218
+msgid "ControlProtocolManager: module \"%1\" has no descriptor function."
+msgstr ""
+
+#: libs/ardour/crossfade.cc:120
+msgid "Crossfade: no \"in\" region in state"
+msgstr ""
+
+#: libs/ardour/crossfade.cc:127
+msgid "Crossfade: no \"in\" region %1 found in playlist %2"
+msgstr ""
+
+#: libs/ardour/crossfade.cc:137
+msgid "Crossfade: no \"out\" region in state"
+msgstr ""
+
+#: libs/ardour/crossfade.cc:144
+msgid "Crossfade: no \"out\" region %1 found in playlist %2"
+msgstr ""
+
+#: libs/ardour/crossfade.cc:491
+msgid "active changed"
+msgstr ""
+
+#: libs/ardour/crossfade.cc:740
+msgid "old-style crossfade information - no position information"
+msgstr ""
+
+#: libs/ardour/curve.cc:117 libs/ardour/globals.cc:348
+#: libs/ardour/insert.cc:454 libs/ardour/session.cc:2432
+#: libs/ardour/session.cc:2486
+msgid "programming error: "
+msgstr ""
+
+#: libs/ardour/cycle_timer.cc:37
+msgid "CycleTimer::get_mhz(): can't open /proc/cpuinfo"
+msgstr ""
+
+#: libs/ardour/cycle_timer.cc:49
+msgid "CycleTimer::get_mhz(): cannot locate cpu MHz in /proc/cpuinfo"
+msgstr ""
+
+#: libs/ardour/cycle_timer.cc:72
+msgid "cannot locate cpu MHz in /proc/cpuinfo"
+msgstr ""
+
+#: libs/ardour/destructive_filesource.cc:200
+msgid "DestructiveFileSource: \"%1\" bad read retval: %2 of %5 (%3: %4)"
+msgstr ""
+
+#: libs/ardour/destructive_filesource.cc:213
+#: libs/ardour/destructive_filesource.cc:258
+#: libs/ardour/destructive_filesource.cc:265
+msgid "DestructiveFileSource: \"%1\" bad write (%2)"
+msgstr ""
+
+#: libs/ardour/destructive_filesource.cc:403
+msgid ""
+"Filesource: start time is already set for existing file (%1): Cannot change "
+"start time."
+msgstr ""
+
+#: libs/ardour/globals.cc:110
+msgid "no MIDI ports specified: no MMC or MTC control possible"
+msgstr ""
+
+#: libs/ardour/globals.cc:125
+msgid "MIDI port specifications for \"%1\" are not understandable."
+msgstr ""
+
+#: libs/ardour/globals.cc:138 libs/ardour/globals.cc:142
+#: libs/ardour/globals.cc:146
+msgid "default"
+msgstr ""
+
+#: libs/ardour/globals.cc:174
+msgid "No MMC control (MIDI port \"%1\" not available)"
+msgstr ""
+
+#: libs/ardour/globals.cc:180
+msgid "No MTC support (MIDI port \"%1\" not available)"
+msgstr ""
+
+#: libs/ardour/globals.cc:185
+msgid "No MIDI parameter support (MIDI port \"%1\" not available)"
+msgstr ""
+
+#: libs/ardour/import.cc:77
+msgid "Import: cannot open input sound file \"%1\""
+msgstr ""
+
+#: libs/ardour/import.cc:82
+msgid "resampling audio"
+msgstr ""
+
+#: libs/ardour/import.cc:86
+msgid "Import: cannot open converted sound file \"%1\""
+msgstr ""
+
+#: libs/ardour/import.cc:91
+msgid "Import: error while resampling sound file \"%1\""
+msgstr ""
+
+#: libs/ardour/import.cc:145
+msgid "Session::import_audiofile: cannot open new file source for channel %1"
+msgstr ""
+
+#: libs/ardour/import.cc:163
+msgid "converting audio"
+msgstr ""
+
+#: libs/ardour/import.cc:195
+msgid "building region"
+msgstr ""
+
+#: libs/ardour/import.cc:197
+msgid "building regions"
+msgstr ""
+
+#: libs/ardour/import.cc:309
+msgid "Import/SRC: could not open input file: %1"
+msgstr ""
+
+#: libs/ardour/import.cc:317
+msgid "Import/SRC: could not open output file: %1"
+msgstr ""
+
+#: libs/ardour/import.cc:326
+msgid "Import: src_new() failed : %1"
+msgstr ""
+
+#: libs/ardour/import.cc:354
+msgid "Import: %1"
+msgstr ""
+
+#: libs/ardour/insert.cc:651 libs/ardour/insert.cc:960
+msgid "XML node describing insert is missing the `type' field"
+msgstr ""
+
+#: libs/ardour/insert.cc:660
+msgid "unknown plugin type %1 in plugin insert state"
+msgstr ""
+
+#: libs/ardour/insert.cc:672
+msgid "XML node describing insert is missing the `id' field"
+msgstr ""
+
+#: libs/ardour/insert.cc:685
+msgid ""
+"Found a reference to a plugin (\"%1\") that is unknown.\n"
+"Perhaps it was removed or moved since it was last used."
+msgstr ""
+
+#: libs/ardour/insert.cc:723 libs/ardour/insert.cc:977
+msgid "XML node describing insert is missing a Redirect node"
+msgstr ""
+
+#: libs/ardour/insert.cc:728
+msgid "XML node describing a plugin insert is missing the `%1' information"
+msgstr ""
+
+#: libs/ardour/insert.cc:752
+msgid "PluginInsert: Auto: no ladspa port number"
+msgstr ""
+
+#: libs/ardour/insert.cc:759
+msgid "PluginInsert: Auto: port id out of range"
+msgstr ""
+
+#: libs/ardour/insert.cc:775
+msgid "XML node describing a port automation is missing the `%1' information"
+msgstr ""
+
+#: libs/ardour/insert.cc:878
+msgid "PortInsert: cannot add input port"
+msgstr ""
+
+#: libs/ardour/insert.cc:883
+msgid "PortInsert: cannot add output port"
+msgstr ""
+
+#: libs/ardour/insert.cc:965
+msgid "non-port insert XML used for port plugin insert"
+msgstr ""
+
+#: libs/ardour/io.cc:603
+msgid "IO: cannot disconnect input port %1 from %2"
+msgstr ""
+
+#: libs/ardour/io.cc:671
+msgid "IO: cannot disconnect output port %1 from %2"
+msgstr ""
+
+#: libs/ardour/io.cc:822 libs/ardour/io.cc:1177 libs/ardour/io.cc:1303
+#, c-format
+msgid "%s/out"
+msgstr ""
+
+#: libs/ardour/io.cc:824 libs/ardour/io.cc:1179 libs/ardour/io.cc:1305
+#: libs/ardour/io.cc:2688
+#, c-format
+msgid "%s/out %u"
+msgstr ""
+
+#: libs/ardour/io.cc:828 libs/ardour/io.cc:1184 libs/ardour/io.cc:1309
+msgid "IO: cannot register output port %1"
+msgstr ""
+
+#: libs/ardour/io.cc:934 libs/ardour/io.cc:1037 libs/ardour/io.cc:1143
+#, c-format
+msgid "%s/in"
+msgstr ""
+
+#: libs/ardour/io.cc:936 libs/ardour/io.cc:1040 libs/ardour/io.cc:1146
+#: libs/ardour/io.cc:2658
+#, c-format
+msgid "%s/in %u"
+msgstr ""
+
+#: libs/ardour/io.cc:940 libs/ardour/io.cc:1046 libs/ardour/io.cc:1151
+msgid "IO: cannot register input port %1"
+msgstr ""
+
+#: libs/ardour/io.cc:1551
+msgid "IO::connecting_became_legal() called without a pending state node"
+msgstr ""
+
+#: libs/ardour/io.cc:1574
+msgid "IO::ports_became_legal() called without a pending state node"
+msgstr ""
+
+#: libs/ardour/io.cc:1603
+msgid "incorrect XML node \"%1\" passed to IO object"
+msgstr ""
+
+#: libs/ardour/io.cc:1719 libs/ardour/io.cc:1787
+msgid "Unknown connection \"%1\" listed for output of %2"
+msgstr ""
+
+#: libs/ardour/io.cc:1721 libs/ardour/io.cc:1789
+msgid "out 1"
+msgstr ""
+
+#: libs/ardour/io.cc:1722 libs/ardour/io.cc:1790
+msgid "No output connections available as a replacement"
+msgstr ""
+
+#: libs/ardour/io.cc:1726 libs/ardour/io.cc:1794
+msgid "Connection %1 was not available - \"out 1\" used instead"
+msgstr ""
+
+#: libs/ardour/io.cc:1740
+msgid "%1: cannot create I/O ports"
+msgstr ""
+
+#: libs/ardour/io.cc:1803
+msgid "improper output channel list in XML node (%1)"
+msgstr ""
+
+#: libs/ardour/io.cc:1888
+msgid "IO: badly formed string in XML node for outputs \"%1\""
+msgstr ""
+
+#: libs/ardour/io.cc:1893
+msgid "IO: bad output string in XML node \"%1\""
+msgstr ""
+
+#: libs/ardour/io.cc:2391
+msgid "%1: could not open automation event file \"%2\""
+msgstr ""
+
+#: libs/ardour/io.cc:2430
+msgid "%1: cannot open automation event file \"%2\" (%2)"
+msgstr ""
+
+#: libs/ardour/io.cc:2445
+msgid "badly formed version number in automation event file \"%1\""
+msgstr ""
+
+#: libs/ardour/io.cc:2449
+msgid "no version information in automation event file \"%1\""
+msgstr ""
+
+#: libs/ardour/io.cc:2454
+msgid "mismatched automation event file version (%1)"
+msgstr ""
+
+#: libs/ardour/io.cc:2462
+msgid "badly formatted automation event record at line %1 of %2 (ignored)"
+msgstr ""
+
+#: libs/ardour/io.cc:2482
+msgid "dubious automation event found (and ignored)"
+msgstr ""
+
+#: libs/ardour/io.cc:2486 libs/ardour/panner.cc:288
+#: libs/ardour/redirect.cc:148
+msgid "loaded from disk"
+msgstr ""
+
+#: libs/ardour/io.cc:2630
+msgid "automation write/touch"
+msgstr ""
+
+#: libs/ardour/ladspa_plugin.cc:87
+msgid "LADSPA: module has no descriptor function."
+msgstr ""
+
+#: libs/ardour/ladspa_plugin.cc:92
+msgid "LADSPA: plugin has gone away since discovery!"
+msgstr ""
+
+#: libs/ardour/ladspa_plugin.cc:99
+msgid "LADSPA: \"%1\" cannot be used, since it cannot do inplace processing"
+msgstr ""
+
+#: libs/ardour/ladspa_plugin.cc:315
+msgid ""
+"illegal parameter number used with plugin \"%1\". This mayindicate a change "
+"in the plugin design, and presets may beinvalid"
+msgstr ""
+
+#: libs/ardour/ladspa_plugin.cc:394
+msgid "Bad node sent to LadspaPlugin::set_state"
+msgstr ""
+
+#: libs/ardour/ladspa_plugin.cc:407
+msgid "LADSPA: no ladspa port number"
+msgstr ""
+
+#: libs/ardour/ladspa_plugin.cc:413
+msgid "LADSPA: no ladspa port data"
+msgstr ""
+
+#: libs/ardour/ladspa_plugin.cc:653
+msgid "LADSPA: cannot load module from \"%1\""
+msgstr ""
+
+#: libs/ardour/location.cc:295
+msgid "incorrect XML node passed to Location::set_state"
+msgstr ""
+
+#: libs/ardour/location.cc:300
+msgid "XML node for Location has no ID information"
+msgstr ""
+
+#: libs/ardour/location.cc:306
+msgid "XML node for Location has no name information"
+msgstr ""
+
+#: libs/ardour/location.cc:313
+msgid "XML node for Location has no start information"
+msgstr ""
+
+#: libs/ardour/location.cc:324
+msgid "XML node for Location has no end information"
+msgstr ""
+
+#: libs/ardour/location.cc:333
+msgid "XML node for Location has no flags information"
+msgstr ""
+
+#: libs/ardour/location.cc:421
+msgid "Locations: attempt to use unknown location as selected location"
+msgstr ""
+
+#: libs/ardour/location.cc:448 libs/ardour/playlist.cc:1204
+msgid "clear"
+msgstr ""
+
+#: libs/ardour/location.cc:473
+msgid "clear markers"
+msgstr ""
+
+#: libs/ardour/location.cc:501
+msgid "clear ranges"
+msgstr ""
+
+#: libs/ardour/location.cc:519
+msgid "add"
+msgstr ""
+
+#: libs/ardour/location.cc:557
+msgid "remove"
+msgstr ""
+
+#: libs/ardour/location.cc:597
+msgid "incorrect XML mode passed to Locations::set_state"
+msgstr ""
+
+#: libs/ardour/location.cc:615
+msgid "could not load location from session file - ignored"
+msgstr ""
+
+#: libs/ardour/mtc_slave.cc:196
+msgid "MTC Slave: atomic read of current time failed, sleeping!"
+msgstr ""
+
+#: libs/ardour/named_selection.cc:77
+msgid "Chunk %1 uses an unknown playlist \"%2\""
+msgstr ""
+
+#: libs/ardour/named_selection.cc:80
+msgid "Chunk %1 contains misformed playlist information"
+msgstr ""
+
+#: libs/ardour/panner.cc:211
+msgid "automation write pass"
+msgstr ""
+
+#: libs/ardour/panner.cc:251
+#, c-format
+msgid "error writing pan automation file (%s)"
+msgstr ""
+
+#: libs/ardour/panner.cc:279
+msgid ""
+"badly formatted pan automation event record at line %1 of %2 (ignored) [%3]"
+msgstr ""
+
+#: libs/ardour/panner.cc:794
+msgid "badly-formed positional data for Multi2dPanner - ignored"
+msgstr ""
+
+#: libs/ardour/panner.cc:1083
+msgid "cannot open pan automation file \"%1\" for saving (%2)"
+msgstr ""
+
+#: libs/ardour/panner.cc:1119
+msgid "cannot open pan automation file %1 (%2)"
+msgstr ""
+
+#: libs/ardour/panner.cc:1132
+msgid "badly formed version number in pan automation event file \"%1\""
+msgstr ""
+
+#: libs/ardour/panner.cc:1136
+msgid ""
+"no version information in pan automation event file \"%1\" (first line = %2)"
+msgstr ""
+
+#: libs/ardour/panner.cc:1142
+msgid "mismatched pan automation event file version (%1)"
+msgstr ""
+
+#: libs/ardour/panner.cc:1156
+msgid "too many panner states found in pan automation file %1"
+msgstr ""
+
+#: libs/ardour/panner.cc:1297
+msgid "Unknown panner plugin \"%1\" found in pan state - ignored"
+msgstr ""
+
+#: libs/ardour/panner.cc:1303
+msgid "panner plugin node has no type information!"
+msgstr ""
+
+#: libs/ardour/playlist.cc:251
+msgid "playlist const copy constructor called"
+msgstr ""
+
+#: libs/ardour/playlist.cc:257
+msgid "playlist non-const copy constructor called"
+msgstr ""
+
+#: libs/ardour/playlist.cc:498
+msgid "add region"
+msgstr ""
+
+#: libs/ardour/playlist.cc:550
+msgid "replace region"
+msgstr ""
+
+#: libs/ardour/playlist.cc:563
+msgid "remove region"
+msgstr ""
+
+#: libs/ardour/playlist.cc:635
+msgid "separate"
+msgstr ""
+
+#: libs/ardour/playlist.cc:899
+msgid "cut"
+msgstr ""
+
+#: libs/ardour/playlist.cc:989
+msgid "duplicate"
+msgstr ""
+
+#: libs/ardour/playlist.cc:1044
+msgid "split"
+msgstr ""
+
+#: libs/ardour/playlist.cc:1121
+msgid "%1: bounds changed received for region (%2)not in playlist"
+msgstr ""
+
+#: libs/ardour/playlist.cc:1377
+msgid "Playlist: cannot create region from state file"
+msgstr ""
+
+#: libs/ardour/playlist.cc:1737
+msgid "nudged"
+msgstr ""
+
+#: libs/ardour/playlist_factory.cc:40
+msgid ""
+"programming error: Playlist::copyPlaylist called with unknown Playlist type"
+msgstr ""
+
+#: libs/ardour/plugin.cc:218
+msgid "Could not locate HOME.  Preset not saved."
+msgstr ""
+
+#: libs/ardour/plugin.cc:228 libs/ardour/plugin.cc:234
+msgid "Could not create %1.  Preset not saved. (%2)"
+msgstr ""
+
+#: libs/ardour/plugin.cc:239
+msgid "Error saving presets file %1."
+msgstr ""
+
+#: libs/ardour/plugin_manager.cc:192
+msgid "Could not parse rdf file: %1"
+msgstr ""
+
+#: libs/ardour/plugin_manager.cc:232
+msgid "LADSPA: cannot load module \"%1\" (%2)"
+msgstr ""
+
+#: libs/ardour/plugin_manager.cc:239
+msgid "LADSPA: module \"%1\" has no descriptor function."
+msgstr ""
+
+#: libs/ardour/plugin_manager.cc:295 libs/ardour/plugin_manager.cc:307
+msgid "Unknown"
+msgstr ""
+
+#: libs/ardour/plugin_manager.cc:380
+msgid ""
+"VST plugin %1 does not support processReplacing, and so cannot be used in "
+"ardour at this time"
+msgstr ""
+
+#: libs/ardour/recent_sessions.cc:44
+msgid "cannot open recent session file %1 (%2)"
+msgstr ""
+
+#: libs/ardour/redirect.cc:77
+msgid "programming error: unknown Redirect type in Redirect::Clone!\n"
+msgstr ""
+
+#: libs/ardour/redirect.cc:102 libs/ardour/utils.cc:194
+msgid "pre"
+msgstr ""
+
+#: libs/ardour/redirect.cc:104 libs/ardour/utils.cc:197
+msgid "post"
+msgstr ""
+
+#: libs/ardour/redirect.cc:107
+msgid "Redirect: unknown placement string \"%1\" (ignored)"
+msgstr ""
+
+#: libs/ardour/redirect.cc:125
+msgid "%1: cannot open %2 to load automation data (%3)"
+msgstr ""
+
+#: libs/ardour/redirect.cc:154
+msgid "%1: cannot load automation data from %2"
+msgstr ""
+
+#: libs/ardour/redirect.cc:175
+msgid "%1: cannot open %2 to store automation data (%3)"
+msgstr ""
+
+#: libs/ardour/redirect.cc:194 libs/ardour/redirect.cc:201
+msgid "%1: could not save automation state to %2"
+msgstr ""
+
+#: libs/ardour/redirect.cc:246
+msgid "Could not get state from Redirect (%1).  Problem with save_automation"
+msgstr ""
+
+#: libs/ardour/redirect.cc:296
+msgid "incorrect XML node \"%1\" passed to Redirect object"
+msgstr ""
+
+#: libs/ardour/redirect.cc:318
+msgid "%1: Automation node has no path property"
+msgstr ""
+
+#: libs/ardour/redirect.cc:343
+msgid "XML node describing an IO is missing an IO node"
+msgstr ""
+
+#: libs/ardour/redirect.cc:348
+msgid "XML node describing a redirect is missing the `active' field"
+msgstr ""
+
+#: libs/ardour/redirect.cc:358
+msgid "XML node describing a redirect is missing the `placement' field"
+msgstr ""
+
+#: libs/ardour/redirect.cc:467
+msgid "active_changed"
+msgstr ""
+
+#: libs/ardour/region.cc:901
+msgid "Session: XMLNode describing a Region is incomplete (no id)"
+msgstr ""
+
+#: libs/ardour/region.cc:908
+msgid "Session: XMLNode describing a Region is incomplete (no name)"
+msgstr ""
+
+#: libs/ardour/region_factory.cc:53 libs/ardour/region_factory.cc:70
+msgid ""
+"programming error: RegionFactory::create() called with unknown Region type"
+msgstr ""
+
+#: libs/ardour/route.cc:81 libs/ardour/session.cc:1434
+#: libs/ardour/session.cc:1440 libs/ardour/session.cc:3064
+msgid "signal"
+msgstr ""
+
+#: libs/ardour/route.cc:1407
+msgid "Could not get state of route.  Problem with save_automation"
+msgstr ""
+
+#: libs/ardour/route.cc:1459
+msgid "Send construction failed"
+msgstr ""
+
+#: libs/ardour/route.cc:1481
+msgid "unknown Insert type \"%1\"; ignored"
+msgstr ""
+
+#: libs/ardour/route.cc:1487
+msgid "Insert XML node has no type property"
+msgstr ""
+
+#: libs/ardour/route.cc:1492
+msgid "insert could not be created. Ignored."
+msgstr ""
+
+#: libs/ardour/route.cc:1508
+msgid "Bad node sent to Route::set_state() [%1]"
+msgstr ""
+
+#: libs/ardour/route.cc:1572
+msgid "Route %1: unknown edit group \"%2 in saved state (ignored)"
+msgstr ""
+
+#: libs/ardour/route.cc:1588 libs/ardour/route.cc:1592
+msgid "badly formed order key string in state file! [%1] ... ignored."
+msgstr ""
+
+#: libs/ardour/route.cc:1673 libs/ardour/route.cc:1761
+msgid "[control]"
+msgstr ""
+
+#: libs/ardour/route.cc:1693
+msgid "Route %1: unknown mix group \"%2 in saved state (ignored)"
+msgstr ""
+
+#: libs/ardour/send.cc:99
+msgid "XML node describing a send is missing a Redirect node"
+msgstr ""
+
+#: libs/ardour/session.cc:111
+msgid "Could not resolve path: %1 (%2)"
+msgstr ""
+
+#: libs/ardour/session.cc:123
+msgid "cannot check session path %1 (%2)"
+msgstr ""
+
+#: libs/ardour/session.cc:153
+msgid "cannot check statefile %1 (%2)"
+msgstr ""
+
+#: libs/ardour/session.cc:189
+msgid "%1 is not an Ardour snapshot file"
+msgstr ""
+
+#: libs/ardour/session.cc:206
+msgid "cannot determine current working directory (%1)"
+msgstr ""
+
+#: libs/ardour/session.cc:223
+msgid "unknown file type for session %1"
+msgstr ""
+
+#: libs/ardour/session.cc:343
+msgid "monitor"
+msgstr ""
+
+#: libs/ardour/session.cc:351
+msgid "master"
+msgstr ""
+
+#: libs/ardour/session.cc:633
+msgid "could not setup Click I/O"
+msgstr ""
+
+#: libs/ardour/session.cc:654
+msgid "cannot setup Click I/O"
+msgstr ""
+
+#: libs/ardour/session.cc:676
+msgid "cannot create Auditioner: no auditioning of regions possible"
+msgstr ""
+
+#: libs/ardour/session.cc:688
+#, c-format
+msgid "out %<PRIu32>"
+msgstr ""
+
+#: libs/ardour/session.cc:700
+#, c-format
+msgid "in %<PRIu32>"
+msgstr ""
+
+#: libs/ardour/session.cc:714
+#, c-format
+msgid "out %<PRIu32>+%<PRIu32>"
+msgstr ""
+
+#: libs/ardour/session.cc:728
+#, c-format
+msgid "in %<PRIu32>+%<PRIu32>"
+msgstr ""
+
+#: libs/ardour/session.cc:761
+msgid "cannot setup master inputs"
+msgstr ""
+
+#: libs/ardour/session.cc:769
+msgid "cannot setup master outputs"
+msgstr ""
+
+#: libs/ardour/session.cc:780
+msgid "Master Out"
+msgstr ""
+
+#: libs/ardour/session.cc:852
+msgid "cannot setup control inputs"
+msgstr ""
+
+#: libs/ardour/session.cc:860
+msgid "cannot set up master outputs"
+msgstr ""
+
+#: libs/ardour/session.cc:1043
+msgid "Session: you can't use that location for auto punch (start <= end)"
+msgstr ""
+
+#: libs/ardour/session.cc:1080
+msgid "Session: you can't use a mark for auto loop"
+msgstr ""
+
+#: libs/ardour/session.cc:1452
+msgid "feedback loop setup between %1 and %2"
+msgstr ""
+
+#: libs/ardour/session.cc:1629 libs/ardour/session.cc:1750
+msgid "cannot configure %1 in/%2 out configuration for new audio track"
+msgstr ""
+
+#: libs/ardour/session.cc:1687
+msgid "Session: could not create new audio track."
+msgstr ""
+
+#: libs/ardour/session.cc:1800
+msgid "Session: could not create new audio route."
+msgstr ""
+
+#: libs/ardour/session.cc:2319
+msgid "cannot create new name for region \"%1\""
+msgstr ""
+
+#: libs/ardour/session.cc:2383
+msgid "too many regions with names like %1"
+msgstr ""
+
+#: libs/ardour/session.cc:2883
+msgid "There are already %1 recordings for %2, which I consider too many."
+msgstr ""
+
+#: libs/ardour/session.cc:3085
+msgid "Cannot compile tape track regexp for use (%1)"
+msgstr ""
+
+#: libs/ardour/session.cc:3232
+msgid "programming error: unknown type of Insert created!"
+msgstr ""
+
+#: libs/ardour/session.cc:3238
+msgid "programming error: unknown type of Redirect created!"
+msgstr ""
+
+#: libs/ardour/session.cc:3261
+msgid "programming error: unknown type of Insert deleted!"
+msgstr ""
+
+#: libs/ardour/session.cc:3267
+msgid "programming error: unknown type of Redirect deleted!"
+msgstr ""
+
+#: libs/ardour/session.cc:3573
+msgid "too many bounced versions of playlist \"%1\""
+msgstr ""
+
+#: libs/ardour/session.cc:3582
+msgid "cannot create new audio file \"%1\" for %2"
+msgstr ""
+
+#: libs/ardour/session_butler.cc:85 libs/ardour/session_butler.cc:90
+msgid "UI: cannot set O_NONBLOCK on butler request pipe (%1)"
+msgstr ""
+
+#: libs/ardour/session_butler.cc:95
+msgid "Session: could not create butler thread"
+msgstr ""
+
+#: libs/ardour/session_butler.cc:183
+msgid "poll on butler request pipe failed (%1)"
+msgstr ""
+
+#: libs/ardour/session_butler.cc:190
+msgid "Error on butler thread request pipe: fd=%1 err=%2"
+msgstr ""
+
+#: libs/ardour/session_butler.cc:231
+msgid "Error reading from butler request pipe"
+msgstr ""
+
+#: libs/ardour/session_butler.cc:268
+msgid "Butler read ahead failure on dstream %1"
+msgstr ""
+
+#: libs/ardour/session_butler.cc:311
+msgid "Butler write-behind failure on dstream %1"
+msgstr ""
+
+#: libs/ardour/session_click.cc:160
+msgid "cannot open click soundfile %1 (%2)"
+msgstr ""
+
+#: libs/ardour/session_click.cc:169
+msgid "cannot read data from click soundfile"
+msgstr ""
+
+#: libs/ardour/session_click.cc:196
+msgid "cannot open click emphasis soundfile %1 (%2)"
+msgstr ""
+
+#: libs/ardour/session_click.cc:204
+msgid "cannot read data from click emphasis soundfile"
+msgstr ""
+
+#: libs/ardour/session_command.cc:49
+msgid "Tried to reconstitute a MementoCommand with no contents, failing. id="
+msgstr ""
+
+#: libs/ardour/session_command.cc:95
+msgid "could not reconstitute MementoCommand from XMLNode. id="
+msgstr ""
+
+#: libs/ardour/session_events.cc:161
+msgid "Session: cannot have two events of type %1 at the same frame (%2)."
+msgstr ""
+
+#: libs/ardour/session_events.cc:422
+msgid "Programming error: illegal event type in process_event (%1)"
+msgstr ""
+
+#: libs/ardour/session_export.cc:63
+msgid "Export: no output file specified"
+msgstr ""
+
+#: libs/ardour/session_export.cc:164 libs/ardour/session_export.cc:169
+msgid "illegal frame range in export specification"
+msgstr ""
+
+#: libs/ardour/session_export.cc:174
+msgid "Bad data width size.  Report me!"
+msgstr ""
+
+#: libs/ardour/session_export.cc:204
+msgid "Export: cannot open output file \"%1\" (%2)"
+msgstr ""
+
+#: libs/ardour/session_export.cc:214
+msgid "cannot initialize sample rate conversion: %1"
+msgstr ""
+
+#: libs/ardour/session_export.cc:316
+msgid "an error occured during sample rate conversion: %1"
+msgstr ""
+
+#: libs/ardour/session_export.cc:327
+msgid "warning, leftover frames overflowed, glitches might occur in output"
+msgstr ""
+
+#: libs/ardour/session_export.cc:418
+msgid "Export: could not write data to output file (%1)"
+msgstr ""
+
+#: libs/ardour/session_export.cc:502
+msgid "%1: cannot seek to %2 for export"
+msgstr ""
+
+#: libs/ardour/session_midi.cc:95
+msgid "Ardour is slaved to MTC - port cannot be reset"
+msgstr ""
+
+#: libs/ardour/session_midi.cc:110
+msgid "unknown port %1 requested for MTC"
+msgstr ""
+
+#: libs/ardour/session_midi.cc:435
+msgid "Error reading from MIDI port %1"
+msgstr ""
+
+#: libs/ardour/session_midi.cc:804
+msgid "Session: could not send full MIDI time code"
+msgstr ""
+
+#: libs/ardour/session_midi.cc:863
+msgid "Session: cannot send quarter-frame MTC message (%1)"
+msgstr ""
+
+#: libs/ardour/session_midi.cc:971
+msgid "MMC: cannot send command %1%2%3"
+msgstr ""
+
+#: libs/ardour/session_midi.cc:1078
+msgid "UI: cannot set O_NONBLOCK on signal read pipe (%1)"
+msgstr ""
+
+#: libs/ardour/session_midi.cc:1083
+msgid "UI: cannot set O_NONBLOCK on signal write pipe (%1)"
+msgstr ""
+
+#: libs/ardour/session_midi.cc:1088
+msgid "Session: could not create transport thread"
+msgstr ""
+
+#: libs/ardour/session_midi.cc:1117
+msgid "cannot send signal to midi thread! (%1)"
+msgstr ""
+
+#: libs/ardour/session_midi.cc:1212
+msgid "MIDI thread poll failed (%1)"
+msgstr ""
+
+#: libs/ardour/session_midi.cc:1224
+msgid "Error on transport thread request pipe"
+msgstr ""
+
+#: libs/ardour/session_midi.cc:1251
+msgid "Error reading from transport request pipe"
+msgstr ""
+
+#: libs/ardour/session_process.cc:104
+msgid "Session: error in no roll for %1"
+msgstr ""
+
+#: libs/ardour/session_state.cc:103
+msgid "Could not use path %1 (%s)"
+msgstr ""
+
+#: libs/ardour/session_state.cc:131
+msgid "end"
+msgstr ""
+
+#: libs/ardour/session_state.cc:132
+msgid "start"
+msgstr ""
+
+#: libs/ardour/session_state.cc:443
+msgid "Session: cannot create session dir \"%1\" (%2)"
+msgstr ""
+
+#: libs/ardour/session_state.cc:450
+msgid "Session: cannot create session peakfile dir \"%1\" (%2)"
+msgstr ""
+
+#: libs/ardour/session_state.cc:457
+msgid "Session: cannot create session sounds dir \"%1\" (%2)"
+msgstr ""
+
+#: libs/ardour/session_state.cc:464
+msgid "Session: cannot create session dead sounds dir \"%1\" (%2)"
+msgstr ""
+
+#: libs/ardour/session_state.cc:471
+msgid "Session: cannot create session automation dir \"%1\" (%2)"
+msgstr ""
+
+#: libs/ardour/session_state.cc:500
+msgid "Could not open %1 for writing mix template"
+msgstr ""
+
+#: libs/ardour/session_state.cc:506
+msgid "Could not open mix template %1 for reading"
+msgstr ""
+
+#: libs/ardour/session_state.cc:548
+msgid "Session: could not load diskstream via XML state"
+msgstr ""
+
+#: libs/ardour/session_state.cc:597
+msgid "could not backup old state file, current state not saved."
+msgstr ""
+
+#: libs/ardour/session_state.cc:612
+msgid "state could not be saved to %1"
+msgstr ""
+
+#: libs/ardour/session_state.cc:619
+msgid "could not remove corrupt state file %1"
+msgstr ""
+
+#: libs/ardour/session_state.cc:623
+msgid "could not restore state file from backup %1"
+msgstr ""
+
+#: libs/ardour/session_state.cc:693
+msgid "%1: session state information file \"%2\" doesn't exist!"
+msgstr ""
+
+#: libs/ardour/session_state.cc:704 libs/ardour/session_state.cc:2824
+msgid "Could not understand ardour file %1"
+msgstr ""
+
+#: libs/ardour/session_state.cc:988
+msgid "programming error: Session: incorrect XML node sent to set_state()"
+msgstr ""
+
+#: libs/ardour/session_state.cc:1047
+msgid "Session: XML state has no options section"
+msgstr ""
+
+#: libs/ardour/session_state.cc:1051
+msgid "Session: XML state has no sources section"
+msgstr ""
+
+#: libs/ardour/session_state.cc:1058
+msgid "Session: XML state has no Regions section"
+msgstr ""
+
+#: libs/ardour/session_state.cc:1065
+msgid "Session: XML state has no playlists section"
+msgstr ""
+
+#: libs/ardour/session_state.cc:1084
+msgid "Session: XML state has no diskstreams section"
+msgstr ""
+
+#: libs/ardour/session_state.cc:1091
+msgid "Session: XML state has no connections section"
+msgstr ""
+
+#: libs/ardour/session_state.cc:1098
+msgid "Session: XML state has no locations section"
+msgstr ""
+
+#: libs/ardour/session_state.cc:1131
+msgid "Session: XML state has no edit groups section"
+msgstr ""
+
+#: libs/ardour/session_state.cc:1138
+msgid "Session: XML state has no mix groups section"
+msgstr ""
+
+#: libs/ardour/session_state.cc:1145
+msgid "Session: XML state has no Tempo Map section"
+msgstr ""
+
+#: libs/ardour/session_state.cc:1152
+msgid "Session: XML state has no routes section"
+msgstr ""
+
+#: libs/ardour/session_state.cc:1159
+msgid "Session: XML state has no click section"
+msgstr ""
+
+#: libs/ardour/session_state.cc:1202
+msgid "Session: cannot create Route from XML description."
+msgstr ""
+
+#: libs/ardour/session_state.cc:1243
+msgid "Session: cannot create Region from XML description."
+msgstr ""
+
+#: libs/ardour/session_state.cc:1271
+msgid "Session: XMLNode describing a AudioRegion is incomplete (no source)"
+msgstr ""
+
+#: libs/ardour/session_state.cc:1279 libs/ardour/session_state.cc:1300
+msgid ""
+"Session: XMLNode describing a AudioRegion references an unknown source id =%1"
+msgstr ""
+
+#: libs/ardour/session_state.cc:1285 libs/ardour/session_state.cc:1306
+msgid ""
+"Session: XMLNode describing a AudioRegion references a non-audio source id =%"
+"1"
+msgstr ""
+
+#: libs/ardour/session_state.cc:1377
+msgid "Session: cannot create Source from XML description."
+msgstr ""
+
+#: libs/ardour/session_state.cc:1396
+msgid ""
+"Found a sound file that cannot be used by Ardour. Talk to the progammers."
+msgstr ""
+
+#: libs/ardour/session_state.cc:1418
+msgid "Could not create mix templates directory \"%1\" (%2)"
+msgstr ""
+
+#: libs/ardour/session_state.cc:1432
+msgid "Template \"%1\" already exists - new version not created"
+msgstr ""
+
+#: libs/ardour/session_state.cc:1439
+msgid "mix template not saved"
+msgstr ""
+
+#: libs/ardour/session_state.cc:1498
+msgid "cannot create session directory \"%1\"; ignored"
+msgstr ""
+
+#: libs/ardour/session_state.cc:1509
+msgid "cannot create sounds directory \"%1\"; ignored"
+msgstr ""
+
+#: libs/ardour/session_state.cc:1518
+msgid "cannot create dead sounds directory \"%1\"; ignored"
+msgstr ""
+
+#: libs/ardour/session_state.cc:1527
+msgid "cannot create peak file directory \"%1\"; ignored"
+msgstr ""
+
+#: libs/ardour/session_state.cc:1659 libs/ardour/session_state.cc:1680
+msgid "Session: cannot create Playlist from XML description."
+msgstr ""
+
+#: libs/ardour/session_state.cc:1719
+msgid "Session: cannot create Named Selection from XML description."
+msgstr ""
+
+#: libs/ardour/session_state.cc:1872
+msgid "Unknown node \"%1\" found in Connections list from state file"
+msgstr ""
+
+#: libs/ardour/session_state.cc:2677
+msgid "cannot remove dead sound file %1 (%2)"
+msgstr ""
+
+#: libs/ardour/session_state.cc:2778
+msgid "could not backup old history file, current history not saved."
+msgstr ""
+
+#: libs/ardour/session_state.cc:2786
+msgid "history could not be saved to %1"
+msgstr ""
+
+#: libs/ardour/session_state.cc:2794
+msgid "could not remove corrupt history file %1"
+msgstr ""
+
+#: libs/ardour/session_state.cc:2798
+msgid "could not restore history file from backup %1"
+msgstr ""
+
+#: libs/ardour/session_state.cc:2816
+msgid "Loading history from '%1'."
+msgstr ""
+
+#: libs/ardour/session_state.cc:2819
+msgid "%1: session history file \"%2\" doesn't exist!"
+msgstr ""
+
+#: libs/ardour/session_state.cc:2861
+msgid "Couldn't figure out how to make a Command out of a %1 XMLNode."
+msgstr ""
+
+#: libs/ardour/session_time.cc:370
+msgid "Unknown JACK transport state %1 in sync callback"
+msgstr ""
+
+#: libs/ardour/session_timefx.cc:79
+msgid "tempoize: error creating name for new audio file based on %1"
+msgstr ""
+
+#: libs/ardour/session_timefx.cc:88
+msgid "tempoize: error creating new audio file %1 (%2)"
+msgstr ""
+
+#: libs/ardour/session_timefx.cc:113
+msgid "tempoize: error reading data from %1"
+msgstr ""
+
+#: libs/ardour/session_timefx.cc:126 libs/ardour/session_timefx.cc:138
+msgid "error writing tempo-adjusted data to %1"
+msgstr ""
+
+#: libs/ardour/session_timefx.cc:144
+msgid "timefx code failure. please notify ardour-developers."
+msgstr ""
+
+#: libs/ardour/session_transport.cc:117
+msgid "Cannot loop - no loop range defined"
+msgstr ""
+
+#: libs/ardour/session_transport.cc:474
+msgid ""
+"Seamless looping cannot be supported while Ardour is using JACK transport.\n"
+"Recommend changing the configured options"
+msgstr ""
+
+#: libs/ardour/session_transport.cc:743
+msgid ""
+"Global varispeed cannot be supported while Ardour is connected to JACK "
+"transport control"
+msgstr ""
+
+#: libs/ardour/session_transport.cc:933
+msgid "please stop the transport before adjusting slave settings"
+msgstr ""
+
+#: libs/ardour/session_transport.cc:966
+msgid "No MTC port defined: MTC slaving is impossible."
+msgstr ""
+
+#: libs/ardour/sndfile_helpers.cc:15
+msgid "WAV"
+msgstr ""
+
+#: libs/ardour/sndfile_helpers.cc:16
+msgid "AIFF"
+msgstr ""
+
+#: libs/ardour/sndfile_helpers.cc:17
+msgid "raw (no header)"
+msgstr ""
+
+#: libs/ardour/sndfile_helpers.cc:18
+msgid "PAF (Ensoniq Paris)"
+msgstr ""
+
+#: libs/ardour/sndfile_helpers.cc:19
+msgid "AU (Sun/NeXT)"
+msgstr ""
+
+#: libs/ardour/sndfile_helpers.cc:20
+msgid "IRCAM"
+msgstr ""
+
+#: libs/ardour/sndfile_helpers.cc:21
+msgid "W64 (64 bit WAV)"
+msgstr ""
+
+#: libs/ardour/sndfile_helpers.cc:26
+msgid ".wav"
+msgstr ""
+
+#: libs/ardour/sndfile_helpers.cc:27
+msgid ".aiff"
+msgstr ""
+
+#: libs/ardour/sndfile_helpers.cc:28
+msgid ".raw"
+msgstr ""
+
+#: libs/ardour/sndfile_helpers.cc:29
+msgid ".paf"
+msgstr ""
+
+#: libs/ardour/sndfile_helpers.cc:30
+msgid ".au"
+msgstr ""
+
+#: libs/ardour/sndfile_helpers.cc:31
+msgid ".ircam"
+msgstr ""
+
+#: libs/ardour/sndfile_helpers.cc:32
+msgid ".w64"
+msgstr ""
+
+#: libs/ardour/sndfile_helpers.cc:47
+msgid "16 bit"
+msgstr ""
+
+#: libs/ardour/sndfile_helpers.cc:48
+msgid "24 bit"
+msgstr ""
+
+#: libs/ardour/sndfile_helpers.cc:49
+msgid "32 bit"
+msgstr ""
+
+#: libs/ardour/sndfile_helpers.cc:50
+msgid "8 bit"
+msgstr ""
+
+#: libs/ardour/sndfile_helpers.cc:51
+msgid "float"
+msgstr ""
+
+#: libs/ardour/sndfile_helpers.cc:64
+msgid "Little-endian (Intel)"
+msgstr ""
+
+#: libs/ardour/sndfile_helpers.cc:65
+msgid "Big-endian (Mac)"
+msgstr ""
+
+#: libs/ardour/sndfilesource.cc:143
+msgid "FileSource: cannot get host information for BWF header (%1)"
+msgstr ""
+
+#: libs/ardour/sndfilesource.cc:167
+msgid ""
+"cannot set broadcast info for audio file %1 (%2); dropping broadcast info "
+"for this file"
+msgstr ""
+
+#: libs/ardour/sndfilesource.cc:216
+msgid "SndFileSource: cannot open file \"%1\" for %2 (%3)"
+msgstr ""
+
+#: libs/ardour/sndfilesource.cc:222
+msgid ""
+"SndFileSource: file only contains %1 channels; %2 is invalid as a channel "
+"number"
+msgstr ""
+
+#: libs/ardour/sndfilesource.cc:327
+msgid "SndFileSource: could not seek to frame %1 within %2 (%3)"
+msgstr ""
+
+#: libs/ardour/sndfilesource.cc:378
+msgid "programming error: %1 %2"
+msgstr ""
+
+#: libs/ardour/sndfilesource.cc:486 libs/ardour/sndfilesource.cc:507
+msgid ""
+"cannot set broadcast info for audio file %1; Dropping broadcast info for "
+"this file"
+msgstr ""
+
+#: libs/ardour/sndfilesource.cc:521
+msgid "%1: cannot seek to %2"
+msgstr ""
+
+#: libs/ardour/state_manager.cc:47
+msgid "cleared history"
+msgstr ""
+
+#: libs/ardour/state_manager.cc:60
+msgid ""
+"programming error: illegal state ID (%1) passed to StateManager::set_state() "
+"(range = 0-%2)"
+msgstr ""
+
+#: libs/ardour/tempo.cc:67
+msgid "TempoSection XML node has no \"start\" property"
+msgstr ""
+
+#: libs/ardour/tempo.cc:75
+msgid "TempoSection XML node has an illegal \"start\" value"
+msgstr ""
+
+#: libs/ardour/tempo.cc:82
+msgid "TempoSection XML node has no \"beats-per-minute\" property"
+msgstr ""
+
+#: libs/ardour/tempo.cc:87
+msgid "TempoSection XML node has an illegal \"beats_per_minute\" value"
+msgstr ""
+
+#: libs/ardour/tempo.cc:92
+msgid "TempoSection XML node has no \"movable\" property"
+msgstr ""
+
+#: libs/ardour/tempo.cc:131
+msgid "MeterSection XML node has no \"start\" property"
+msgstr ""
+
+#: libs/ardour/tempo.cc:139
+msgid "MeterSection XML node has an illegal \"start\" value"
+msgstr ""
+
+#: libs/ardour/tempo.cc:146
+msgid "MeterSection XML node has no \"beats-per-bar\" property"
+msgstr ""
+
+#: libs/ardour/tempo.cc:151
+msgid "MeterSection XML node has an illegal \"beats-per-bar\" value"
+msgstr ""
+
+#: libs/ardour/tempo.cc:156
+msgid "MeterSection XML node has no \"note-type\" property"
+msgstr ""
+
+#: libs/ardour/tempo.cc:161
+msgid "MeterSection XML node has an illegal \"note-type\" value"
+msgstr ""
+
+#: libs/ardour/tempo.cc:166
+msgid "MeterSection XML node has no \"movable\" property"
+msgstr ""
+
+#: libs/ardour/tempo.cc:259
+msgid "move metric"
+msgstr ""
+
+#: libs/ardour/tempo.cc:330
+msgid "metric removed"
+msgstr ""
+
+#: libs/ardour/tempo.cc:373
+msgid "add tempo"
+msgstr ""
+
+#: libs/ardour/tempo.cc:402
+msgid "replace tempo"
+msgstr ""
+
+#: libs/ardour/tempo.cc:435
+msgid "add meter"
+msgstr ""
+
+#: libs/ardour/tempo.cc:463
+msgid "replaced meter"
+msgstr ""
+
+#: libs/ardour/tempo.cc:483 libs/ardour/tempo.cc:499
+msgid "programming error: no tempo section in tempo map!"
+msgstr ""
+
+#: libs/ardour/tempo.cc:538
+msgid "programming error: unhandled MetricSection type"
+msgstr ""
+
+#: libs/ardour/tempo.cc:1265 libs/ardour/tempo.cc:1277
+msgid "Tempo map: could not set new state, restoring old one."
+msgstr ""
+
+#: libs/ardour/tempo.cc:1301
+msgid "load XML data"
+msgstr ""
+
+#: libs/ardour/utils.cc:237
+msgid "illegal or badly-formed string used for path (%1)"
+msgstr ""
+
+#: libs/ardour/utils.cc:242
+msgid "path (%1) is ambiguous"
+msgstr ""
+
+#: libs/ardour/utils.cc:304 libs/ardour/utils.cc:323
+msgid "Splice Edit"
+msgstr "Fogredigering"
+
+#: libs/ardour/utils.cc:306 libs/ardour/utils.cc:319
+msgid "Slide Edit"
+msgstr "Glidredigering"
+
+#: libs/ardour/utils.cc:309
+msgid "programming error: unknown edit mode string \"%1\""
+msgstr ""
+
+#: libs/ardour/utils.cc:330 libs/ardour/utils.cc:359
+msgid "Internal"
+msgstr "Intern"
+
+#: libs/ardour/utils.cc:334 libs/ardour/utils.cc:355
+msgid "MTC"
+msgstr ""
+
+#: libs/ardour/utils.cc:338 libs/ardour/utils.cc:352
+msgid "JACK"
+msgstr ""
+
+#: libs/ardour/utils.cc:342
+msgid "programming error: unknown slave source string \"%1\""
+msgstr ""
+
+#: libs/ardour/vst_plugin.cc:178
+msgid "cannot create VST chunk directory: %1"
+msgstr ""
+
+#: libs/ardour/vst_plugin.cc:186
+msgid "cannot check VST chunk directory: %1"
+msgstr ""
+
+#: libs/ardour/vst_plugin.cc:193
+msgid "%1 exists but is not a directory"
+msgstr ""
+
+#: libs/ardour/vst_plugin.cc:231
+msgid "Bad node sent to VSTPlugin::set_state"
+msgstr ""
+
+#: libs/ardour/vst_plugin.cc:334 libs/ardour/vst_plugin.cc:345
+msgid "no support for presets using chunks at this time"
+msgstr ""
+
+#: libs/ardour/vst_plugin.cc:495
+msgid "VST: cannot load module from \"%1\""
+msgstr ""
+
+#: libs/ardour/vst_plugin.cc:500
+msgid "You asked ardour to not use any VST plugins"
+msgstr ""
+
+#: libs/ardour/audio_unit.cc:48
+msgid "AudioUnit: Could not convert CAComponent to CAAudioUnit"
+msgstr ""
index 09d650b0698978d0b2d8154f037fa694ca5e5693..adad79e2a3522799bcc23af6300767e1c2427a2c 100644 (file)
@@ -108,101 +108,77 @@ Redirect::set_placement (const string& str, void *src)
        }
 }
 
+/* NODE STRUCTURE 
+   
+    <Automation [optionally with visible="...." ]>
+       <parameter-N>
+         <AutomationList id=N>
+          <events>
+          X1 Y1
+          X2 Y2
+          ....
+          </events>
+       </parameter-N>
+    <Automation>
+*/
+
 int
-Redirect::load_automation (string path)
-{
-       string fullpath;
+Redirect::set_automation_state (const XMLNode& node)
+{      
+       Glib::Mutex::Lock lm (_automation_lock);
 
-       if (path[0] == '/') { // legacy
-               fullpath = path;
-       } else {
-               fullpath = _session.automation_dir();
-               fullpath += path;
-       }
-       ifstream in (fullpath.c_str());
+       parameter_automation.clear ();
 
-       if (!in) {
-               warning << string_compose(_("%1: cannot open %2 to load automation data (%3)"), _name, fullpath, strerror (errno)) << endmsg;
-               return 1;
-       }
+       XMLNodeList nlist = node.children();
+       XMLNodeIterator niter;
 
-       Glib::Mutex::Lock lm (_automation_lock);
-       set<uint32_t> tosave;
-       parameter_automation.clear ();
+       for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
+               uint32_t param;
 
-       while (in) {
-               double when;
-               double value;
-               uint32_t port;
+               if (sscanf ((*niter)->name().c_str(), "parameter-%" PRIu32, &param) != 1) {
+                       error << string_compose (_("%2: badly formatted node name in XML automation state, ignored"), _name) << endmsg;
+                       continue;
+               }
 
-               in >> port;     if (!in) break;
-               in >> when;  if (!in) goto bad;
-               in >> value; if (!in) goto bad;
-               
-               AutomationList& al = automation_list (port);
-               al.add (when, value);
-               tosave.insert (port);
-       }
-       
-       for (set<uint32_t>::iterator i = tosave.begin(); i != tosave.end(); ++i) {
-               automation_list (*i).save_state (_("loaded from disk"));
+               AutomationList& al = automation_list (param);
+               if (al.set_state (*(*niter)->children().front())) {
+                       goto bad;
+               }
        }
-       
+
        return 0;
 
   bad:
-       error << string_compose(_("%1: cannot load automation data from %2"), _name, fullpath) << endmsg;
+       error << string_compose(_("%1: cannot load automation data from XML"), _name) << endmsg;
        parameter_automation.clear ();
        return -1;
 }
 
-int
-Redirect::save_automation (string path)
+XMLNode&
+Redirect::get_automation_state ()
 {
        Glib::Mutex::Lock lm (_automation_lock);
+       XMLNode* node = new XMLNode (X_("Automation"));
        string fullpath;
 
        if (parameter_automation.empty()) {
-               return 1;
-       }
-
-       fullpath = _session.automation_dir();
-       fullpath += path;
-
-       ofstream out (fullpath.c_str());
-
-       if (!out) {
-               error << string_compose(_("%1: cannot open %2 to store automation data (%3)"), _name, fullpath, strerror (errno)) << endmsg;
-               return -1;
+               return *node;
        }
 
-       AutomationList::const_iterator i;
        map<uint32_t,AutomationList*>::iterator li;
        
        for (li = parameter_automation.begin(); li != parameter_automation.end(); ++li) {
-               for (i = (*li).second->begin(); i != (*li).second->end(); ++i) {
-                       
-                       out << (*li).first << ' ' << (*i)->when << ' ' << (*i)->value << endl;
-                       
-                       if (!out) {
-                               break;
-                       }
-               }
+       
+               XMLNode* child;
                
-               if (i != (*li).second->end()) {
-                       unlink (fullpath.c_str());
-                       error << string_compose(_("%1: could not save automation state to %2"), _name, fullpath) << endmsg;
-                       return -1;
-               }
-       }
-
-       if (li != parameter_automation.end()) {
-               unlink (fullpath.c_str());
-               error << string_compose(_("%1: could not save automation state to %2"), _name, fullpath) << endmsg;
-               return -1;
+               char buf[64];
+               stringstream str;
+               snprintf (buf, sizeof (buf), "parameter-%" PRIu32, li->first);
+               child = new XMLNode (buf);
+               child->add_child_nocopy (li->second->get_state ());
        }
 
-       return 0;
+       return *node;
 }
 
 XMLNode&
@@ -214,7 +190,6 @@ Redirect::get_state (void)
 XMLNode&
 Redirect::state (bool full_state)
 {
-       char buf[64];
        XMLNode* node = new XMLNode (state_node_name);
        stringstream sstr;
 
@@ -228,65 +203,24 @@ Redirect::state (bool full_state)
        
        if (full_state) {
 
-               string path;
-               string legal_name;
+               XMLNode& automation = get_automation_state(); 
                
-               path = _session.snap_name();
-               path += "-redirect-";
-               id().print (buf, sizeof (buf));
-               path += buf;
-               path += ".automation";
-               
-               /* XXX we didn't ask for a state save, we asked for the current state.
-                  FIX ME!
-               */
-               
-               switch (save_automation (path)) {
-               case -1:
-                       error << string_compose(_("Could not get state from Redirect (%1).  Problem with save_automation"), _name) << endmsg;
-                       break;
-                       
-               case 0:
-                       XMLNode *aevents = node->add_child("Automation");
-                       
-                       for (set<uint32_t>::iterator x = visible_parameter_automation.begin(); x != visible_parameter_automation.end(); ++x) {
-                               if (x != visible_parameter_automation.begin()) {
-                                       sstr << ' ';
-                               }
-                               sstr << *x;
+               for (set<uint32_t>::iterator x = visible_parameter_automation.begin(); x != visible_parameter_automation.end(); ++x) {
+                       if (x != visible_parameter_automation.begin()) {
+                               sstr << ' ';
                        }
-                       
-                       aevents->add_property ("path", path);
-                       aevents->add_property ("visible", sstr.str());
-                       break;
+                       sstr << *x;
                }
-       }
 
-       return *node;
-}
+               automation.add_property ("visible", sstr.str());
 
-void
-Redirect::what_has_automation (set<uint32_t>& s) const
-{
-       Glib::Mutex::Lock lm (_automation_lock);
-       map<uint32_t,AutomationList*>::const_iterator li;
-       
-       for (li = parameter_automation.begin(); li != parameter_automation.end(); ++li) {
-               s.insert  ((*li).first);
+               node->add_child_nocopy (automation);
        }
-}
 
-void
-Redirect::what_has_visible_automation (set<uint32_t>& s) const
-{
-       Glib::Mutex::Lock lm (_automation_lock);
-       set<uint32_t>::const_iterator li;
-       
-       for (li = visible_parameter_automation.begin(); li != visible_parameter_automation.end(); ++li) {
-               s.insert  (*li);
-       }
+       return *node;
 }
 
+
 int
 Redirect::set_state (const XMLNode& node)
 {
@@ -308,14 +242,15 @@ Redirect::set_state (const XMLNode& node)
                        IO::set_state (**niter);
                        have_io = true;
 
-               } else if ((*niter)->name() == "Automation") {
+               } else if ((*niter)->name() == X_("Automation")) {
+
 
                        XMLProperty *prop;
                        
                        if ((prop = (*niter)->property ("path")) != 0) {
-                               load_automation (prop->value());
+                               old_set_automation_state (*(*niter));
                        } else {
-                               warning << string_compose(_("%1: Automation node has no path property"), _name) << endmsg;
+                               set_automation_state (*(*niter));
                        }
 
                        if ((prop = (*niter)->property ("visible")) != 0) {
@@ -364,6 +299,102 @@ Redirect::set_state (const XMLNode& node)
        return 0;
 }
 
+int
+Redirect::old_set_automation_state (const XMLNode& node)
+{
+       const XMLProperty *prop;
+                       
+       if ((prop = node.property ("path")) != 0) {
+               load_automation (prop->value());
+       } else {
+               warning << string_compose(_("%1: Automation node has no path property"), _name) << endmsg;
+       }
+       
+       if ((prop = node.property ("visible")) != 0) {
+               uint32_t what;
+               stringstream sstr;
+               
+               visible_parameter_automation.clear ();
+               
+               sstr << prop->value();
+               while (1) {
+                       sstr >> what;
+                       if (sstr.fail()) {
+                               break;
+                       }
+                       mark_automation_visible (what, true);
+               }
+       }
+
+       return 0;
+}
+
+int
+Redirect::load_automation (string path)
+{
+       string fullpath;
+
+       if (path[0] == '/') { // legacy
+               fullpath = path;
+       } else {
+               fullpath = _session.automation_dir();
+               fullpath += path;
+       }
+       ifstream in (fullpath.c_str());
+
+       if (!in) {
+               warning << string_compose(_("%1: cannot open %2 to load automation data (%3)"), _name, fullpath, strerror (errno)) << endmsg;
+               return 1;
+       }
+
+       Glib::Mutex::Lock lm (_automation_lock);
+       set<uint32_t> tosave;
+       parameter_automation.clear ();
+
+       while (in) {
+               double when;
+               double value;
+               uint32_t port;
+
+               in >> port;     if (!in) break;
+               in >> when;  if (!in) goto bad;
+               in >> value; if (!in) goto bad;
+               
+               AutomationList& al = automation_list (port);
+               al.add (when, value);
+               tosave.insert (port);
+       }
+       
+       return 0;
+
+  bad:
+       error << string_compose(_("%1: cannot load automation data from %2"), _name, fullpath) << endmsg;
+       parameter_automation.clear ();
+       return -1;
+}
+
+
+void
+Redirect::what_has_automation (set<uint32_t>& s) const
+{
+       Glib::Mutex::Lock lm (_automation_lock);
+       map<uint32_t,AutomationList*>::const_iterator li;
+       
+       for (li = parameter_automation.begin(); li != parameter_automation.end(); ++li) {
+               s.insert  ((*li).first);
+       }
+}
+
+void
+Redirect::what_has_visible_automation (set<uint32_t>& s) const
+{
+       Glib::Mutex::Lock lm (_automation_lock);
+       set<uint32_t>::const_iterator li;
+       
+       for (li = visible_parameter_automation.begin(); li != visible_parameter_automation.end(); ++li) {
+               s.insert  (*li);
+       }
+}
 AutomationList&
 Redirect::automation_list (uint32_t parameter)
 {
@@ -436,35 +467,10 @@ Redirect::find_next_event (nframes_t now, nframes_t end, ControlEvent& next_even
        return next_event.when != max_frames;
 }
 
-void
-Redirect::store_state (RedirectState& state) const
-{
-       state.active = _active;
-}
-
-Change
-Redirect::restore_state (StateManager::State& state)
-{
-       RedirectState* rstate = dynamic_cast<RedirectState*> (&state);
-       set_active (rstate->active, this);
-       return Change (0);
-}
-
-StateManager::State*
-Redirect::state_factory (std::string why) const
-{
-       RedirectState* state = new RedirectState (why);
-
-       store_state (*state);
-
-       return state;
-}
-
 void
 Redirect::set_active (bool yn, void* src)
 {
        _active = yn; 
-       save_state (_("active_changed"));
        active_changed (this, src); 
        _session.set_dirty ();
 }
index 3853559e1086bcd6b83c6f8db31c6b5d6a7ee233..6d8c71b563f2dd0807fad15f640540dcc0e90753 100644 (file)
@@ -265,13 +265,43 @@ Region::Region (boost::shared_ptr<Source> src, const XMLNode& node)
 
 Region::~Region ()
 {
-       /* derived classes must call notify_callbacks() and then emit GoingAway */
+       if (_playlist) {
+               for (SourceList::const_iterator i = _sources.begin(); i != _sources.end(); ++i) {
+                       (*i)->remove_playlist (_playlist);
+               }
+       }
+       
+       notify_callbacks ();
+       GoingAway (); /* EMIT SIGNAL */
 }
 
 void
 Region::set_playlist (Playlist* pl)
 {
-       _playlist = pl;
+       if (pl == _playlist) {
+               return;
+       }
+
+       Playlist* old_playlist = _playlist;
+
+       if (pl) {
+               if (old_playlist) {
+                       for (SourceList::const_iterator i = _sources.begin(); i != _sources.end(); ++i) {
+                               (*i)->remove_playlist (old_playlist);   
+                               (*i)->add_playlist (_playlist);
+                       }
+               } else {
+                       for (SourceList::const_iterator i = _sources.begin(); i != _sources.end(); ++i) {
+                               (*i)->add_playlist (_playlist);
+                       }
+               }
+       } else {
+               if (old_playlist) {
+                       for (SourceList::const_iterator i = _sources.begin(); i != _sources.end(); ++i) {
+                               (*i)->remove_playlist (old_playlist);
+                       }
+               }
+       }
 }
 
 void
@@ -337,6 +367,24 @@ Region::first_edit ()
        }
 }
 
+bool
+Region::at_natural_position () const
+{
+       if (!_playlist) {
+               return false;
+       }
+       
+       boost::shared_ptr<Region> whole_file_region = get_parent();
+
+       if (whole_file_region) {
+               if (_position == whole_file_region->position() + _start) {
+                       return true;
+               }
+       }
+
+       return false;
+}
+
 void
 Region::move_to_natural_position (void *src)
 {
@@ -1180,14 +1228,17 @@ Region::verify_start_mutable (jack_nframes_t& new_start)
 }
 
 boost::shared_ptr<Region>
-Region::get_parent()
+Region::get_parent() const
 {
-       boost::shared_ptr<Region> r;
-
        if (_playlist) {
-               r = _playlist->session().find_whole_file_parent (*this);
+               boost::shared_ptr<Region> r;
+               boost::shared_ptr<Region const> grrr2 = boost::dynamic_pointer_cast<Region const> (shared_from_this());
+               
+               if (grrr2 && (r = _playlist->session().find_whole_file_parent (grrr2))) {
+                       return boost::static_pointer_cast<Region> (r);
+               }
        }
        
-       return r;
+       return boost::shared_ptr<Region>();
 }
 
index 308dbb57cbaee598945a576e70435bb921431d61..5314c99632e1ae30e5f06291fda83c6c902856d5 100644 (file)
@@ -63,13 +63,13 @@ Route::Route (Session& sess, string name, int input_min, int input_max, int outp
        init ();
 }
 
-Route::Route (Session& sess, const XMLNode& node)
-       : IO (sess, "route"),
+Route::Route (Session& sess, const XMLNode& node, DataType default_type)
+       : IO (sess, *node.child ("IO"), default_type),
          _solo_control (X_("solo"), *this, ToggleControllable::SoloControl),
          _mute_control (X_("mute"), *this, ToggleControllable::MuteControl)
 {
        init ();
-       set_state (node);
+       _set_state (node, false);
 }
 
 void
@@ -1313,7 +1313,6 @@ XMLNode&
 Route::state(bool full_state)
 {
        XMLNode *node = new XMLNode("Route");
-       XMLNode *aevents;
        RedirectList:: iterator i;
        char buf[32];
 
@@ -1374,26 +1373,6 @@ Route::state(bool full_state)
                cmt->add_content (_comment);
        }
 
-       if (full_state) {
-               string path;
-
-               path = _session.snap_name();
-               path += "-gain-";
-               path += legalize_for_path (_name);
-               path += ".automation";
-
-               /* XXX we didn't ask for a state save, we asked for the current state.
-                  FIX ME!
-               */
-
-               if (save_automation (path)) {
-                       error << _("Could not get state of route.  Problem with save_automation") << endmsg;
-               }
-
-               aevents = node->add_child ("Automation");
-               aevents->add_property ("path", path);
-       }       
-
        for (i = _redirects.begin(); i != _redirects.end(); ++i) {
                node->add_child_nocopy((*i)->state (full_state));
        }
@@ -1480,6 +1459,12 @@ Route::add_redirect_from_xml (const XMLNode& node)
 
 int
 Route::set_state (const XMLNode& node)
+{
+       return _set_state (node, true);
+}
+
+int
+Route::_set_state (const XMLNode& node, bool call_base)
 {
        XMLNodeList nlist;
        XMLNodeConstIterator niter;
@@ -1492,7 +1477,7 @@ Route::set_state (const XMLNode& node)
                return -1;
        }
 
-       if ((prop = node.property ("flags")) != 0) {
+       if ((prop = node.property (X_("flags"))) != 0) {
                int x;
                sscanf (prop->value().c_str(), "0x%x", &x);
                _flags = Flag (x);
@@ -1500,20 +1485,20 @@ Route::set_state (const XMLNode& node)
                _flags = Flag (0);
        }
        
-       if ((prop = node.property ("default-type")) != 0) {
+       if ((prop = node.property (X_("default-type"))) != 0) {
                _default_type = DataType(prop->value());
                assert(_default_type != DataType::NIL);
        }
 
-       if ((prop = node.property ("phase-invert")) != 0) {
+       if ((prop = node.property (X_("phase-invert"))) != 0) {
                set_phase_invert(prop->value()=="yes"?true:false, this);
        }
 
-       if ((prop = node.property ("active")) != 0) {
+       if ((prop = node.property (X_("active"))) != 0) {
                set_active (prop->value() == "yes");
        }
 
-       if ((prop = node.property ("muted")) != 0) {
+       if ((prop = node.property (X_("muted"))) != 0) {
                bool yn = prop->value()=="yes"?true:false; 
 
                /* force reset of mute status */
@@ -1523,7 +1508,7 @@ Route::set_state (const XMLNode& node)
                mute_gain = desired_mute_gain;
        }
 
-       if ((prop = node.property ("soloed")) != 0) {
+       if ((prop = node.property (X_("soloed"))) != 0) {
                bool yn = prop->value()=="yes"?true:false; 
 
                /* force reset of solo status */
@@ -1533,23 +1518,23 @@ Route::set_state (const XMLNode& node)
                solo_gain = desired_solo_gain;
        }
 
-       if ((prop = node.property ("mute-affects-pre-fader")) != 0) {
+       if ((prop = node.property (X_("mute-affects-pre-fader"))) != 0) {
                _mute_affects_pre_fader = (prop->value()=="yes")?true:false;
        }
 
-       if ((prop = node.property ("mute-affects-post-fader")) != 0) {
+       if ((prop = node.property (X_("mute-affects-post-fader"))) != 0) {
                _mute_affects_post_fader = (prop->value()=="yes")?true:false;
        }
 
-       if ((prop = node.property ("mute-affects-control-outs")) != 0) {
+       if ((prop = node.property (X_("mute-affects-control-outs"))) != 0) {
                _mute_affects_control_outs = (prop->value()=="yes")?true:false;
        }
 
-       if ((prop = node.property ("mute-affects-main-outs")) != 0) {
+       if ((prop = node.property (X_("mute-affects-main-outs"))) != 0) {
                _mute_affects_main_outs = (prop->value()=="yes")?true:false;
        }
 
-       if ((prop = node.property ("edit-group")) != 0) {
+       if ((prop = node.property (X_("edit-group"))) != 0) {
                RouteGroup* edit_group = _session.edit_group_by_name(prop->value());
                if(edit_group == 0) {
                        error << string_compose(_("Route %1: unknown edit group \"%2 in saved state (ignored)"), _name, prop->value()) << endmsg;
@@ -1558,7 +1543,7 @@ Route::set_state (const XMLNode& node)
                }
        }
 
-       if ((prop = node.property ("order-keys")) != 0) {
+       if ((prop = node.property (X_("order-keys"))) != 0) {
 
                long n;
 
@@ -1595,7 +1580,7 @@ Route::set_state (const XMLNode& node)
                delete deferred_state;
        }
 
-       deferred_state = new XMLNode("deferred state");
+       deferred_state = new XMLNode(X_("deferred state"));
 
        /* set parent class properties before anything else */
 
@@ -1603,7 +1588,7 @@ Route::set_state (const XMLNode& node)
 
                child = *niter;
 
-               if (child->name() == IO::state_node_name) {
+               if (child->name() == IO::state_node_name && call_base) {
 
                        IO::set_state (*child);
                        break;
@@ -1614,7 +1599,7 @@ Route::set_state (const XMLNode& node)
 
                child = *niter;
                        
-               if (child->name() == "Send") {
+               if (child->name() == X_("Send")) {
 
 
                        if (!IO::ports_legal) {
@@ -1625,7 +1610,7 @@ Route::set_state (const XMLNode& node)
                                add_redirect_from_xml (*child);
                        }
 
-               } else if (child->name() == "Insert") {
+               } else if (child->name() == X_("Insert")) {
                        
                        if (!IO::ports_legal) {
                                
@@ -1636,21 +1621,13 @@ Route::set_state (const XMLNode& node)
                                add_redirect_from_xml (*child);
                        }
 
-               } else if (child->name() == "Automation") {
-
-                       XMLPropertyList plist;
-                       XMLPropertyConstIterator piter;
-                       XMLProperty *prop;
+               } else if (child->name() == X_("Automation")) {
                        
-                       plist = child->properties();
-                       for (piter = plist.begin(); piter != plist.end(); ++piter) {
-                               prop = *piter;
-                               if (prop->name() == "path") {
-                                       load_automation (prop->value());
-                               }
+                       if ((prop = child->property (X_("path"))) != 0)  {
+                               load_automation (prop->value());
                        }
 
-               } else if (child->name() == "ControlOuts") {
+               } else if (child->name() == X_("ControlOuts")) {
                        
                        string coutname = _name;
                        coutname += _("[control]");
@@ -1658,25 +1635,25 @@ Route::set_state (const XMLNode& node)
                        _control_outs = new IO (_session, coutname);
                        _control_outs->set_state (**(child->children().begin()));
 
-               } else if (child->name() == "Comment") {
+               } else if (child->name() == X_("Comment")) {
 
                        /* XXX this is a terrible API design in libxml++ */
 
                        XMLNode *cmt = *(child->children().begin());
                        _comment = cmt->content();
 
-               } else if (child->name() == "extra") {
+               } else if (child->name() == X_("extra")) {
                        _extra_xml = new XMLNode (*child);
-               } else if (child->name() == "solo") {
+               } else if (child->name() == X_("solo")) {
                        _solo_control.set_state (*child);
                        _session.add_controllable (&_solo_control);
-               } else if (child->name() == "mute") {
+               } else if (child->name() == X_("mute")) {
                        _mute_control.set_state (*child);
                        _session.add_controllable (&_mute_control);
                }
        }
 
-       if ((prop = node.property ("mix-group")) != 0) {
+       if ((prop = node.property (X_("mix-group"))) != 0) {
                RouteGroup* mix_group = _session.mix_group_by_name(prop->value());
                if (mix_group == 0) {
                        error << string_compose(_("Route %1: unknown mix group \"%2 in saved state (ignored)"), _name, prop->value()) << endmsg;
@@ -1936,6 +1913,10 @@ Route::handle_transport_stopped (bool abort_ignored, bool did_locate, bool can_f
        {
                Glib::RWLock::ReaderLock lm (redirect_lock);
 
+               if (!did_locate) {
+                       automation_snapshot (now);
+               }
+
                for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
                        
                        if (Config->get_plugins_stop_with_transport() && can_flush_redirects) {
@@ -1952,19 +1933,6 @@ Route::handle_transport_stopped (bool abort_ignored, bool did_locate, bool can_f
        _roll_delay = _initial_delay;
 }
 
-UndoAction
-Route::get_memento() const
-{
-       void (Route::*pmf)(state_id_t) = &Route::set_state;
-       return sigc::bind (mem_fun (*(const_cast<Route *>(this)), pmf), _current_state_id);
-}
-
-void
-Route::set_state (state_id_t id)
-{
-       return;
-}
-
 void
 Route::input_change_handler (IOChange change, void *ignored)
 {
@@ -2048,6 +2016,15 @@ int
 Route::roll (nframes_t nframes, nframes_t start_frame, nframes_t end_frame, nframes_t offset, int declick,
             bool can_record, bool rec_monitors_input)
 {
+       {
+               Glib::RWLock::ReaderLock lm (redirect_lock, Glib::TRY_LOCK);
+               if (lm.locked()) {
+                       // automation snapshot can also be called from the non-rt context
+                       // and it uses the redirect list, so we take the lock out here
+                       automation_snapshot (_session.transport_frame());
+               }
+       }
+
        if ((n_outputs().get_total() == 0 && _redirects.empty()) || n_inputs().get_total() == 0 || !_active) {
                silence (nframes, offset);
                return 0;
@@ -2181,6 +2158,16 @@ Route::set_latency_delay (nframes_t longest_session_latency)
        }
 }
 
+void
+Route::automation_snapshot (nframes_t now)
+{
+       IO::automation_snapshot (now);
+
+       for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
+               (*i)->automation_snapshot (now);
+       }
+}
+
 Route::ToggleControllable::ToggleControllable (std::string name, Route& s, ToggleType tp)
        : Controllable (name), route (s), type(tp)
 {
index 2c2a1524166399dec9140af1e13211a1bc363d9c..73dbf11ad58bfa925caa804f72dab81a1907c46a 100644 (file)
@@ -37,7 +37,6 @@ Send::Send (Session& s, Placement p)
        : Redirect (s, s.next_send_name(), p)
 {
        _metering = false;
-       save_state (_("initial state"));
        RedirectCreated (this); /* EMIT SIGNAL */
 }
 
@@ -50,7 +49,6 @@ Send::Send (Session& s, const XMLNode& node)
                throw failed_constructor();
        }
 
-       save_state (_("initial state"));
        RedirectCreated (this); /* EMIT SIGNAL */
 }
 
@@ -58,7 +56,6 @@ Send::Send (const Send& other)
        : Redirect (other._session, other._session.next_send_name(), other.placement())
 {
        _metering = false;
-       save_state (_("initial state"));
        RedirectCreated (this); /* EMIT SIGNAL */
 }
 
@@ -77,7 +74,7 @@ XMLNode&
 Send::state(bool full)
 {
        XMLNode *node = new XMLNode("Send");
-       node->add_child_nocopy (Redirect::state(full));
+       node->add_child_nocopy (Redirect::state (full));
        return *node;
 }
 
@@ -86,11 +83,15 @@ Send::set_state(const XMLNode& node)
 {
        XMLNodeList nlist = node.children();
        XMLNodeIterator niter;
-       
+
+       /* Send has regular IO automation (gain, pan) */
+
        for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
                if ((*niter)->name() == Redirect::state_node_name) {
                        Redirect::set_state (**niter);
                        break;
+               } else if ((*niter)->name() == X_("Automation")) {
+                       IO::set_automation_state (*(*niter));
                }
        }
 
index 11cb6580086eb747c23b6522bd4e674f85c44c55..1b7c3be6ddc738880cd51c9dfa73ae914fb24319 100644 (file)
@@ -288,7 +288,7 @@ Session::Session (AudioEngine &eng,
        
        new_session = !g_file_test (_path.c_str(), GFileTest (G_FILE_TEST_EXISTS | G_FILE_TEST_IS_DIR));
        if (new_session) {
-               if (create (new_session, mix_template, _engine.frame_rate() * 60 * 5)) {
+               if (create (new_session, mix_template, compute_initial_length())) {
                        cerr << "create failed\n";
                        throw failed_constructor ();
                }
@@ -342,12 +342,21 @@ Session::Session (AudioEngine &eng,
 
        cerr << "Loading session " << fullpath << " using snapshot " << snapshot_name << " (2)" << endl;
 
-       n_physical_outputs = max (requested_physical_out, _engine.n_physical_outputs());
-       n_physical_inputs = max (requested_physical_in, _engine.n_physical_inputs());
+       n_physical_outputs = _engine.n_physical_outputs();
+       n_physical_inputs = _engine.n_physical_inputs();
+
+       if (n_physical_inputs) {
+               n_physical_inputs = max (requested_physical_in, n_physical_inputs);
+       }
+
+       if (n_physical_outputs) {
+               n_physical_outputs = max (requested_physical_out, n_physical_outputs);
+       }
 
        first_stage_init (fullpath, snapshot_name);
 
        new_session = !g_file_test (_path.c_str(), GFileTest (G_FILE_TEST_EXISTS | G_FILE_TEST_IS_DIR));
+
        if (new_session) {
                if (create (new_session, 0, initial_length)) {
                        throw failed_constructor ();
@@ -410,7 +419,7 @@ Session::~Session ()
 
        /* clear history so that no references to objects are held any more */
 
-       history.clear ();
+       _history.clear ();
 
        /* clear state tree so that no references to objects are held any more */
        
@@ -1331,8 +1340,10 @@ Session::set_frame_rate (nframes_t frames_per_second)
 
        sync_time_vars();
 
+       Route::set_automation_interval ((jack_nframes_t) ceil ((double) frames_per_second * 0.25));
+
        // XXX we need some equivalent to this, somehow
-       // DestructiveFileSource::setup_standard_crossfades (frames_per_second);
+       // SndFileSource::setup_standard_crossfades (frames_per_second);
 
        set_dirty();
 
@@ -1824,12 +1835,12 @@ Session::new_audio_route (int input_channels, int output_channels, uint32_t how_
                                      << endmsg;
                        }
                        
-                       for (uint32_t x = 0; x < bus->n_inputs().get(DataType::AUDIO); ++x) {
+                       for (uint32_t x = 0; n_physical_inputs && x < bus->n_inputs().get(DataType::AUDIO); ++x) {
                                
                                port = "";
-                               
+
                                if (Config->get_input_auto_connect() & AutoConnectPhysical) {
-                                       port = physinputs[((n+x)%n_physical_inputs)];
+                                               port = physinputs[((n+x)%n_physical_inputs)];
                                } 
                                
                                if (port.length() && bus->connect_input (bus->input (x), port, this)) {
@@ -1837,7 +1848,7 @@ Session::new_audio_route (int input_channels, int output_channels, uint32_t how_
                                }
                        }
                        
-                       for (uint32_t x = 0; x < bus->n_outputs().get(DataType::AUDIO); ++x) {
+                       for (uint32_t x = 0; n_physical_outputs && x < bus->n_outputs().get(DataType::AUDIO); ++x) {
                                
                                port = "";
                                
@@ -1950,8 +1961,9 @@ Session::remove_route (shared_ptr<Route> route)
        {       
                RCUWriter<RouteList> writer (routes);
                shared_ptr<RouteList> rs = writer.get_copy ();
-               rs->remove (route);
                
+               rs->remove (route);
+
                /* deleting the master out seems like a dumb
                   idea, but its more of a UI policy issue
                   than our concern.
@@ -2564,7 +2576,7 @@ Session::remove_region (boost::weak_ptr<Region> weak_region)
 }
 
 boost::shared_ptr<Region>
-Session::find_whole_file_parent (Region& child)
+Session::find_whole_file_parent (boost::shared_ptr<Region const> child)
 {
        RegionList::iterator i;
        boost::shared_ptr<Region> region;
@@ -2577,13 +2589,13 @@ Session::find_whole_file_parent (Region& child)
 
                if (region->whole_file()) {
 
-                       if (child.source_equivalent (region)) {
+                       if (child->source_equivalent (region)) {
                                return region;
                        }
                }
        } 
 
-       return boost::shared_ptr<AudioRegion> ();
+       return boost::shared_ptr<Region> ();
 }      
 
 void
@@ -2596,32 +2608,38 @@ Session::find_equivalent_playlist_regions (boost::shared_ptr<Region> region, vec
 int
 Session::destroy_region (boost::shared_ptr<Region> region)
 {
-       boost::shared_ptr<AudioRegion> aregion;
-
-       if ((aregion = boost::dynamic_pointer_cast<AudioRegion> (region)) == 0) {
-               return 0;
-       }
-       
-       if (aregion->playlist()) {
-               aregion->playlist()->destroy_region (region);
-       }
-
        vector<boost::shared_ptr<Source> > srcs;
-       
-       for (uint32_t n = 0; n < aregion->n_channels(); ++n) {
-               srcs.push_back (aregion->source (n));
+               
+       {
+               boost::shared_ptr<AudioRegion> aregion;
+               
+               if ((aregion = boost::dynamic_pointer_cast<AudioRegion> (region)) == 0) {
+                       return 0;
+               }
+               
+               if (aregion->playlist()) {
+                       aregion->playlist()->destroy_region (region);
+               }
+               
+               for (uint32_t n = 0; n < aregion->n_channels(); ++n) {
+                       srcs.push_back (aregion->source (n));
+               }
        }
 
+       region->drop_references ();
+
        for (vector<boost::shared_ptr<Source> >::iterator i = srcs.begin(); i != srcs.end(); ++i) {
-               
-               if ((*i).use_count() == 1) {
-                       boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*i);
 
+               if (!(*i)->used()) {
+                       boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*i);
+                       
                        if (afs) {
                                (afs)->mark_for_remove ();
                        }
                        
                        (*i)->drop_references ();
+                       
+                       cerr << "source was not used by any playlist\n";
                }
        }
 
@@ -3197,6 +3215,20 @@ Session::add_playlist (Playlist* playlist)
        PlaylistAdded (playlist); /* EMIT SIGNAL */
 }
 
+void
+Session::get_playlists (vector<Playlist*>& s)
+{
+       { 
+               Glib::Mutex::Lock lm (playlist_lock);
+               for (PlaylistList::iterator i = playlists.begin(); i != playlists.end(); ++i) {
+                       s.push_back (*i);
+               }
+               for (PlaylistList::iterator i = unused_playlists.begin(); i != unused_playlists.end(); ++i) {
+                       s.push_back (*i);
+               }
+       }
+}
+
 void
 Session::track_playlist (Playlist* pl, bool inuse)
 {
@@ -3970,13 +4002,14 @@ Session::nbusses () const
 }
 
 void
-Session::add_curve(Curve *curve)
+Session::add_automation_list(AutomationList *al)
 {
-    curves[curve->id()] = curve;
+       automation_lists[al->id()] = al;
 }
 
-void
-Session::add_automation_list(AutomationList *al)
+nframes_t
+Session::compute_initial_length ()
 {
-    automation_lists[al->id()] = al;
+       return _engine.frame_rate() * 60 * 5;
 }
+
index 5fd6d70983daa16ad3baca613fb6c81baec68e0c..f09c7232d74110c2de5816b91563d5d0761fd73b 100644 (file)
@@ -84,7 +84,7 @@ Session::click (nframes_t start, nframes_t nframes, nframes_t offset)
                        break;
                }
        }
-
+       
   run_clicks:
        memset (buf, 0, sizeof (Sample) * nframes);
 
index d71ba34fc77171502dbae245ca614c3ac927ae06..5816f1c6b7f670a2ece6dd892684496ca7850802 100644 (file)
@@ -3,9 +3,13 @@
 #include <pbd/memento_command.h>
 #include <ardour/diskstream.h>
 #include <ardour/playlist.h>
+#include <ardour/audioplaylist.h>
+#include <ardour/audio_track.h>
 #include <ardour/tempo.h>
 #include <ardour/audiosource.h>
 #include <ardour/audioregion.h>
+#include <ardour/midi_source.h>
+#include <ardour/midi_region.h>
 #include <pbd/error.h>
 using namespace PBD;
 #include "i18n.h"
@@ -13,7 +17,7 @@ using namespace PBD;
 
 namespace ARDOUR {
 
-void Session::register_with_memento_command_factory(PBD::ID id, StatefulDestructible *ptr)
+void Session::register_with_memento_command_factory(PBD::ID id, PBD::StatefulThingWithGoingAway *ptr)
 {
     registry[id] = ptr;
 }
@@ -49,41 +53,37 @@ Command *Session::memento_command_factory(XMLNode *n)
     {
        error << _("Tried to reconstitute a MementoCommand with no contents, failing. id=") << id.to_s() << endmsg;
        return 0;
-       }
-    
-       
-       /* create command */
-    string obj_T = n->children().front()->name();
-    if (obj_T == "AudioRegion" || obj_T == "MidiRegion" || obj_T == "Region") {
+    }
+
+    /* create command */
+    string obj_T = n->property ("type_name")->value();
+    if (obj_T == typeid (AudioRegion).name() || obj_T == typeid (MidiRegion).name() || obj_T == typeid (Region).name()) {
            if (regions.count(id))
                    return new MementoCommand<Region>(*regions[id], before, after);
-    } else if (obj_T == "AudioSource" || obj_T == "MidiSource") {
+    } else if (obj_T == typeid (AudioSource).name() || obj_T == typeid (MidiSource).name()) {
            if (sources.count(id))
                    return new MementoCommand<Source>(*sources[id], before, after);
-    } else if (obj_T == "Location") {
+    } else if (obj_T == typeid (Location).name()) {
            return new MementoCommand<Location>(*_locations.get_location_by_id(id), before, after);
-    } else if (obj_T == "Locations") {
+    } else if (obj_T == typeid (Locations).name()) {
            return new MementoCommand<Locations>(_locations, before, after);
-    } else if (obj_T == "TempoMap") {
+    } else if (obj_T == typeid (TempoMap).name()) {
            return new MementoCommand<TempoMap>(*_tempo_map, before, after);
-    } else if (obj_T == "Playlist" || obj_T == "AudioPlaylist") {
+    } else if (obj_T == typeid (Playlist).name() || obj_T == typeid (AudioPlaylist).name()) {
            if (Playlist *pl = playlist_by_name(child->property("name")->value()))
                    return new MementoCommand<Playlist>(*pl, before, after);
-    } else if (obj_T == "Route") { // includes AudioTrack
+    } else if (obj_T == typeid (Route).name() || obj_T == typeid (AudioTrack).name()) { 
            return new MementoCommand<Route>(*route_by_id(id), before, after);
-    } else if (obj_T == "Curve") {
-           if (curves.count(id))
-                   return new MementoCommand<Curve>(*curves[id], before, after);
-    } else if (obj_T == "AutomationList") {
+    } else if (obj_T == typeid (Curve).name() || obj_T == typeid (AutomationList).name()) {
            if (automation_lists.count(id))
                    return new MementoCommand<AutomationList>(*automation_lists[id], before, after);
     } else if (registry.count(id)) { // For Editor and AutomationLine which are off-limits here
-           return new MementoCommand<StatefulDestructible>(*registry[id], before, after);
+           return new MementoCommand<PBD::StatefulThingWithGoingAway>(*registry[id], before, after);
     }
 
     /* we failed */
-    error << _("could not reconstitute MementoCommand from XMLNode. id=") << id.to_s() << endmsg;
-    return 0;
+    error << string_compose (_("could not reconstitute MementoCommand from XMLNode. object type = %1 id = %2"), obj_T, id.to_s()) << endmsg;
+    return 0 ;
 }
 
 // solo
index ff79a47e6b813d915068f9ce735b4bdd71d44a4e..bcc9b730ba958c31d1d666c82ad9e5e7e24f21e9 100644 (file)
@@ -195,7 +195,7 @@ Session::first_stage_init (string fullpath, string snapshot_name)
        /* default short fade = 15ms */
 
        Crossfade::set_short_xfade_length ((nframes_t) floor (Config->get_short_xfade_seconds() * frame_rate()));
-       DestructiveFileSource::setup_standard_crossfades (frame_rate());
+       SndFileSource::setup_standard_crossfades (frame_rate());
 
        last_mmc_step.tv_sec = 0;
        last_mmc_step.tv_usec = 0;
@@ -250,10 +250,9 @@ Session::first_stage_init (string fullpath, string snapshot_name)
        Playlist::PlaylistCreated.connect (mem_fun (*this, &Session::add_playlist));
        Redirect::RedirectCreated.connect (mem_fun (*this, &Session::add_redirect));
        NamedSelection::NamedSelectionCreated.connect (mem_fun (*this, &Session::add_named_selection));
-       Curve::CurveCreated.connect (mem_fun (*this, &Session::add_curve));
        AutomationList::AutomationListCreated.connect (mem_fun (*this, &Session::add_automation_list));
 
-       Controllable::GoingAway.connect (mem_fun (*this, &Session::remove_controllable));
+       Controllable::Destroyed.connect (mem_fun (*this, &Session::remove_controllable));
 
        IO::MoreChannels.connect (mem_fun (*this, &Session::ensure_buffers));
 
@@ -533,7 +532,6 @@ Session::create (bool& new_session, string* mix_template, nframes_t initial_leng
        _state_of_the_state = Clean;
 
        if (save_state (_current_snapshot_name)) {
-               save_history (_current_snapshot_name);
                return -1;
        }
 
@@ -858,13 +856,15 @@ Session::state(bool full_state)
                        boost::shared_ptr<AudioFileSource> fs;
 
                        if ((fs = boost::dynamic_pointer_cast<AudioFileSource> (siter->second)) != 0) {
-                               boost::shared_ptr<DestructiveFileSource> dfs = boost::dynamic_pointer_cast<DestructiveFileSource> (fs);
 
                                /* Don't save sources that are empty, unless they're destructive (which are OK
                                   if they are empty, because we will re-use them every time.)
                                */
-                               if ( ! dfs && siter->second->length() == 0) {
-                                       continue;
+
+                               if (!fs->destructive()) {
+                                       if (fs->length() == 0) {
+                                               continue;
+                                       }
                                }
                        }
                        
@@ -898,7 +898,20 @@ Session::state(bool full_state)
                }
        }
 
-       node->add_child_nocopy (_locations.get_state());
+       if (full_state) {
+               node->add_child_nocopy (_locations.get_state());
+       } else {
+               // for a template, just create a new Locations, populate it
+               // with the default start and end, and get the state for that.
+               Locations loc;
+               Location* start = new Location(0, 0, _("start"), Location::Flags ((Location::IsMark|Location::IsStart)));
+               Location* end = new Location(0, 0, _("end"), Location::Flags ((Location::IsMark|Location::IsEnd)));
+               start->set_end(0);
+               loc.add (start);
+               end->set_end(compute_initial_length());
+               loc.add (end);
+               node->add_child_nocopy (loc.get_state());
+       }
        
        child = node->add_child ("Connections");
        {
@@ -1026,8 +1039,6 @@ Session::set_state (const XMLNode& node)
                return -1;
        }
 
-       StateManager::prohibit_save ();
-
        if ((prop = node.property ("name")) != 0) {
                _name = prop->value ();
        }
@@ -1058,11 +1069,11 @@ Session::set_state (const XMLNode& node)
        Path
        extra
        Options/Config
+       Locations
        Sources
        AudioRegions
        AudioDiskstreams
        Connections
-       Locations
        Routes
        EditGroups
        MixGroups
@@ -1085,6 +1096,39 @@ Session::set_state (const XMLNode& node)
                error << _("Session: XML state has no options section") << endmsg;
        }
 
+       if ((child = find_named_node (node, "Locations")) == 0) {
+               error << _("Session: XML state has no locations section") << endmsg;
+               goto out;
+       } else if (_locations.set_state (*child)) {
+               goto out;
+       }
+
+       Location* location;
+
+       if ((location = _locations.auto_loop_location()) != 0) {
+               set_auto_loop_location (location);
+       }
+
+       if ((location = _locations.auto_punch_location()) != 0) {
+               set_auto_punch_location (location);
+       }
+
+       if ((location = _locations.end_location()) == 0) {
+               _locations.add (end_location);
+       } else {
+               delete end_location;
+               end_location = location;
+       }
+
+       if ((location = _locations.start_location()) == 0) {
+               _locations.add (start_location);
+       } else {
+               delete start_location;
+               start_location = location;
+       }
+
+       AudioFileSource::set_header_position_offset (start_location->start());
+
        if ((child = find_named_node (node, "Sources")) == 0) {
                error << _("Session: XML state has no sources section") << endmsg;
                goto out;
@@ -1132,39 +1176,6 @@ Session::set_state (const XMLNode& node)
                goto out;
        }
 
-       if ((child = find_named_node (node, "Locations")) == 0) {
-               error << _("Session: XML state has no locations section") << endmsg;
-               goto out;
-       } else if (_locations.set_state (*child)) {
-               goto out;
-       }
-
-       Location* location;
-
-       if ((location = _locations.auto_loop_location()) != 0) {
-               set_auto_loop_location (location);
-       }
-
-       if ((location = _locations.auto_punch_location()) != 0) {
-               set_auto_punch_location (location);
-       }
-
-       if ((location = _locations.end_location()) == 0) {
-               _locations.add (end_location);
-       } else {
-               delete end_location;
-               end_location = location;
-       }
-
-       if ((location = _locations.start_location()) == 0) {
-               _locations.add (start_location);
-       } else {
-               delete start_location;
-               start_location = location;
-       }
-
-       _locations.save_state (_("initial state"));
-
        if ((child = find_named_node (node, "EditGroups")) == 0) {
                error << _("Session: XML state has no edit groups section") << endmsg;
                goto out;
@@ -1209,8 +1220,6 @@ Session::set_state (const XMLNode& node)
 
        _state_of_the_state = Clean;
 
-       StateManager::allow_save (_("initial state"), true);
-
        if (state_was_pending) {
                save_state (_current_snapshot_name);
                remove_pending_capture_state ();
@@ -1220,8 +1229,6 @@ Session::set_state (const XMLNode& node)
        return 0;
 
   out:
-       /* we failed, re-enable state saving but don't actually save internal state */
-       StateManager::allow_save (X_("ignored"), false);
        return ret;
 }
 
@@ -2210,7 +2217,7 @@ Session::commit_reversible_command (Command *cmd)
        gettimeofday (&now, 0);
        current_trans->set_timestamp (now);
 
-       history.add (current_trans);
+       _history.add (current_trans);
 }
 
 Session::GlobalRouteBooleanState 
@@ -2568,6 +2575,8 @@ Session::cleanup_sources (Session::cleanup_report& rep)
                   capture files.
                */
 
+               cerr << "checking out source " << i->second->name() << " use_count = " << i->second.use_count() << endl;
+
                if (i->second.use_count() == 1 && i->second->length() > 0) {
                        dead_sources.push_back (i->second);
 
@@ -2757,7 +2766,7 @@ Session::cleanup_sources (Session::cleanup_report& rep)
 
        /* dump the history list */
 
-       history.clear ();
+       _history.clear ();
 
        /* save state so we don't end up a session file
           referring to non-existent sources.
@@ -2908,7 +2917,7 @@ Session::save_history (string snapshot_name)
     string xml_path;
     string bak_path;
     
-    tree.set_root (&history.get_state());
+    tree.set_root (&_history.get_state());
 
     if (snapshot_name.empty()) {
        snapshot_name = _current_snapshot_name;
@@ -2935,14 +2944,13 @@ Session::save_history (string snapshot_name)
          * possible to fix.
          */
 
-        if (unlink (xml_path.c_str())) 
-        {
-            error << string_compose (_("could not remove corrupt history file %1"), xml_path) << endmsg;
+        if (unlink (xml_path.c_str())) {
+               error << string_compose (_("could not remove corrupt history file %1"), xml_path) << endmsg;
         } else {
-            if (rename (bak_path.c_str(), xml_path.c_str())) 
-            {
-                error << string_compose (_("could not restore history file from backup %1"), bak_path) << endmsg;
-            }
+               if (rename (bak_path.c_str(), xml_path.c_str())) 
+               {
+                       error << string_compose (_("could not restore history file from backup %1"), bak_path) << endmsg;
+               }
         }
 
         return -1;
@@ -2972,7 +2980,7 @@ Session::restore_history (string snapshot_name)
     }
 
     /* replace history */
-    history.clear();
+    _history.clear();
 
     for (XMLNodeConstIterator it  = tree.root()->children().begin(); it != tree.root()->children().end(); it++) {
            
@@ -3005,7 +3013,7 @@ Session::restore_history (string snapshot_name)
                    }
            }
 
-           history.add (ut);
+           _history.add (ut);
     }
 
     return 0;
@@ -3137,6 +3145,10 @@ Session::config_changed (const char* parameter_name)
                
                if (_mtc_port != 0) {
                        session_send_mtc = Config->get_send_mtc();
+                       if (session_send_mtc) {
+                               /* mark us ready to send */
+                               next_quarter_frame_to_send = 0;
+                       }
                }
 
        } else if (PARAM_IS ("send-mmc")) {
index 004261fe8e5c5c31d293fa3e6441a124517aac64..e9c4e3785fc53b228e20200b069c2bc194f17082 100644 (file)
@@ -125,7 +125,7 @@ Session::request_play_loop (bool yn)
        if (!yn && Config->get_seamless_loop() && transport_rolling()) {
                // request an immediate locate to refresh the diskstreams
                // after disabling looping
-               request_locate (_transport_frame-1, true);
+               request_locate (_transport_frame-1, false);
        }
 }
 
@@ -377,9 +377,6 @@ Session::non_realtime_stop (bool abort)
                                }
                        }
                }
-               
-               //FIXME
-               //deliver_mmc (MIDI::MachineControl::cmdLocate, _transport_frame);
 
 #ifdef LEAVE_TRANSPORT_UNADJUSTED
        }
index b308a74c36cf6ff93f63a540042a2a605822eda7..4cf644e0e022074aedf26d04a30ac1b65afef3d8 100644 (file)
@@ -106,11 +106,11 @@ sndfile_endian_format_from_string (string str)
 
 string
 sndfile_file_ending_from_string (string str)
-{
+{      
        static vector<string> file_endings;
 
        if (file_endings.empty()) {
-               file_endings = PBD::internationalize((const char **) sndfile_file_endings_strings);
+               file_endings = I18N((const char **) sndfile_file_endings_strings);
        }
 
        for (int n = 0; sndfile_header_formats_strings[n]; ++n) {
index fcc6a33d81623dcf5bce351c7f38ced42b3481a3..a30bfcf49b928383c23927f27443e0432bece818 100644 (file)
@@ -28,6 +28,8 @@
 #include <glibmm/miscutils.h>
 
 #include <ardour/sndfilesource.h>
+#include <ardour/sndfile_helpers.h>
+#include <ardour/utils.h>
 
 #include "i18n.h"
 
@@ -35,6 +37,14 @@ using namespace std;
 using namespace ARDOUR;
 using namespace PBD;
 
+gain_t* SndFileSource::out_coefficient = 0;
+gain_t* SndFileSource::in_coefficient = 0;
+nframes_t SndFileSource::xfade_frames = 64;
+const AudioFileSource::Flag SndFileSource::default_writable_flags = AudioFileSource::Flag (AudioFileSource::Writable|
+                                                                                          AudioFileSource::Removable|
+                                                                                          AudioFileSource::RemovableIfEmpty|
+                                                                                          AudioFileSource::CanRename);
+
 SndFileSource::SndFileSource (Session& s, const XMLNode& node)
        : AudioFileSource (s, node)
 {
@@ -164,22 +174,32 @@ SndFileSource::SndFileSource (Session& s, string idstr, SampleFormat sfmt, Heade
 }
 
 void 
-SndFileSource::init (const string& idstr)
+SndFileSource::init (string idstr)
 {
        string::size_type pos;
        string file;
 
+       // lets try to keep the object initalizations here at the top
+       xfade_buf = 0;
        interleave_buf = 0;
        interleave_bufsize = 0;
        sf = 0;
        _broadcast_info = 0;
 
+       string tmp_name;
+
        if ((pos = idstr.find_last_of (':')) == string::npos) {
                channel = 0;
-               _name = Glib::path_get_basename (idstr);
+               tmp_name = idstr;
        } else {
                channel = atoi (idstr.substr (pos+1).c_str());
-               _name = Glib::path_get_basename (idstr.substr (0, pos));
+               tmp_name = idstr.substr (0, pos);
+       }
+
+       if (is_embedded()) {
+               _name = tmp_name;
+       } else {
+               _name = Glib::path_get_basename (tmp_name);
        }
 
        /* although libsndfile says we don't need to set this,
@@ -187,6 +207,17 @@ SndFileSource::init (const string& idstr)
        */
 
        memset (&_info, 0, sizeof(_info));
+
+       _capture_start = false;
+       _capture_end = false;
+       file_pos = 0;
+
+       if (destructive()) {    
+               xfade_buf = new Sample[xfade_frames];
+               timeline_position = header_position_offset;
+       }
+
+       AudioFileSource::HeaderPositionOffsetChanged.connect (mem_fun (*this, &SndFileSource::handle_header_position_change));
 }
 
 int
@@ -212,27 +243,14 @@ SndFileSource::open ()
        _broadcast_info = new SF_BROADCAST_INFO;
        memset (_broadcast_info, 0, sizeof (*_broadcast_info));
        
-       /* lookup broadcast info */
-       
-       if (sf_command (sf, SFC_GET_BROADCAST_INFO, _broadcast_info, sizeof (*_broadcast_info)) != SF_TRUE) {
-
-               /* if the file has data but no broadcast info, then clearly, there is no broadcast info */
-
-               if (_length) {
-                       delete _broadcast_info;
-                       _broadcast_info = 0;
-                       _flags = Flag (_flags & ~Broadcast);
-               }
-
-               set_timeline_position (header_position_offset);
+       bool timecode_info_exists;
 
-       } else {
-       
-               /* XXX 64 bit alert: when JACK switches to a 64 bit frame count, this needs to use the high bits
-                  of the time reference.
-               */
+       set_timeline_position (get_timecode_info (sf, _broadcast_info, timecode_info_exists));
 
-               set_timeline_position ( _broadcast_info->time_reference_low );
+       if (!timecode_info_exists) {
+               delete _broadcast_info;
+               _broadcast_info = 0;
+               _flags = Flag (_flags & ~Broadcast);
        }
 
        if (writable()) {
@@ -266,6 +284,10 @@ SndFileSource::~SndFileSource ()
        if (_broadcast_info) {
                delete _broadcast_info;
        }
+
+       if (xfade_buf) {
+               delete [] xfade_buf;
+       }
 }
 
 float
@@ -351,6 +373,16 @@ SndFileSource::read_unlocked (Sample *dst, nframes_t start, nframes_t cnt) const
 
 nframes_t 
 SndFileSource::write_unlocked (Sample *data, nframes_t cnt)
+{
+       if (destructive()) {
+               return destructive_write_unlocked (data, cnt);
+       } else {
+               return nondestructive_write_unlocked (data, cnt);
+       }
+}
+
+nframes_t 
+SndFileSource::nondestructive_write_unlocked (Sample *data, nframes_t cnt)
 {
        if (!writable()) {
                return 0;
@@ -403,6 +435,117 @@ SndFileSource::write_unlocked (Sample *data, nframes_t cnt)
        return cnt;
 }
 
+nframes_t
+SndFileSource::destructive_write_unlocked (Sample* data, nframes_t cnt)
+{
+       nframes_t old_file_pos;
+
+       if (!writable()) {
+               return 0;
+       }
+
+       if (_capture_start && _capture_end) {
+
+               /* start and end of capture both occur within the data we are writing,
+                  so do both crossfades.
+               */
+
+               _capture_start = false;
+               _capture_end = false;
+               
+               /* move to the correct location place */
+               file_pos = capture_start_frame - timeline_position;
+               
+               // split cnt in half
+               nframes_t subcnt = cnt / 2;
+               nframes_t ofilepos = file_pos;
+               
+               // fade in
+               if (crossfade (data, subcnt, 1) != subcnt) {
+                       return 0;
+               }
+               
+               file_pos += subcnt;
+               Sample * tmpdata = data + subcnt;
+               
+               // fade out
+               subcnt = cnt - subcnt;
+               if (crossfade (tmpdata, subcnt, 0) != subcnt) {
+                       return 0;
+               }
+               
+               file_pos = ofilepos; // adjusted below
+
+       } else if (_capture_start) {
+
+               /* start of capture both occur within the data we are writing,
+                  so do the fade in
+               */
+
+               _capture_start = false;
+               _capture_end = false;
+               
+               /* move to the correct location place */
+               file_pos = capture_start_frame - timeline_position;
+
+               if (crossfade (data, cnt, 1) != cnt) {
+                       return 0;
+               }
+               
+       } else if (_capture_end) {
+
+               /* end of capture both occur within the data we are writing,
+                  so do the fade out
+               */
+
+               _capture_start = false;
+               _capture_end = false;
+               
+               if (crossfade (data, cnt, 0) != cnt) {
+                       return 0;
+               }
+
+       } else {
+
+               /* in the middle of recording */
+
+               if (write_float (data, file_pos, cnt) != cnt) {
+                       return 0;
+               }
+       }
+
+       old_file_pos = file_pos;
+       update_length (file_pos, cnt);
+       file_pos += cnt;
+
+       if (_build_peakfiles) {
+               PeakBuildRecord *pbr = 0;
+               
+               if (pending_peak_builds.size()) {
+                       pbr = pending_peak_builds.back();
+               }
+               
+               if (pbr && pbr->frame + pbr->cnt == old_file_pos) {
+                       
+                       /* the last PBR extended to the start of the current write,
+                          so just extend it again.
+                       */
+                       
+                       pbr->cnt += cnt;
+               } else {
+                       pending_peak_builds.push_back (new PeakBuildRecord (old_file_pos, cnt));
+               }
+               
+               _peaks_built = false;
+       }
+
+       if (_build_peakfiles) {
+               queue_for_peaks (shared_from_this ());
+       }
+       
+       return cnt;
+}
+
 int
 SndFileSource::update_header (nframes_t when, struct tm& now, time_t tnow)
 {      
@@ -499,8 +642,10 @@ SndFileSource::set_header_timeline_position ()
 nframes_t
 SndFileSource::write_float (Sample* data, nframes_t frame_pos, nframes_t cnt)
 {
-       if (sf_seek (sf, frame_pos, SEEK_SET|SFM_WRITE) != frame_pos) {
-               error << string_compose (_("%1: cannot seek to %2"), _path, frame_pos) << endmsg;
+       if (sf_seek (sf, frame_pos, SEEK_SET|SFM_WRITE) < 0) {
+               char errbuf[256];
+               sf_error_str (0, errbuf, sizeof (errbuf) - 1);
+               error << string_compose (_("%1: cannot seek to %2 (libsndfile error: %3"), _path, frame_pos, errbuf) << endmsg;
                return 0;
        }
        
@@ -516,3 +661,286 @@ SndFileSource::natural_position() const
 {
        return timeline_position;
 }
+
+bool
+SndFileSource::set_destructive (bool yn)
+{
+       if (yn) {
+               _flags = Flag (_flags | Destructive);
+               if (!xfade_buf) {
+                       xfade_buf = new Sample[xfade_frames];
+               }
+               clear_capture_marks ();
+               timeline_position = header_position_offset;
+       } else {
+               _flags = Flag (_flags & ~Destructive);
+               timeline_position = 0;
+               /* leave xfade buf alone in case we need it again later */
+       }
+
+       return true;
+}
+
+void
+SndFileSource::clear_capture_marks ()
+{
+       _capture_start = false;
+       _capture_end = false;
+}      
+
+void
+SndFileSource::mark_capture_start (nframes_t pos)
+{
+       if (destructive()) {
+               if (pos < timeline_position) {
+                       _capture_start = false;
+               } else {
+                       _capture_start = true;
+                       capture_start_frame = pos;
+               }
+       }
+}
+
+void
+SndFileSource::mark_capture_end()
+{
+       if (destructive()) {
+               _capture_end = true;
+       }
+}
+
+nframes_t
+SndFileSource::crossfade (Sample* data, nframes_t cnt, int fade_in)
+{
+       nframes_t xfade = min (xfade_frames, cnt);
+       nframes_t nofade = cnt - xfade;
+       Sample* fade_data = 0;
+       nframes_t fade_position = 0; // in frames
+       ssize_t retval;
+       nframes_t file_cnt;
+
+       if (fade_in) {
+               fade_position = file_pos;
+               fade_data = data;
+       } else {
+               fade_position = file_pos + nofade;
+               fade_data = data + nofade;
+       }
+
+       if (fade_position > _length) {
+               
+               /* read starts beyond end of data, just memset to zero */
+               
+               file_cnt = 0;
+
+       } else if (fade_position + xfade > _length) {
+               
+               /* read ends beyond end of data, read some, memset the rest */
+               
+               file_cnt = _length - fade_position;
+
+       } else {
+               
+               /* read is entirely within data */
+
+               file_cnt = xfade;
+       }
+
+       if (file_cnt) {
+               
+               if ((retval = read_unlocked (xfade_buf, fade_position, file_cnt)) != (ssize_t) file_cnt) {
+                       if (retval >= 0 && errno == EAGAIN) {
+                               /* XXX - can we really trust that errno is meaningful here?  yes POSIX, i'm talking to you.
+                                * short or no data there */
+                               memset (xfade_buf, 0, xfade * sizeof(Sample));
+                       } else {
+                               error << string_compose(_("SndFileSource: \"%1\" bad read retval: %2 of %5 (%3: %4)"), _path, retval, errno, strerror (errno), xfade) << endmsg;
+                               return 0;
+                       }
+               }
+       } 
+
+       if (file_cnt != xfade) {
+               nframes_t delta = xfade - file_cnt;
+               memset (xfade_buf+file_cnt, 0, sizeof (Sample) * delta);
+       }
+       
+       if (nofade && !fade_in) {
+               if (write_float (data, file_pos, nofade) != nofade) {
+                       error << string_compose(_("SndFileSource: \"%1\" bad write (%2)"), _path, strerror (errno)) << endmsg;
+                       return 0;
+               }
+       }
+
+       if (xfade == xfade_frames) {
+
+               nframes_t n;
+
+               /* use the standard xfade curve */
+               
+               if (fade_in) {
+
+                       /* fade new material in */
+                       
+                       for (n = 0; n < xfade; ++n) {
+                               xfade_buf[n] = (xfade_buf[n] * out_coefficient[n]) + (fade_data[n] * in_coefficient[n]);
+                       }
+
+               } else {
+
+
+                       /* fade new material out */
+                       
+                       for (n = 0; n < xfade; ++n) {
+                               xfade_buf[n] = (xfade_buf[n] * in_coefficient[n]) + (fade_data[n] * out_coefficient[n]);
+                       }
+               }
+
+       } else if (xfade < xfade_frames) {
+
+               gain_t in[xfade];
+               gain_t out[xfade];
+
+               /* short xfade, compute custom curve */
+
+               compute_equal_power_fades (xfade, in, out);
+
+               for (nframes_t n = 0; n < xfade; ++n) {
+                       xfade_buf[n] = (xfade_buf[n] * out[n]) + (fade_data[n] * in[n]);                
+               }
+
+       } else if (xfade) {
+
+               /* long xfade length, has to be computed across several calls */
+
+       }
+
+       if (xfade) {
+               if (write_float (xfade_buf, fade_position, xfade) != xfade) {
+                       error << string_compose(_("SndFileSource: \"%1\" bad write (%2)"), _path, strerror (errno)) << endmsg;
+                       return 0;
+               }
+       }
+       
+       if (fade_in && nofade) {
+               if (write_float (data + xfade, file_pos + xfade, nofade) != nofade) {
+                       error << string_compose(_("SndFileSource: \"%1\" bad write (%2)"), _path, strerror (errno)) << endmsg;
+                       return 0;
+               }
+       }
+
+       return cnt;
+}
+
+nframes_t
+SndFileSource::last_capture_start_frame () const
+{
+       if (destructive()) {
+               return capture_start_frame;
+       } else {
+               return 0;
+       }
+}
+
+void
+SndFileSource::handle_header_position_change ()
+{
+       if (destructive()) {
+               if ( _length != 0 ) {
+                       error << string_compose(_("Filesource: start time is already set for existing file (%1): Cannot change start time."), _path ) << endmsg;
+                       //in the future, pop up a dialog here that allows user to regenerate file with new start offset
+               } else if (writable()) {
+                       timeline_position = header_position_offset;
+                       set_header_timeline_position ();  //this will get flushed if/when the file is recorded to
+               }
+       }
+}
+
+void
+SndFileSource::setup_standard_crossfades (nframes_t rate)
+{
+       /* This static method is assumed to have been called by the Session
+          before any DFS's are created.
+       */
+
+       xfade_frames = (nframes_t) floor ((Config->get_destructive_xfade_msecs () / 1000.0) * rate);
+
+       if (out_coefficient) {
+               delete [] out_coefficient;
+       }
+
+       if (in_coefficient) {
+               delete [] in_coefficient;
+       }
+
+       out_coefficient = new gain_t[xfade_frames];
+       in_coefficient = new gain_t[xfade_frames];
+
+       compute_equal_power_fades (xfade_frames, in_coefficient, out_coefficient);
+}
+
+void
+SndFileSource::set_timeline_position (int64_t pos)
+{
+       // destructive track timeline postion does not change
+       // except at instantion or when header_position_offset 
+       // (session start) changes
+
+       if (!destructive()) {
+               AudioFileSource::set_timeline_position (pos);
+       } 
+}
+
+int
+SndFileSource::get_soundfile_info (string path, SoundFileInfo& info, string& error_msg)
+{
+       SNDFILE *sf;
+       SF_INFO sf_info;
+       SF_BROADCAST_INFO binfo;
+       bool timecode_exists;
+
+       sf_info.format = 0; // libsndfile says to clear this before sf_open().
+
+       if ((sf = sf_open ((char*) path.c_str(), SFM_READ, &sf_info)) == 0) { 
+               char errbuf[256];
+               error_msg = sf_error_str (0, errbuf, sizeof (errbuf) - 1);
+               return false;
+       }
+
+       info.samplerate  = sf_info.samplerate;
+       info.channels    = sf_info.channels;
+       info.length      = sf_info.frames;
+       info.format_name = string_compose("Format: %1, %2",
+                                          sndfile_major_format(sf_info.format),
+                                          sndfile_minor_format(sf_info.format));
+
+       memset (&binfo, 0, sizeof (binfo));
+       info.timecode  = get_timecode_info (sf, &binfo, timecode_exists);
+
+       if (!timecode_exists) {
+               info.timecode = 0;
+       }
+       
+       sf_close (sf);
+
+       return true;
+}
+
+int64_t
+SndFileSource::get_timecode_info (SNDFILE* sf, SF_BROADCAST_INFO* binfo, bool& exists)
+{
+       if (sf_command (sf, SFC_GET_BROADCAST_INFO, binfo, sizeof (*binfo)) != SF_TRUE) {
+               exists = false;
+               return (header_position_offset);
+       } 
+       
+       /* XXX 64 bit alert: when JACK switches to a 64 bit frame count, this needs to use the high bits
+          of the time reference.
+       */
+       
+       exists = true;
+       int64_t ret = (uint32_t) binfo->time_reference_high;
+       ret <<= 32;
+       ret |= (uint32_t) binfo->time_reference_low;
+       return ret;
+}
index 86ca0c55f2502af77be9f8aeeb1c9fe390401191..8f0afd3507d9a416b3dce2f97ea6d4a414222ea3 100644 (file)
@@ -34,6 +34,7 @@
 #include <pbd/pthread_utils.h>
 
 #include <ardour/source.h>
+#include <ardour/playlist.h>
 
 #include "i18n.h"
 
@@ -51,6 +52,7 @@ Source::Source (Session& s, string name, DataType type)
        _name = name;
        _timestamp = 0;
        _length = 0;
+       _in_use = 0;
 }
 
 Source::Source (Session& s, const XMLNode& node) 
@@ -59,6 +61,7 @@ Source::Source (Session& s, const XMLNode& node)
 {
        _timestamp = 0;
        _length = 0;
+       _in_use = 0;
 
        if (set_state (node) || _type == DataType::NIL) {
                throw failed_constructor();
@@ -127,3 +130,24 @@ Source::update_length (jack_nframes_t pos, jack_nframes_t cnt)
        }
 }
 
+void
+Source::add_playlist (Playlist* pl)
+{
+       _playlists.insert (pl);
+}
+
+void
+Source::remove_playlist (Playlist* pl)
+{
+       std::set<Playlist*>::iterator x;
+
+       if ((x = _playlists.find (pl)) != _playlists.end()) {
+               _playlists.erase (x);
+       }
+}
+
+uint32_t
+Source::used () const
+{
+       return _playlists.size();
+}
index e9564a6193cf71142cdd63c18de7f0f6b25c732b..001af609dc1c20997fe1985de0c2ab7fa1cebbb5 100644 (file)
@@ -110,7 +110,7 @@ SourceFactory::create (Session& s, const XMLNode& node)
                return ret;
 
        }
-       
+
        return boost::shared_ptr<Source>();
 }
 
@@ -163,7 +163,6 @@ SourceFactory::create (Session& s, const XMLNode& node)
 boost::shared_ptr<Source>
 SourceFactory::createReadable (DataType type, Session& s, string idstr, AudioFileSource::Flag flags, bool announce)
 {
-<<<<<<< .working
        if (type == DataType::AUDIO) {
                if (flags & Destructive) {
                        boost::shared_ptr<Source> ret (new DestructiveFileSource (s, idstr, flags));
@@ -197,7 +196,7 @@ SourceFactory::createReadable (DataType type, Session& s, string idstr, AudioFil
                return ret;
 
        }
-
+       
        return boost::shared_ptr<Source>();
 }
 
@@ -220,9 +219,6 @@ SourceFactory::createReadable (DataType type, Session& s, string idstr, AudioFil
        } else if (type == DataType::MIDI) {
 
                boost::shared_ptr<Source> ret (new SMFSource (s, idstr, SMFSource::Flag(0))); // FIXME: flags?
-               if (setup_peakfile (ret)) {
-                       return boost::shared_ptr<Source>();
-               }
                if (announce) {
                        SourceCreated (ret);
                }
@@ -239,7 +235,6 @@ boost::shared_ptr<Source>
 SourceFactory::createWritable (DataType type, Session& s, std::string path, bool destructive, nframes_t rate, bool announce)
 {
        /* this might throw failed_constructor(), which is OK */
-
        if (type == DataType::AUDIO) {
        
                if (destructive) {
index 997852eb5bfc26147ba0501f8df3bb3451a77d86..0242db3e778ea2b1150d8ca54891a9aa4fc0a70f 100644 (file)
@@ -602,3 +602,8 @@ x86_sse_compute_peak:
 
 .size  x86_sse_compute_peak, .-x86_sse_compute_peak
 #; end proc
+
+#ifdef __ELF__
+.section .note.GNU-stack,"",%progbits
+#endif
+
diff --git a/libs/ardour/state_manager.cc b/libs/ardour/state_manager.cc
deleted file mode 100644 (file)
index 153773e..0000000
+++ /dev/null
@@ -1,91 +0,0 @@
-#include <pbd/error.h>
-#include <ardour/state_manager.h>
-
-#include "i18n.h"
-
-using namespace ARDOUR;
-using namespace std;
-using namespace PBD;
-
-bool StateManager::_allow_save = true;
-sigc::signal<void,const char*> StateManager::SaveAllowed;
-
-StateManager::StateManager ()
-{
-       _current_state_id = 0;
-}
-
-StateManager::~StateManager()
-{
-}
-
-void
-StateManager::prohibit_save ()
-{
-       _allow_save = false;
-}
-
-void
-StateManager::allow_save (const char* why, bool do_save)
-{
-       _allow_save = true;
-       if (do_save) {
-               SaveAllowed (why);
-               SaveAllowed.slots().erase (SaveAllowed.slots().begin(), SaveAllowed.slots().end());
-       }
-}
-
-void
-StateManager::drop_all_states ()
-{
-       for (StateMap::iterator i = states.begin(); i != states.end(); ++i) {
-               delete *i;
-       }
-
-       states.clear ();
-
-       save_state (_("cleared history"));
-}
-
-void
-StateManager::use_state (state_id_t id)
-{
-       Change what_changed;
-       state_id_t n;
-       StateMap::iterator i;
-
-       for (n = 0, i = states.begin(); n < id && i != states.end(); ++n, ++i);
-
-       if (n != id || i == states.end()) {
-               fatal << string_compose (_("programming error: illegal state ID (%1) passed to "
-                                   "StateManager::set_state() (range = 0-%2)"), id, states.size()-1)
-                     << endmsg;
-               /*NOTREACHED*/
-               return;
-       }
-
-       what_changed = restore_state (**i);
-       _current_state_id = id;
-       send_state_changed (what_changed);
-}
-
-void
-StateManager::save_state (std::string why)
-{
-       if (!should_save_state())
-               return;
-
-       if (!_allow_save) {
-               SaveAllowed.connect (mem_fun (*this, &StateManager::save_state));
-               return;
-       }
-
-       states.push_back (state_factory (why));
-       _current_state_id = states.size() - 1;
-}
-
-void
-StateManager::send_state_changed (Change what_changed)
-{
-       StateChanged (what_changed);
-}
index 3cc5420c678585b275ed3e6390a6408742b2d8bf..0ff94324bb088f369c92835006d9335791919708 100644 (file)
@@ -206,7 +206,6 @@ TempoMap::TempoMap (nframes_t fr)
        _frame_rate = fr;
        last_bbt_valid = false;
        BBT_Time start;
-       in_set_state = false;
        
        start.bars = 1;
        start.beats = 1;
@@ -222,8 +221,6 @@ TempoMap::TempoMap (nframes_t fr)
        
        metrics->push_back (t);
        metrics->push_back (m);
-       
-       save_state (_("initial"));
 }
 
 TempoMap::~TempoMap ()
@@ -256,7 +253,6 @@ TempoMap::move_metric_section (MetricSection& section, const BBT_Time& when)
        section.set_start (corrected);
        metrics->sort (cmp);
        timestamp_metrics ();
-       save_state (_("move metric"));
 
        return 0;
 }
@@ -265,7 +261,7 @@ void
 TempoMap::move_tempo (TempoSection& tempo, const BBT_Time& when)
 {
        if (move_metric_section (tempo, when) == 0) {
-               send_state_changed (Change (0));
+               StateChanged (Change (0));
        }
 }
 
@@ -273,7 +269,7 @@ void
 TempoMap::move_meter (MeterSection& meter, const BBT_Time& when)
 {
        if (move_metric_section (meter, when) == 0) {
-               send_state_changed (Change (0));
+               StateChanged (Change (0));
        }
 }
                
@@ -301,7 +297,7 @@ TempoMap::remove_tempo (const TempoSection& tempo)
        }
 
        if (removed) {
-               send_state_changed (Change (0));
+               StateChanged (Change (0));
        }
 }
 
@@ -325,14 +321,10 @@ TempoMap::remove_meter (const MeterSection& tempo)
                                }
                        }
                }
-
-               if (removed) {
-                       save_state (_("metric removed"));
-               }
        }
 
        if (removed) {
-               send_state_changed (Change (0));
+               StateChanged (Change (0));
        }
 }
 
@@ -369,11 +361,9 @@ TempoMap::add_tempo (const Tempo& tempo, BBT_Time where)
                where.ticks = 0;
                
                do_insert (new TempoSection (where, tempo.beats_per_minute()));
-
-               save_state (_("add tempo"));
        }
 
-       send_state_changed (Change (0));
+       StateChanged (Change (0));
 }
 
 void
@@ -397,14 +387,10 @@ TempoMap::replace_tempo (TempoSection& existing, const Tempo& replacement)
                                break;
                        }
                }
-
-               if (replaced) {
-                       save_state (_("replace tempo"));
-               }
        }
        
        if (replaced) {
-               send_state_changed (Change (0));
+               StateChanged (Change (0));
        }
 }
 
@@ -431,11 +417,9 @@ TempoMap::add_meter (const Meter& meter, BBT_Time where)
                where.ticks = 0;
 
                do_insert (new MeterSection (where, meter.beats_per_bar(), meter.note_divisor()));
-
-               save_state (_("add meter"));
        }
 
-       send_state_changed (Change (0));
+       StateChanged (Change (0));
 }
 
 void
@@ -458,14 +442,10 @@ TempoMap::replace_meter (MeterSection& existing, const Meter& replacement)
                                break;
                        }
                }
-
-               if (replaced) {
-                       save_state (_("replaced meter"));
-               }
        }
        
        if (replaced) {
-               send_state_changed (Change (0));
+               StateChanged (Change (0));
        }
 }
 
@@ -1071,6 +1051,9 @@ TempoMap::get_points (nframes_t lower, nframes_t upper) const
        double beat_frame;
        double beat_frames;
        double frames_per_bar;
+       double delta_bars;
+       double delta_beats;
+       double dummy;
        nframes_t limit;
 
        meter = &first_meter ();
@@ -1100,6 +1083,10 @@ TempoMap::get_points (nframes_t lower, nframes_t upper) const
           Now start generating points.
        */
 
+       beats_per_bar = meter->beats_per_bar ();
+       frames_per_bar = meter->frames_per_bar (*tempo, _frame_rate);
+       beat_frames = tempo->frames_per_beat (_frame_rate);
+       
        if (meter->frame() > tempo->frame()) {
                bar = meter->start().bars;
                beat = meter->start().beats;
@@ -1110,12 +1097,21 @@ TempoMap::get_points (nframes_t lower, nframes_t upper) const
                current = tempo->frame();
        }
 
+       /* initialize current to point to the bar/beat just prior to the
+          lower frame bound passed in.  assumes that current is initialized
+          above to be on a beat.
+       */
+       
+       delta_bars = (lower-current) / frames_per_bar;
+       delta_beats = modf(delta_bars, &dummy) * beats_per_bar;
+       current += (floor(delta_bars) * frames_per_bar) +  (floor(delta_beats) * beat_frames);
+
+       // adjust bars and beats too
+       bar += (uint32_t) (floor(delta_bars));
+       beat += (uint32_t) (floor(delta_beats));
+
        points = new BBTPointList;
                
-       beats_per_bar = meter->beats_per_bar ();
-       frames_per_bar = meter->frames_per_bar (*tempo, _frame_rate);
-       beat_frames = tempo->frames_per_beat (_frame_rate);
-
        do {
 
                if (i == metrics->end()) {
@@ -1197,6 +1193,10 @@ TempoMap::get_points (nframes_t lower, nframes_t upper) const
                                beat = 1;
                        }
 
+                       beats_per_bar = meter->beats_per_bar ();
+                       frames_per_bar = meter->frames_per_bar (*tempo, _frame_rate);
+                       beat_frames = tempo->frames_per_beat (_frame_rate);
+                       
                        ++i;
                }
 
@@ -1246,8 +1246,6 @@ TempoMap::set_state (const XMLNode& node)
                XMLNodeConstIterator niter;
                Metrics old_metrics (*metrics);
                
-               in_set_state = true;
-               
                metrics->clear();
 
                nlist = node.children();
@@ -1287,20 +1285,9 @@ TempoMap::set_state (const XMLNode& node)
                        metrics->sort (cmp);
                        timestamp_metrics ();
                }
-
-               in_set_state = false;
        }
        
-       /* This state needs to be saved. This string will never be a part of the 
-          object's history though, because the allow_save flag is false during 
-          session load. This state will eventually be tagged "initial state", 
-          by a call to StateManager::allow_save from Session::set_state.
-
-          If this state is not saved, there is no way to reach it through undo actions.
-       */
-       save_state(_("load XML data"));
-       
-       send_state_changed (Change (0));
+       StateChanged (Change (0));
 
        return 0;
 }
@@ -1323,65 +1310,3 @@ TempoMap::dump (std::ostream& o) const
        }
 }
 
-UndoAction
-TempoMap::get_memento () const
-{
-       return sigc::bind (mem_fun (*(const_cast<TempoMap *> (this)), &StateManager::use_state), _current_state_id);
-}
-
-Change
-TempoMap::restore_state (StateManager::State& state)
-{
-       Glib::RWLock::ReaderLock lm (lock);
-
-       TempoMapState* tmstate = dynamic_cast<TempoMapState*> (&state);
-
-       /* We can't just set the metrics pointer to the address of the metrics list 
-          stored in the state, cause this would ruin this state for restoring in
-          the future. If they have the same address, they are the same list.
-          Thus we need to copy all the elements from the state metrics list to the 
-          current metrics list.
-       */
-       metrics->clear();
-       for (Metrics::iterator i = tmstate->metrics->begin(); i != tmstate->metrics->end(); ++i) {
-               TempoSection *ts;
-               MeterSection *ms;
-               
-               if ((ts = dynamic_cast<TempoSection*>(*i)) != 0) {
-                       metrics->push_back (new TempoSection (*ts));
-               } else if ((ms = dynamic_cast<MeterSection*>(*i)) != 0) {
-                       metrics->push_back (new MeterSection (*ms));
-               }
-       }
-       
-       last_bbt_valid = false;
-
-       return Change (0);
-}
-
-StateManager::State* 
-TempoMap::state_factory (std::string why) const
-{
-       TempoMapState* state = new TempoMapState (why);
-
-       for (Metrics::iterator i = metrics->begin(); i != metrics->end(); ++i) {
-               TempoSection *ts;
-               MeterSection *ms;
-               
-               if ((ts = dynamic_cast<TempoSection*>(*i)) != 0) {
-                       state->metrics->push_back (new TempoSection (*ts));
-               } else if ((ms = dynamic_cast<MeterSection*>(*i)) != 0) {
-                       state->metrics->push_back (new MeterSection (*ms));
-               }
-       }
-               
-       return state;
-}
-
-void
-TempoMap::save_state (std::string why)
-{
-       if (!in_set_state) {
-               StateManager::save_state (why);
-       }
-}
index 053a8662563131a9cc5b31413f7f56a255e0ec2e..a5484813f9f4049974a6272d3a0554433257b7ea 100644 (file)
@@ -50,8 +50,8 @@ Track::Track (Session& sess, string name, Route::Flag flag, TrackMode mode, Data
 }
 
 Track::Track (Session& sess, const XMLNode& node, DataType default_type)
-       : Route (sess, "to be renamed", 0, 0, -1, -1, Route::Flag(0), default_type)
-       , _rec_enable_control (*this)
+       : Route (sess, node),
+         _rec_enable_control (*this)
 {
        _freeze_record.state = NoFreeze;
        _declickable = true;
@@ -183,18 +183,6 @@ Track::set_record_enable (bool yn, void *src)
        _rec_enable_control.Changed ();
 }
 
-void
-Track::set_mode (TrackMode m)
-{
-       if (_diskstream) {
-               if (_mode != m) {
-                       _mode = m;
-                       _diskstream->set_destructive (m == Destructive);
-                       ModeChanged();
-               }
-       }
-}
-
 int
 Track::set_name (string str, void *src)
 {
index 9a841e81b412ac538ef5e5db30fa72c83dfe692e..9c94d32241889497f7155e3f5cd704f302846bbe 100644 (file)
@@ -38,6 +38,7 @@
 #endif
 
 #include <pbd/error.h>
+#include <pbd/stacktrace.h>
 #include <pbd/xml++.h>
 #include <ardour/utils.h>
 
@@ -221,7 +222,7 @@ region_name_from_path (string path)
        /* remove any "?R", "?L" or "?[a-z]" channel identifier */
        
        string::size_type len = path.length();
-       
+
        if (len > 3 && (path[len-2] == '%' || path[len-2] == '?') && 
            (path[len-1] == 'R' || path[len-1] == 'L' || (islower (path[len-1])))) {
                
@@ -299,7 +300,7 @@ compute_equal_power_fades (nframes_t nframes, float* in, float* out)
        const float pan_law_attenuation = -3.0f;
        const float scale = 2.0f - 4.0f * powf (10.0f,pan_law_attenuation/20.0f);
 
-       for (unsigned long n = 0; n < nframes; ++n) {
+       for (nframes_t n = 0; n < nframes; ++n) {
                float inVal = in[n];
                float outVal = 1 - inVal;
                out[n] = outVal * (scale * outVal + 1.0f - scale);
@@ -407,3 +408,82 @@ meter_hold_to_float (MeterHold hold)
                return 200.0f;
        }
 }
+
+AutoState 
+ARDOUR::string_to_auto_state (std::string str)
+{
+       if (str == X_("Off")) {
+               return Off;
+       } else if (str == X_("Play")) {
+               return Play;
+       } else if (str == X_("Write")) {
+               return Write;
+       } else if (str == X_("Touch")) {
+               return Touch;
+       }
+
+       fatal << string_compose (_("programming error: %1 %2"), "illegal AutoState string: ", str) << endmsg;
+       /*NOTREACHED*/
+       return Touch;
+}
+
+string 
+ARDOUR::auto_state_to_string (AutoState as)
+{
+       /* to be used only for XML serialization, no i18n done */
+
+       switch (as) {
+       case Off:
+               return X_("Off");
+               break;
+       case Play:
+               return X_("Play");
+               break;
+       case Write:
+               return X_("Write");
+               break;
+       case Touch:
+               return X_("Touch");
+       }
+
+       fatal << string_compose (_("programming error: %1 %2"), "illegal AutoState type: ", as) << endmsg;
+       /*NOTREACHED*/
+       return "";
+}
+
+AutoStyle 
+ARDOUR::string_to_auto_style (std::string str)
+{
+       if (str == X_("Absolute")) {
+               return Absolute;
+       } else if (str == X_("Trim")) {
+               return Trim;
+       }
+
+       fatal << string_compose (_("programming error: %1 %2"), "illegal AutoStyle string: ", str) << endmsg;
+       /*NOTREACHED*/
+       return Trim;
+}
+
+string 
+ARDOUR::auto_style_to_string (AutoStyle as)
+{
+       /* to be used only for XML serialization, no i18n done */
+
+       switch (as) {
+       case Absolute:
+               return X_("Absolute");
+               break;
+       case Trim:
+               return X_("Trim");
+               break;
+       }
+
+       fatal << string_compose (_("programming error: %1 %2"), "illegal AutoStyle type: ", as) << endmsg;
+       /*NOTREACHED*/
+       return "";
+}
+
+extern "C" {
+       void c_stacktrace() { stacktrace (cerr); }
+}
index 800c5a98561f84d141f4f6f492b8ecd8789457c2..5d7a303fc626ff78e6167c9e91d7be0ec65cb5c2 100644 (file)
@@ -110,16 +110,6 @@ VSTPlugin::set_block_size (nframes_t nframes)
        activate ();
 }
 
-void
-VSTPlugin::store_state (PluginState& state)
-{
-}
-
-void
-VSTPlugin::restore_state (PluginState& state)
-{
-}
-
 float
 VSTPlugin::default_value (uint32_t port)
 {
diff --git a/libs/clearlooks/SConscript b/libs/clearlooks/SConscript
new file mode 100644 (file)
index 0000000..0df20ef
--- /dev/null
@@ -0,0 +1,23 @@
+import os.path
+
+Import ('env install_prefix')
+
+clearlooks = env.Copy()
+
+clearlooks.Replace(CCFLAGS = ' `pkg-config --cflags gtk+-2.0` ',
+                   LINKFLAGS = ' `pkg-config --libs gtk+-2.0` ')
+
+libclearlooks = clearlooks.SharedLibrary('clearlooks', [
+    'clearlooks_draw.c',
+    'clearlooks_rc_style.c',
+    'clearlooks_style.c',
+    'clearlooks_theme_main.c',
+    'support.c'
+])
+
+usable_libclearlooks = clearlooks.Install ('engines', libclearlooks)
+Default (usable_libclearlooks)
+
+env.Alias('install',
+          env.Install(os.path.join(install_prefix,'lib/ardour2/engines'),
+                      libclearlooks))
diff --git a/libs/clearlooks/bits.c b/libs/clearlooks/bits.c
new file mode 100644 (file)
index 0000000..1e871bc
--- /dev/null
@@ -0,0 +1,121 @@
+static unsigned char dot_intensity[] = {
+0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,
+0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,
+0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,
+0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,
+0x6e,0x6e,0x6e,0x6e,0x98,0xb9,0xc6,0xb9,0x91,0x6e,0x6e,0x6e,0x6e,
+0x6e,0x6e,0x6e,0x6e,0xb9,0xbd,0xac,0x9e,0x65,0x6e,0x6e,0x6e,0x6e,
+0x6e,0x6e,0x6e,0x6e,0xc6,0xac,0x9e,0x96,0x5c,0x6e,0x6e,0x6e,0x6e,
+0x6e,0x6e,0x6e,0x6e,0xb9,0x9e,0x96,0x62,0x55,0x6e,0x6e,0x6e,0x6e,
+0x6e,0x6e,0x6e,0x6e,0x91,0x65,0x5c,0x55,0x68,0x6e,0x6e,0x6e,0x6e,
+0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,
+0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,
+0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,
+0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,
+};
+static unsigned char dot_alpha[] = {
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x66,0xc4,0xff,0xc4,0x66,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x66,0xdf,0xff,0xff,0xff,0xdf,0x66,0x00,0x00,0x00,
+0x00,0x00,0x00,0xc4,0xff,0xff,0xff,0xff,0xff,0xc4,0x00,0x00,0x00,
+0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,
+0x00,0x00,0x00,0xc4,0xff,0xff,0xff,0xff,0xff,0xc4,0x00,0x00,0x00,
+0x00,0x00,0x00,0x66,0xdf,0xff,0xff,0xff,0xdf,0x66,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x66,0xc4,0xff,0xc4,0x66,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+};
+
+static unsigned char circle_alpha[] = {
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x23,0x62,0x92,0xb3,0xb2,0x95,0x2b,0x00,0x00,0x00,
+0x00,0x00,0x3e,0xab,0xc9,0xeb,0xf9,0xf5,0xfd,0xff,0x57,0x00,0x00,
+0x00,0x1f,0xb5,0xd8,0xfc,0xff,0xff,0xff,0xff,0xff,0xff,0x2b,0x00,
+0x00,0x67,0xb9,0xf2,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x9c,0x00,
+0x00,0x9a,0xe2,0xfc,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xe5,0x00,
+0x00,0xba,0xeb,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,
+0x00,0xc0,0xfa,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xe5,0x00,
+0x00,0x9b,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x9c,0x00,
+0x00,0x2b,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x2b,0x00,
+0x00,0x00,0x57,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x57,0x00,0x00,
+0x00,0x00,0x00,0x2b,0x9c,0xe5,0xff,0xe5,0x9c,0x2b,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+};
+static unsigned char outline_alpha[] = {
+0x00,0x00,0x00,0x4a,0xac,0xe9,0xff,0xe9,0xac,0x4a,0x00,0x00,0x00,
+0x00,0x00,0x98,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x98,0x00,0x00,
+0x00,0x98,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x98,0x00,
+0x4a,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x4a,
+0xac,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xac,
+0xe9,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xe9,
+0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+0xe9,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xe9,
+0xac,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xac,
+0x4a,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x4a,
+0x00,0x98,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x98,0x00,
+0x00,0x00,0x98,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x98,0x00,0x00,
+0x00,0x00,0x00,0x4a,0xac,0xe9,0xff,0xe9,0xac,0x4a,0x00,0x00,0x00,
+};
+static unsigned char inconsistent_alpha[] = {
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,
+0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,
+0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xf8,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+};
+static unsigned char check_base_alpha[] = {
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0xea,0xea,0xea,0xea,0xea,0xea,0xea,0xea,0xea,0xea,0xea,0x00,
+0x00,0xea,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,
+0x00,0xea,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,
+0x00,0xea,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,
+0x00,0xea,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,
+0x00,0xea,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,
+0x00,0xea,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,
+0x00,0xea,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,
+0x00,0xea,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,
+0x00,0xea,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,
+0x00,0xea,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+};
+static unsigned char check_alpha[] = {
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  11, 137, 151,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,   9, 183, 172,   7,0x00,0x00,
+0x00,0x00,  12,  18,0x00,0x00,   3, 161, 233,  27,0x00,0x00,0x00,
+0x00,0x00, 199, 239, 101,0x00,  85, 253, 108,0x00,0x00,0x00,0x00,
+0x00,0x00,  83, 245, 250,  75, 206, 230,   8,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00, 104, 252, 243, 253, 124,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,   2, 162, 255, 241,  28,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,  18, 228, 163,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,  78,  62,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+};
+static unsigned char check_inconsistent_alpha[] = {
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,
+0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,
+0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+};
diff --git a/libs/clearlooks/clearlooks_draw.c b/libs/clearlooks/clearlooks_draw.c
new file mode 100644 (file)
index 0000000..144be35
--- /dev/null
@@ -0,0 +1,1293 @@
+#include "clearlooks_draw.h"
+#include "clearlooks_style.h"
+
+#include "support.h"
+
+/** WANTED:
+    FASTER GRADIENT FILL FUNCTION, POSSIBLY USING XRENDER. **/
+
+static void cl_draw_borders (GdkWindow *window, GtkWidget *widget, GtkStyle *style,
+                      int x, int y, int width, int height, CLRectangle *r);
+
+static void cl_draw_line (GdkWindow *window, GtkWidget *widget, GtkStyle *style,
+                   int x1, int y1, int x2, int y2, CLBorderType border,
+                   CLRectangle *r);
+                                  
+static void cl_draw_corner (GdkWindow *window, GtkWidget *widget, GtkStyle *style,
+                     int x, int y, int width, int height,
+                     CLRectangle *r, CLCornerSide corner);
+                                        
+static void cl_draw_fill (GdkWindow *window, GtkWidget *widget, GtkStyle *style,
+                   int x, int y, int width, int height, CLRectangle *r);
+
+void cl_draw_rectangle (GdkWindow *window, GtkWidget *widget, GtkStyle *style,
+                        int x, int y, int width, int height, CLRectangle *r)
+{
+       if (r->fillgc)
+       {
+               cl_draw_fill(window, widget, style, x, y, width, height, r);
+       }
+       
+       if (r->bordergc)
+       {
+               cl_draw_borders(window, widget, style, x, y, width, height, r);
+       }       
+}
+
+
+static void cl_get_coords ( CLBorderType border,
+                     int x, int y, int width, int height,
+                     CLRectangle *r, int *x1, int *y1, int *x2, int *y2)
+{
+       switch (border)
+       {
+               case CL_BORDER_TOP:
+                       *x1 = x + r->corners[CL_CORNER_TOPLEFT];
+                       *x2 = *x1 + width - r->corners[CL_CORNER_TOPLEFT] - r->corners[CL_CORNER_TOPRIGHT] - 1;
+                       *y1 = *y2 = y;
+                       break;
+               case CL_BORDER_BOTTOM:
+                       *x1 = x + r->corners[CL_CORNER_BOTTOMLEFT];
+                       *x2 = *x1 + width - r->corners[CL_CORNER_BOTTOMLEFT] - r->corners[CL_CORNER_BOTTOMRIGHT] - 1;
+                       *y1 = *y2 = y + height - 1;
+                       break;
+               case CL_BORDER_LEFT:
+                       *x1 = *x2 = x;
+                       *y1 = y + r->corners[CL_CORNER_TOPLEFT];
+                       *y2 = *y1 + height - r->corners[CL_CORNER_TOPLEFT] - r->corners[CL_CORNER_BOTTOMLEFT] - 1;
+                       break;
+               case CL_BORDER_RIGHT:
+                       *x1 = *x2 = x + width - 1;
+                       *y1 = y + r->corners[CL_CORNER_TOPRIGHT];
+                       *y2 = *y1 + height - r->corners[CL_CORNER_TOPRIGHT] - r->corners[CL_CORNER_BOTTOMRIGHT] - 1;
+                       break;
+       }
+}
+
+void cl_draw_borders (GdkWindow *window, GtkWidget *widget, GtkStyle *style,
+                      int x, int y, int width, int height, CLRectangle *r)
+{
+       int x1, y1, x2, y2, i;
+
+       if (r->bordergc == NULL)
+               return;
+
+       for ( i=0; i<4; i++) /* draw all four borders + corners */
+       {
+               cl_get_coords (i, x, y, width, height, r, &x1, &y1, &x2, &y2);
+               cl_draw_line (window, widget, style, x1, y1, x2, y2, i, r);
+               cl_draw_corner (window, widget, style, x, y, width, height, r, i );
+       }
+}
+
+
+static GdkColor cl_gc_get_foreground(GdkGC *gc)
+{
+       GdkGCValues values;
+       gdk_gc_get_values (gc, &values);
+       return values.foreground;
+}
+
+static void cl_draw_line (GdkWindow *window, GtkWidget *widget, GtkStyle *style,
+                   int x1, int y1, int x2, int y2, CLBorderType border,
+                   CLRectangle *r)
+{
+       if (r->gradient_type == CL_GRADIENT_NONE ||
+               r->border_gradient.from == NULL || r->border_gradient.to == NULL )
+       {
+               gdk_draw_line (window, r->bordergc, x1, y1, x2, y2);
+       }
+       else if (r->gradient_type == CL_GRADIENT_HORIZONTAL && (border == CL_BORDER_TOP || border == CL_BORDER_BOTTOM))
+       {
+               draw_vgradient (window, r->bordergc, style,
+                               x1, y1, x2-x1+1, 1,
+                               r->border_gradient.from, r->border_gradient.to);
+       }
+       else if (r->gradient_type == CL_GRADIENT_VERTICAL && (border == CL_BORDER_LEFT || border == CL_BORDER_RIGHT))
+       {
+               draw_hgradient (window, r->bordergc, style,
+                               x1, y1, 1, y2-y1+1,
+                               r->border_gradient.from, r->border_gradient.to);
+       }
+       else
+       {
+               GdkColor tmp_color = cl_gc_get_foreground (r->bordergc);
+
+               if (r->gradient_type == CL_GRADIENT_HORIZONTAL && border == CL_BORDER_LEFT ||
+                       r->gradient_type == CL_GRADIENT_VERTICAL && border == CL_BORDER_TOP)
+                       gdk_gc_set_foreground (r->bordergc, r->border_gradient.from);
+               else
+                       gdk_gc_set_foreground (r->bordergc, r->border_gradient.to);                             
+
+               gdk_draw_line (window, r->bordergc, x1, y1, x2, y2);
+               
+               gdk_gc_set_foreground (r->bordergc, &tmp_color);
+       }
+}
+
+static GdkColor *cl_get_gradient_corner_color (CLRectangle *r, CLCornerSide corner)
+{
+       GdkColor *color;
+
+       if (r->border_gradient.from == NULL || r->border_gradient.to == NULL)
+       {
+               color = NULL;
+       }
+       else if ((r->gradient_type == CL_GRADIENT_HORIZONTAL && (corner == CL_CORNER_TOPLEFT || corner == CL_CORNER_BOTTOMLEFT)) ||
+           (r->gradient_type == CL_GRADIENT_VERTICAL && (corner == CL_CORNER_TOPLEFT || corner == CL_CORNER_TOPRIGHT)))
+       {
+               color = r->border_gradient.from;
+       }
+       else /* no gradient or other corner */
+       {
+               color = r->border_gradient.to;
+       }
+       
+       return color;
+}
+
+static void cl_draw_corner (GdkWindow *window, GtkWidget *widget, GtkStyle *style,
+                     int x, int y, int width, int height,
+                     CLRectangle *r, CLCornerSide corner)
+{
+       GdkColor    *color;
+       GdkColor     aacolor; /* anti-aliasing color */
+       GdkGCValues  values;
+       GdkColor     tmp;
+       GdkColor    *bgcolor;
+
+       int x1;
+       int y1;
+
+       if (r->corners[corner] == CL_CORNER_NONE)
+               return;
+       
+       color = cl_get_gradient_corner_color (r, corner);
+       gdk_gc_get_values (r->bordergc, &values);
+
+       if (color == NULL)
+       {
+               tmp = values.foreground;
+               gdk_colormap_query_color (gtk_widget_get_colormap(widget), values.foreground.pixel, &tmp);
+               color = &tmp;
+       }
+
+       bgcolor = get_parent_bgcolor(widget);
+
+       if (bgcolor == NULL)
+       {
+               bgcolor = color;
+       }
+
+       blend (style->colormap, bgcolor, color, &aacolor, 70);
+
+       if (r->corners[corner] == CL_CORNER_ROUND)
+       {
+               x1 = (corner == CL_CORNER_TOPLEFT ||
+                     corner == CL_CORNER_BOTTOMLEFT) ? x+1 : x+width - 2;
+               
+               y1 = (corner == CL_CORNER_TOPLEFT ||
+                     corner == CL_CORNER_TOPRIGHT) ? y+1 : y+height - 2;
+               
+               gdk_gc_set_foreground (r->bordergc, color);
+               gdk_draw_point (window, r->bordergc, x1, y1);
+               
+               gdk_gc_set_foreground (r->bordergc, &aacolor);
+               
+               x1 = (corner == CL_CORNER_TOPLEFT ||
+                     corner == CL_CORNER_BOTTOMLEFT) ? x+1 : x+width-2;
+
+               y1 = (corner == CL_CORNER_TOPLEFT ||
+                     corner == CL_CORNER_TOPRIGHT) ? y : y+height-1;           
+               
+               gdk_draw_point (window, r->bordergc, x1, y1);
+
+               x1 = (corner == CL_CORNER_TOPLEFT ||
+                     corner == CL_CORNER_BOTTOMLEFT) ? x : x+width-1;
+
+               y1 = (corner == CL_CORNER_TOPLEFT ||
+                     corner == CL_CORNER_TOPRIGHT) ? y+1 : y+height-2;
+
+               gdk_draw_point (window, r->bordergc, x1, y1);
+                                                               
+       }
+       else if (r->corners[corner] == CL_CORNER_NARROW)
+       {
+               x1 = (corner == CL_CORNER_TOPLEFT ||
+                     corner == CL_CORNER_BOTTOMLEFT) ? x : x+width-1;
+
+               y1 = (corner == CL_CORNER_TOPLEFT ||
+                     corner == CL_CORNER_TOPRIGHT) ? y : y+height-1;
+                               
+               gdk_gc_set_foreground (r->bordergc, &aacolor);
+               gdk_draw_point (window, r->bordergc, x1, y1);
+       }
+
+       gdk_gc_set_foreground (r->bordergc, &values.foreground);
+}
+
+static void cl_draw_fill (GdkWindow *window, GtkWidget *widget, GtkStyle *style,
+                   int x, int y, int width, int height, CLRectangle *r)
+{
+       if (r->gradient_type == CL_GRADIENT_NONE ||
+               r->fill_gradient.from == NULL || r->fill_gradient.to == NULL)
+       {
+               gdk_draw_rectangle (window, r->fillgc, TRUE,
+                                   x+1, y+1, width-2, height-2);
+       }
+       else if (r->gradient_type == CL_GRADIENT_HORIZONTAL)
+       {
+               draw_vgradient (window, r->fillgc, gtk_widget_get_style(widget),
+                               x+1, y+1, width-2, height-2,
+                               r->fill_gradient.from, r->fill_gradient.to);
+       }
+       else if (r->gradient_type == CL_GRADIENT_VERTICAL)
+       {
+               draw_hgradient (window, r->fillgc, gtk_widget_get_style(widget),
+                               x+1, y+1, width-2, height-2,
+                               r->fill_gradient.from, r->fill_gradient.to);
+       }
+}
+
+void cl_rectangle_set_button(CLRectangle *r, GtkStyle *style,
+                            GtkStateType state_type,  gboolean has_default,
+                            gboolean has_focus,
+                            CLBorderType tl, CLBorderType tr,
+                            CLBorderType bl, CLBorderType br)
+{
+       ClearlooksStyle *clearlooks_style = CLEARLOOKS_STYLE (style);
+       int              my_state_type = (state_type == GTK_STATE_ACTIVE) ? 2 : 0;
+       GdkGC           *border_gc = clearlooks_style->border_gc[CL_BORDER_UPPER+my_state_type];
+       
+       
+       cl_rectangle_init (r, style->bg_gc[state_type],
+                          clearlooks_style->border_gc[CL_BORDER_UPPER+my_state_type],
+                          tl, tr, bl, br);
+
+       if (state_type != GTK_STATE_INSENSITIVE && !has_default)
+       {
+               cl_rectangle_set_gradient (&r->border_gradient,
+                                          &clearlooks_style->border[CL_BORDER_UPPER+my_state_type],
+                                          &clearlooks_style->border[CL_BORDER_LOWER+my_state_type]);
+       }
+       else if (has_default)
+               r->bordergc = style->black_gc;
+       else
+               r->bordergc = clearlooks_style->shade_gc[4];
+
+       r->gradient_type = CL_GRADIENT_VERTICAL;
+
+       r->topleft     = (state_type != GTK_STATE_ACTIVE) ? style->light_gc[state_type] : clearlooks_style->shade_gc[4];
+       r->bottomright = (state_type != GTK_STATE_ACTIVE) ? clearlooks_style->shade_gc[1] : NULL;
+       
+       shade (&style->bg[state_type], &r->tmp_color, 0.93);
+       
+
+       cl_rectangle_set_gradient (&r->fill_gradient,
+                                  &style->bg[state_type],
+                                  &r->tmp_color);
+}
+
+void cl_rectangle_set_entry (CLRectangle *r, GtkStyle *style,
+                            GtkStateType state_type,
+                            CLBorderType tl, CLBorderType tr,
+                            CLBorderType bl, CLBorderType br,
+                            gboolean has_focus)
+{
+       ClearlooksStyle *clearlooks_style = CLEARLOOKS_STYLE (style);
+       GdkGC *bordergc;
+       
+       if (has_focus)
+               bordergc = clearlooks_style->spot3_gc;
+       else if (state_type != GTK_STATE_INSENSITIVE)
+               bordergc = clearlooks_style->border_gc[CL_BORDER_LOWER];
+       else
+               bordergc = clearlooks_style->shade_gc[3];               
+       
+       cl_rectangle_init (r, style->base_gc[state_type], bordergc,
+                      tl, tr, bl, br);
+
+       if (state_type != GTK_STATE_INSENSITIVE )
+               r->topleft     = (has_focus) ? clearlooks_style->spot1_gc
+                                        : style->bg_gc[GTK_STATE_NORMAL];
+       
+       if (has_focus)
+               r->bottomright = clearlooks_style->spot1_gc;
+       else if (state_type == GTK_STATE_INSENSITIVE)
+               r->bottomright = style->base_gc[state_type];
+}
+
+void cl_draw_shadow(GdkWindow *window, GtkWidget *widget, GtkStyle *style,
+                    int x, int y, int width, int height, CLRectangle *r)
+{
+       ClearlooksStyle *clearlooks_style = CLEARLOOKS_STYLE (style);
+       int x1, y1, x2, y2;
+
+       if (r->bottomright != NULL)
+       {
+               x1 = x+1+(r->corners[CL_CORNER_BOTTOMLEFT]/2);
+               y1 = y2 = y+height-2;
+               x2 = x+width - 1 - (1+r->corners[CL_CORNER_BOTTOMRIGHT]/2);
+               
+               gdk_draw_line (window, r->bottomright, x1, y1, x2, y2);
+               
+               x1 = x2 = x+width-2;
+               y1 = y+1+(r->corners[CL_CORNER_TOPRIGHT]/2);
+               y2 = y+height - 1 - (1+r->corners[CL_CORNER_BOTTOMRIGHT]/2);
+
+               gdk_draw_line (window, r->bottomright, x1, y1, x2, y2);
+       }
+       
+       if (r->topleft != NULL)
+       {
+               x1 = x+1+(r->corners[CL_CORNER_TOPLEFT]/2);
+               y1 = y2 = y+1;
+               x2 = x+width-1-(1+r->corners[CL_CORNER_TOPRIGHT]/2);
+               
+               gdk_draw_line (window, r->topleft, x1, y1, x2, y2);
+               
+               x1 = x2 = x+1;
+               y1 = y+1+(r->corners[CL_CORNER_TOPLEFT]/2);
+               y2 = y+height-1-(1+r->corners[CL_CORNER_BOTTOMLEFT]/2);
+
+               gdk_draw_line (window, r->topleft, x1, y1, x2, y2);
+       }
+}
+
+void cl_rectangle_set_color (CLGradient *g, GdkColor *color)
+{
+       g->from = color;
+       g->to   = color;
+}
+
+void cl_rectangle_set_gradient (CLGradient *g, GdkColor *from, GdkColor *to)
+{
+       g->from = from;
+       g->to   = to;
+}
+
+void cl_rectangle_init (CLRectangle *r,
+                        GdkGC *fillgc, GdkGC *bordergc,
+                        int tl, int tr, int bl, int br)
+{
+       r->gradient_type = CL_GRADIENT_NONE;
+       
+       r->border_gradient.from = r->border_gradient.to = NULL;
+       r->fill_gradient.from   = r->fill_gradient.to   = NULL;
+       
+       r->fillgc      = fillgc;
+       r->bordergc    = bordergc;
+       
+       r->topleft     = NULL;
+       r->bottomright = NULL;
+       
+       r->corners[CL_CORNER_TOPLEFT] = tl;
+       r->corners[CL_CORNER_TOPRIGHT] = tr;
+       r->corners[CL_CORNER_BOTTOMLEFT] = bl;
+       r->corners[CL_CORNER_BOTTOMRIGHT] = br;
+}
+
+void cl_rectangle_set_corners (CLRectangle *r, int tl, int tr, int bl, int br)
+{
+       r->corners[CL_CORNER_TOPLEFT] = tl;
+       r->corners[CL_CORNER_TOPRIGHT] = tr;
+       r->corners[CL_CORNER_BOTTOMLEFT] = bl;
+       r->corners[CL_CORNER_BOTTOMRIGHT] = br; 
+}
+
+void cl_set_corner_sharpness (const gchar *detail, GtkWidget *widget, CLRectangle *r)
+{
+       if (widget->parent && GTK_IS_COMBO_BOX_ENTRY (widget->parent) || GTK_IS_COMBO (widget->parent))
+       {
+               gboolean rtl = get_direction (widget->parent) == GTK_TEXT_DIR_RTL;
+               int cl = rtl ? CL_CORNER_ROUND : CL_CORNER_NONE;
+               int cr = rtl ? CL_CORNER_NONE  : CL_CORNER_ROUND;
+               
+               cl_rectangle_set_corners (r, cl, cr, cl, cr);
+       }
+       else if (detail && !strcmp (detail, "spinbutton_up"))
+       {
+               gboolean rtl = get_direction (widget->parent) == GTK_TEXT_DIR_RTL;
+               int tl = rtl ? CL_CORNER_ROUND : CL_CORNER_NONE;
+               int tr = rtl ? CL_CORNER_NONE  : CL_CORNER_ROUND;
+
+               cl_rectangle_set_corners (r, tl, tr,
+                                         CL_CORNER_NONE, CL_CORNER_NONE);
+       }
+       else if (detail && !strcmp (detail, "spinbutton_down"))
+       {
+               gboolean rtl = get_direction (widget->parent) == GTK_TEXT_DIR_RTL;
+               int bl = rtl ? CL_CORNER_ROUND : CL_CORNER_NONE;
+               int br = rtl ? CL_CORNER_NONE  : CL_CORNER_ROUND;
+
+               cl_rectangle_set_corners (r, CL_CORNER_NONE, CL_CORNER_NONE,
+                                         bl, br);
+       }
+       else
+       {
+               cl_rectangle_set_corners (r, CL_CORNER_ROUND, CL_CORNER_ROUND,
+                                         CL_CORNER_ROUND, CL_CORNER_ROUND);
+       };
+}
+
+void cl_rectangle_set_clip_rectangle (CLRectangle *r, GdkRectangle *area)
+{
+       if (area == NULL)
+               return;
+       
+       if (r->fillgc)
+               gdk_gc_set_clip_rectangle (r->fillgc, area);
+       
+       if (r->bordergc)
+               gdk_gc_set_clip_rectangle (r->bordergc, area);          
+
+       if (r->topleft)
+               gdk_gc_set_clip_rectangle (r->topleft, area);           
+
+       if (r->bottomright)
+               gdk_gc_set_clip_rectangle (r->bottomright, area);               
+}
+
+void cl_rectangle_reset_clip_rectangle (CLRectangle *r)
+{
+       if (r->fillgc)
+               gdk_gc_set_clip_rectangle (r->fillgc, NULL);
+       
+       if (r->bordergc)
+               gdk_gc_set_clip_rectangle (r->bordergc, NULL);
+
+       if (r->topleft)
+               gdk_gc_set_clip_rectangle (r->topleft, NULL);
+
+       if (r->bottomright)
+               gdk_gc_set_clip_rectangle (r->bottomright, NULL);
+}
+
+void cl_rectangle_reset (CLRectangle *r, GtkStyle *style)
+{
+       cl_rectangle_init (r,
+                          NULL, NULL,
+                          CL_CORNER_ROUND, CL_CORNER_ROUND,
+                          CL_CORNER_ROUND, CL_CORNER_ROUND);
+}
+
+static void cl_progressbar_points_transform (GdkPoint *points, int npoints, 
+                                             int offset, gboolean is_horizontal)
+{
+       int i;
+       for ( i=0; i<npoints; i++) {
+               if ( is_horizontal )
+                       points[i].x += offset;
+               else
+                       points[i].y += offset;
+       }
+}
+
+GdkPixmap* cl_progressbar_tile_new (GdkDrawable *drawable, GtkWidget *widget,
+                              GtkStyle *style, gint height, gint offset)
+{
+       ClearlooksStyle *clearlooks_style = CLEARLOOKS_STYLE (style);
+       int width  = height;
+       int line   = 0;
+       int center = width/2;
+       int xdir   = 1;
+       int trans;
+
+       int stripe_width   = height/2;
+       int topright       = height + stripe_width;     
+       int topright_div_2 = topright/2;
+
+       double shift;   
+       GdkPoint points[4];
+
+       GtkProgressBarOrientation orientation = gtk_progress_bar_get_orientation (GTK_PROGRESS_BAR (widget));
+       gboolean is_horizontal = (orientation == GTK_PROGRESS_LEFT_TO_RIGHT || orientation == GTK_PROGRESS_RIGHT_TO_LEFT) ? 1 : 0;
+       
+       GdkPixmap *tmp = gdk_pixmap_new (widget->window, width, height, -1);
+
+       GdkColor tmp_color;
+       shade (&clearlooks_style->spot2, &tmp_color, 0.90);
+       
+       if (is_horizontal)
+               draw_hgradient (tmp, style->black_gc, style, 0, 0, width, height,
+                           &clearlooks_style->spot2, &tmp_color );
+       else
+               draw_vgradient (tmp, style->black_gc, style, 0, 0, width, height,
+                           &tmp_color, &clearlooks_style->spot2); /* TODO: swap for RTL */
+                       
+       if (orientation == GTK_PROGRESS_RIGHT_TO_LEFT || 
+           orientation == GTK_PROGRESS_BOTTOM_TO_TOP)
+       {
+               offset = -offset;
+               xdir = -1;
+       }
+       
+       if (get_direction (widget) == GTK_TEXT_DIR_RTL)
+               offset = -offset;
+       
+       if (is_horizontal)
+       {
+               points[0] = (GdkPoint){xdir*(topright - stripe_width - topright_div_2), 0};  /* topleft */
+               points[1] = (GdkPoint){xdir*(topright - topright_div_2), 0};                 /* topright */
+               points[2] = (GdkPoint){xdir*(stripe_width - topright_div_2), height};        /* bottomright */
+               points[3] = (GdkPoint){xdir*(-topright_div_2), height};                      /* bottomleft */
+       }
+       else
+       {
+               points[0] = (GdkPoint){height, xdir*(topright - stripe_width - topright_div_2)};  /* topleft */
+               points[1] = (GdkPoint){height, xdir*(topright - topright_div_2)};                 /* topright */
+               points[2] = (GdkPoint){0, xdir*(stripe_width - topright_div_2)};        /* bottomright */
+               points[3] = (GdkPoint){0, xdir*(-topright_div_2)};                      /* bottomleft */
+       }
+                                                
+       
+       shift = (stripe_width*2)/(double)10;
+       cl_progressbar_points_transform (points, 4, (offset*shift), is_horizontal);
+               
+       trans = (width/2)-1-(stripe_width*2);
+       cl_progressbar_points_transform (points, 4, trans, is_horizontal);
+       gdk_draw_polygon (tmp, clearlooks_style->spot2_gc, TRUE, points, 4);
+       cl_progressbar_points_transform (points, 4, -trans, is_horizontal);
+
+       trans = width/2-1;
+       cl_progressbar_points_transform (points, 4, trans, is_horizontal);
+       gdk_draw_polygon (tmp, clearlooks_style->spot2_gc, TRUE, points, 4);
+       cl_progressbar_points_transform (points, 4, -trans, is_horizontal);
+
+       trans = (width/2)-1+(stripe_width*2);
+       cl_progressbar_points_transform (points, 4, trans, is_horizontal);
+       gdk_draw_polygon (tmp, clearlooks_style->spot2_gc, TRUE, points, 4);
+       
+       return tmp;
+}
+
+/* could be improved, I think. */
+void cl_progressbar_fill (GdkDrawable *drawable, GtkWidget *widget,
+                          GtkStyle *style, GdkGC *gc,
+                          gint x, gint y,
+                          gint width, gint height,
+                          guint8 offset, GdkRectangle *area)
+{
+       GtkProgressBarOrientation orientation = gtk_progress_bar_get_orientation (GTK_PROGRESS_BAR (widget));
+       gint size = (orientation == GTK_PROGRESS_LEFT_TO_RIGHT || orientation == GTK_PROGRESS_RIGHT_TO_LEFT) ? height : width;
+       GdkPixmap *tile = cl_progressbar_tile_new (widget->window, widget, style, size, offset);
+
+       gint nx = x,
+            ny = y,
+            nwidth = height,
+            nheight = width;
+       
+       gdk_gc_set_clip_rectangle (gc, area);
+       
+       switch (orientation)
+       {
+               case GTK_PROGRESS_LEFT_TO_RIGHT:
+               {
+                       while (nx <= x + width )
+                       {
+                               if (nx + nwidth > x+width ) nwidth = (x+width) - nx;
+                               gdk_draw_drawable (drawable, gc, tile, 0, 0, nx, y, nwidth, height);
+                                if (height <= 1)
+                                    nx += 1;
+                                else
+                                   nx += (height-1 + !(height % 2));
+                       }
+                       break;
+               }
+               case GTK_PROGRESS_RIGHT_TO_LEFT:
+               {
+                       gint src_x = 0, dst_x;
+                       nx += width;
+                       while (nx >= x )
+                       {
+                               dst_x = nx - height;
+                               if (dst_x < x )
+                               {
+                                       src_x = x - dst_x;
+                                       dst_x = x;
+                               }
+                               gdk_draw_drawable (drawable, gc, tile, src_x, 0, dst_x, y, nwidth, height);
+                                if (height <= 1)
+                                    nx -= 1;
+                                else
+                                   nx -= (height-1 + !(height % 2));
+                       }
+                       break;
+               }
+               case GTK_PROGRESS_TOP_TO_BOTTOM:
+               {
+                       while (ny <= y + height )
+                       {
+                               if (ny + nheight > y+height ) nheight = (y+height) - ny;
+                               gdk_draw_drawable (drawable, gc, tile, 0, 0, x, ny, width, nheight);
+                                if (width <= 1)
+                                    ny += 1;
+                                else
+                                   ny += (width-1 + !(width % 2));
+                       }
+                       break;
+               }
+               case GTK_PROGRESS_BOTTOM_TO_TOP:
+               {
+                       gint src_y = 0, dst_y;
+                       ny += height;
+                       while (ny >= y )
+                       {
+                               dst_y = ny - width;
+                               if (dst_y < y )
+                               {
+                                       src_y = y - dst_y;
+                                       dst_y = y;
+                               }
+                               gdk_draw_drawable (drawable, gc, tile, 0, src_y, x, dst_y, width, width);
+                                if (width <= 1)
+                                    ny -= 1;
+                                else
+                                   ny -= (width-1 + !(width % 2));
+                       }
+                       break;
+               }
+       }
+       
+       gdk_gc_set_clip_rectangle (gc, NULL);
+       
+       g_object_unref (tile);
+}
+
+GdkColor cl_gc_set_fg_color_shade (GdkGC *gc, GdkColormap *colormap, 
+                                   GdkColor *from, gfloat s)
+{
+       GdkColor tmp_color;
+       GdkGCValues values;
+
+       shade (from, &tmp_color, s);
+       gdk_gc_get_values (gc, &values);
+       gdk_rgb_find_color (colormap, &tmp_color);
+       gdk_gc_set_foreground (gc, &tmp_color);
+       
+       return values.foreground;
+}
+
+/* #warning MOVE THIS TO SUPPORT.C/H SO THE DRAW_CORNER FUNCTION CAN USE IT. OR, MAKE DRAW_CORNER USE IT SOME OTHER WAY. */
+
+static void cl_get_window_style_state (GtkWidget *widget, GtkStyle **style, GtkStateType *state_type)
+{
+       GtkStyle *windowstyle = NULL;
+       GtkWidget *tmpwidget = widget;
+       GtkStateType windowstate;
+       
+       if (widget && GTK_IS_ENTRY (widget))
+               tmpwidget = tmpwidget->parent;
+       
+       while (tmpwidget && GTK_WIDGET_NO_WINDOW (tmpwidget) && !GTK_IS_NOTEBOOK(tmpwidget))
+       {
+               tmpwidget = tmpwidget->parent;
+       }
+
+       *style     = tmpwidget->style;
+       *state_type = GTK_WIDGET_STATE(tmpwidget);
+}
+
+static GdkGC *cl_get_window_bg_gc (GtkWidget *widget)
+{
+       GtkStyle *style;
+       GtkStateType state_type;
+       
+       cl_get_window_style_state (widget, &style, &state_type);
+       
+       return style->bg_gc[state_type];
+}
+
+/******************************************************************************
+ *   DRAW THE MIGHTY WIDGETS!                                                 *
+ ******************************************************************************/
+
+void cl_draw_inset (GtkStyle *style, GdkWindow *window, GtkWidget *widget,
+                    GdkRectangle *area,
+                    gint x, gint y, gint width, gint height,
+                    int tl, int tr, int bl, int br )
+{
+       ClearlooksStyle *clearlooks_style = CLEARLOOKS_STYLE(style);
+       ClearlooksStyle *clwindowstyle; /* style of the window this widget is on */
+       GtkStateType     windowstate;   
+       CLRectangle      r;
+
+       cl_rectangle_init (&r, NULL, style->black_gc,
+                          tl, tr, bl, br);
+       
+       r.gradient_type = CL_GRADIENT_VERTICAL;
+       
+       cl_get_window_style_state(widget, (GtkStyle**)&clwindowstyle, &windowstate);
+       
+       g_assert (clwindowstyle != NULL);
+       
+       if (GTK_WIDGET_HAS_DEFAULT (widget))
+       {
+               r.bordergc = style->mid_gc[GTK_STATE_NORMAL];
+       }
+       else
+       {
+               cl_rectangle_set_gradient (&r.border_gradient,
+                                          &clwindowstyle->inset_dark[windowstate],
+                                          &clwindowstyle->inset_light[windowstate]);
+       }
+       cl_rectangle_set_clip_rectangle (&r, area);
+       cl_draw_rectangle (window, widget, style, x, y, width, height, &r); 
+       cl_rectangle_reset_clip_rectangle (&r);
+}
+
+/* Draw a normal (toggle)button. Not spinbuttons.*/ 
+void cl_draw_button(GtkStyle *style, GdkWindow *window,
+                    GtkStateType state_type, GtkShadowType shadow_type,
+                    GdkRectangle *area,
+                    GtkWidget *widget, const gchar *detail,
+                    gint x, gint y, gint width, gint height)
+{
+       ClearlooksStyle *clearlooks_style = CLEARLOOKS_STYLE(style);
+       int my_state_type = (state_type == GTK_STATE_ACTIVE) ? 2 : 0;
+       GdkGC *bg_gc = NULL;
+       gboolean is_active = FALSE;
+       CLRectangle r;
+       
+       /* Get the background color of the window we're on */
+       bg_gc = cl_get_window_bg_gc(widget);
+       
+       cl_rectangle_set_button (&r, style, state_type,
+                                GTK_WIDGET_HAS_DEFAULT (widget),
+                                GTK_WIDGET_HAS_FOCUS (widget),
+                                CL_CORNER_ROUND, CL_CORNER_ROUND,
+                                CL_CORNER_ROUND, CL_CORNER_ROUND);
+               
+       if (state_type == GTK_STATE_ACTIVE)
+               is_active = TRUE;
+
+       if (GTK_IS_TOGGLE_BUTTON(widget) &&
+           gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(widget)) &&
+           state_type == GTK_STATE_PRELIGHT)
+       {
+               cl_rectangle_set_gradient (&r.fill_gradient, &clearlooks_style->shade[1], &clearlooks_style->shade[1]);
+               r.topleft     = clearlooks_style->shade_gc[3];
+               r.bottomright = clearlooks_style->shade_gc[1];
+               
+               is_active = TRUE;
+       }       
+
+       if (!is_active)
+               r.fillgc = NULL;
+               
+       if (!GTK_IS_NOTEBOOK (widget->parent))
+       {
+               gdk_draw_rectangle (window, bg_gc, FALSE, x, y, width-1, height-1);
+       
+               /* Draw "sunken" look when border thickness is more than 2 pixels. */
+               if (style->xthickness > 2 && style->ythickness > 2)
+               cl_draw_inset (style, window, widget, area, x, y, width, height,
+                              CL_CORNER_ROUND, CL_CORNER_ROUND,
+                              CL_CORNER_ROUND, CL_CORNER_ROUND);
+       }
+       
+       /* Draw "sunken" look when border thickness is more than 2 pixels.*/
+       if (style->xthickness > 2 && style->ythickness > 2)
+       {
+               x++;
+               y++;
+               height-=2;
+               width-=2;
+       }
+       
+       /* Don't draw the normal gradient for normal buttons. */
+
+       cl_rectangle_set_clip_rectangle (&r, area);
+       cl_draw_rectangle (window, widget, style, x, y, width, height, &r);
+       
+       
+       if (!is_active) 
+       {
+               int tmp_height = (float)height*0.25;
+       
+               gdk_gc_set_clip_rectangle (style->bg_gc[state_type], area);
+               
+               draw_hgradient (window, style->bg_gc[state_type], style,
+                               x+2,y+2,width-4,tmp_height,
+                               &clearlooks_style->button_g1[state_type],
+                                   &clearlooks_style->button_g2[state_type]);
+               
+               draw_hgradient (window, style->bg_gc[state_type], style,
+                               x+2, y+2+tmp_height, width-4, height-3-tmp_height*2,
+                               &clearlooks_style->button_g2[state_type],
+                                   &clearlooks_style->button_g3[state_type]);
+               
+               draw_hgradient (window, style->bg_gc[state_type], style,
+                               x+2,y+height-tmp_height-1,width-4,tmp_height,
+                               &clearlooks_style->button_g3[state_type],
+                                   &clearlooks_style->button_g4[state_type]);
+
+               gdk_gc_set_clip_rectangle (style->bg_gc[state_type], NULL);
+       }                               
+       
+       cl_draw_shadow    (window, widget, style, x, y, width, height, &r);
+       cl_rectangle_reset_clip_rectangle (&r);
+}
+
+/* Draw spinbuttons. */
+void cl_draw_spinbutton(GtkStyle *style, GdkWindow *window,
+                        GtkStateType state_type, GtkShadowType shadow_type,
+                        GdkRectangle *area,
+                        GtkWidget *widget, const gchar *detail,
+                        gint x, gint y, gint width, gint height)
+{
+       CLRectangle r;
+       GdkRectangle new_area;
+
+       int tl = CL_CORNER_NONE, tr = CL_CORNER_NONE,
+           bl = CL_CORNER_NONE, br = CL_CORNER_NONE;   
+       
+       if (area == NULL)
+       {
+               new_area.x = x;
+               new_area.y = y;
+               new_area.width = width;
+               new_area.height = height;
+               area = &new_area;               
+       }
+
+       if (!strcmp (detail, "spinbutton")) /* draws the 'back' of the spinbutton */
+       {
+               GdkGC *bg_gc = cl_get_window_bg_gc(widget);
+               
+               gdk_gc_set_clip_rectangle (bg_gc, area);
+               gdk_draw_rectangle (window, bg_gc, FALSE, x, y, width-1, height-1);
+               gdk_gc_set_clip_rectangle (bg_gc, NULL);
+
+               if (style->xthickness > 2 && style->ythickness > 2)
+                       cl_draw_inset (style, window, widget, area, x, y, width, height,
+                                      CL_CORNER_NONE, CL_CORNER_ROUND,
+                                      CL_CORNER_NONE, CL_CORNER_ROUND);
+               
+               return;
+       }
+
+       if (!strcmp (detail, "spinbutton_up"))
+       {
+               tr = CL_CORNER_ROUND;
+               
+               (style->xthickness > 2 && style->ythickness > 2) ? y++ : height++;
+       }
+       
+       if (!strcmp (detail, "spinbutton_down"))
+       {
+               br = CL_CORNER_ROUND;
+               
+               if (style->xthickness > 2 && style->ythickness > 2)
+                       height--;
+       }
+       
+       cl_rectangle_set_button (&r, style, state_type,
+                                GTK_WIDGET_HAS_DEFAULT  (widget),
+                                GTK_WIDGET_HAS_FOCUS (widget),
+                                tl, tr,
+                                bl, br);
+       width--;
+       
+       cl_rectangle_set_clip_rectangle (&r, area);
+       cl_draw_rectangle (window, widget, style, x, y, width, height, &r);
+       cl_draw_shadow    (window, widget, style, x, y, width, height, &r);
+       cl_rectangle_reset_clip_rectangle (&r);
+}
+
+void cl_draw_combobox_entry (GtkStyle *style, GdkWindow *window,
+                             GtkStateType state_type, GtkShadowType shadow_type,
+                             GdkRectangle *area,
+                             GtkWidget *widget, const gchar *detail,
+                             gint x, gint y, gint width, gint height)
+{
+       CLRectangle r;
+       
+       gboolean rtl = get_direction (widget->parent) == GTK_TEXT_DIR_RTL;
+       gboolean has_focus = GTK_WIDGET_HAS_FOCUS (widget);
+       
+       int cl = rtl ? CL_CORNER_NONE  : CL_CORNER_ROUND,
+               cr = rtl ? CL_CORNER_ROUND : CL_CORNER_NONE;
+       
+       GdkGC *bg_gc = cl_get_window_bg_gc(widget);
+       
+       if (rtl)
+       {
+               if (!has_focus)
+               {
+                       x -= 1;
+                       width +=1;
+               }
+       }
+       else
+       {
+               width += 2;
+               if (has_focus) width--; /* this gives us a 2px focus line at the right side. */
+       }
+       
+       cl_rectangle_set_entry (&r, style, state_type,
+                                                  cl, cr, cl, cr,
+                                                  has_focus);
+
+       gdk_gc_set_clip_rectangle (bg_gc, area);
+       gdk_draw_rectangle (window, bg_gc, FALSE, x, y, width-1, height-1);
+       gdk_gc_set_clip_rectangle (bg_gc, NULL);
+
+       /* Draw "sunken" look when border thickness is more than 2 pixels. */
+       if (style->xthickness > 2 && style->ythickness > 2)
+       {
+               cl_draw_inset (style, window, widget, area, x, y, width, height,
+                              cl, cr, cl, cr);
+
+               y++;
+               x++;
+               width-=2;
+               height-=2;
+       }
+       
+       cl_rectangle_set_clip_rectangle (&r, area);
+
+       cl_draw_rectangle (window, widget, style, x, y, width, height, &r);
+       cl_draw_shadow (window, widget, style, x, y, width, height, &r); 
+       
+       cl_rectangle_reset_clip_rectangle (&r);
+}
+
+void cl_draw_combobox_button (GtkStyle *style, GdkWindow *window,
+                    GtkStateType state_type, GtkShadowType shadow_type,
+                    GdkRectangle *area,
+                    GtkWidget *widget, const gchar *detail,
+                    gint x, gint y, gint width, gint height)
+{
+       ClearlooksStyle *clearlooks_style = CLEARLOOKS_STYLE(style);
+       gboolean is_active  = FALSE;
+       gboolean draw_inset = FALSE;
+       CLRectangle r;
+
+       cl_rectangle_set_button (&r, style, state_type,
+                                GTK_WIDGET_HAS_DEFAULT  (widget),
+                                GTK_WIDGET_HAS_FOCUS (widget),
+                                CL_CORNER_NONE, CL_CORNER_ROUND,
+                                CL_CORNER_NONE, CL_CORNER_ROUND);
+       
+       if (state_type == GTK_STATE_ACTIVE)
+               is_active = TRUE;
+       else
+               r.fillgc = NULL;
+       
+       /* Seriously, why can't non-gtk-apps at least try to be decent citizens?
+          Take this fscking OpenOffice.org 1.9 for example. The morons responsible
+          for this utter piece of crap give the clip size wrong values! :'(  */
+       
+       if (area)
+       {
+               area->x = x;
+               area->y = y;
+               area->width = width;
+               area->height = height;
+       }
+
+       x--;
+       width++;
+       
+       /* Draw "sunken" look when border thickness is more than 2 pixels. */
+       if (GTK_IS_COMBO(widget->parent))
+               draw_inset = (widget->parent->style->xthickness > 2 &&
+                         widget->parent->style->ythickness > 2);
+       else
+               draw_inset = (style->xthickness > 2 && style->ythickness > 2);
+               
+       if (draw_inset)
+       {
+               cl_draw_inset (style, window, widget, area, x, y, width, height,
+                              CL_CORNER_NONE, CL_CORNER_ROUND,
+                              CL_CORNER_NONE, CL_CORNER_ROUND);
+       
+               x++;
+               y++;
+               height-=2;
+               width-=2;
+       }
+       else
+       {
+               x++;
+               width--;
+       }
+       
+       if (area)
+               cl_rectangle_set_clip_rectangle (&r, area);
+
+       cl_draw_rectangle (window, widget, style, x, y, width, height, &r);
+       
+       if (!is_active)
+       {
+               int tmp_height = (float)height*0.25;
+       
+               gdk_gc_set_clip_rectangle (style->bg_gc[state_type], area);
+               
+               draw_hgradient (window, style->bg_gc[state_type], style,
+                               x+2,y+2,width-4,tmp_height,
+                               &clearlooks_style->button_g1[state_type],
+                                   &clearlooks_style->button_g2[state_type]);
+               
+               draw_hgradient (window, style->bg_gc[state_type], style,
+                               x+2, y+2+tmp_height, width-4, height-3-tmp_height*2,
+                               &clearlooks_style->button_g2[state_type],
+                                   &clearlooks_style->button_g3[state_type]);
+               
+               draw_hgradient (window, style->bg_gc[state_type], style,
+                               x+2,y+height-tmp_height-1,width-4,tmp_height,
+                               &clearlooks_style->button_g3[state_type],
+                                   &clearlooks_style->button_g4[state_type]);
+
+               gdk_gc_set_clip_rectangle (style->bg_gc[state_type], NULL);
+       }                                       
+       
+       cl_draw_shadow    (window, widget, style, x, y, width, height, &r);
+
+       if (area)
+               cl_rectangle_reset_clip_rectangle (&r);
+}
+
+/* Draw text Entry */
+void cl_draw_entry (GtkStyle *style, GdkWindow *window,
+                        GtkStateType state_type, GtkShadowType shadow_type,
+                        GdkRectangle *area,
+                        GtkWidget *widget, const gchar *detail,
+                        gint x, gint y, gint width, gint height)
+{
+       CLRectangle r;
+       gboolean has_focus = GTK_WIDGET_HAS_FOCUS(widget);
+       GdkGC *bg_gc = cl_get_window_bg_gc(widget);
+       
+       gdk_draw_rectangle (window, bg_gc, FALSE, x, y, width-1, height-1);
+
+       gtk_style_apply_default_background (style, window, TRUE, state_type,
+                                                                               area, x+1, y+1, width-2, height-2);
+
+       
+       cl_rectangle_set_entry (&r, style, state_type,
+                                                       CL_CORNER_ROUND, CL_CORNER_ROUND,
+                                                       CL_CORNER_ROUND, CL_CORNER_ROUND,
+                                                       has_focus);
+       
+       /* Draw "sunken" look when border thickness is more than 2 pixels. */
+       if (style->xthickness > 2 && style->ythickness > 2)
+       {
+               cl_draw_inset (style, window, widget, area, x, y, width, height,
+                              CL_CORNER_ROUND, CL_CORNER_ROUND,
+                              CL_CORNER_ROUND, CL_CORNER_ROUND);
+       
+               x++;
+               y++;
+               width-=2;
+               height-=2;
+       }
+       
+       cl_rectangle_set_clip_rectangle (&r, area);
+       cl_draw_rectangle (window, widget, style, x, y, width, height, &r);
+       cl_draw_shadow (window, widget, style, x, y, width, height, &r); 
+       cl_rectangle_reset_clip_rectangle (&r);
+}
+
+void cl_draw_optionmenu(GtkStyle *style, GdkWindow *window,
+                        GtkStateType state_type, GtkShadowType shadow_type,
+                        GdkRectangle *area, GtkWidget *widget,
+                        const gchar *detail,
+                        gint x, gint y, gint width, gint height)
+{
+       ClearlooksStyle *clearlooks_style = CLEARLOOKS_STYLE(style);
+       GtkRequisition indicator_size;
+       GtkBorder indicator_spacing;
+       int line_pos;
+
+       option_menu_get_props (widget, &indicator_size, &indicator_spacing);
+       
+       if (get_direction (widget) == GTK_TEXT_DIR_RTL)
+               line_pos = x + (indicator_size.width + indicator_spacing.left + indicator_spacing.right) + style->xthickness;
+       else
+               line_pos = x + width - (indicator_size.width + indicator_spacing.left + indicator_spacing.right) - style->xthickness;
+
+       cl_draw_button (style, window, state_type, shadow_type, area, widget, detail, x, y, width, height);
+       
+       gdk_draw_line (window, clearlooks_style->shade_gc[3],
+                                  line_pos, y + style->ythickness - 1, line_pos,
+                                  y + height - style->ythickness);
+
+       gdk_draw_line (window, style->light_gc[state_type],
+                                  line_pos+1, y + style->ythickness - 1, line_pos+1,
+                                  y + height - style->ythickness);
+}
+
+
+void cl_draw_menuitem_button (GdkDrawable *window, GtkWidget *widget, GtkStyle *style,
+                              GdkRectangle *area, GtkStateType state_type, 
+                              int x, int y, int width, int height, CLRectangle *r)
+{
+       ClearlooksStyle *clearlooks_style = (ClearlooksStyle*)style;
+       gboolean menubar  = (widget->parent && GTK_IS_MENU_BAR(widget->parent)) ? TRUE : FALSE;
+       int corner        = CL_CORNER_NARROW;
+       GdkColor lower_color;
+
+       shade (&style->base[GTK_STATE_SELECTED], &lower_color, 0.85);
+       
+       if (menubar)
+       {
+               height++;
+               corner = CL_CORNER_NONE;
+               r->bordergc    = clearlooks_style->border_gc[CL_BORDER_UPPER];
+       }
+       else
+       {
+               r->bordergc    = clearlooks_style->spot3_gc;
+       }
+       
+       cl_rectangle_set_corners (r, corner, corner, corner, corner);
+       
+       cl_rectangle_set_gradient (&r->fill_gradient,
+                                  &style->base[GTK_STATE_SELECTED], &lower_color);
+
+       r->gradient_type = CL_GRADIENT_VERTICAL;
+       
+       r->fillgc  = clearlooks_style->spot2_gc;
+       r->topleft = clearlooks_style->spot1_gc;
+       
+       cl_rectangle_set_clip_rectangle (r, area);
+       cl_draw_rectangle (window, widget, style, x, y, width, height, r);
+       cl_draw_shadow (window, widget, style, x, y, width, height, r);
+       cl_rectangle_reset_clip_rectangle (r);
+}
+
+void cl_draw_menuitem_flat (GdkDrawable *window, GtkWidget *widget, GtkStyle *style,
+                              GdkRectangle *area, GtkStateType state_type, 
+                              int x, int y, int width, int height, CLRectangle *r)
+{
+       ClearlooksStyle *clearlooks_style = (ClearlooksStyle*)style;
+       gboolean menubar  = (widget->parent && GTK_IS_MENU_BAR(widget->parent)) ? TRUE : FALSE;
+       GdkColor tmp;
+       
+       cl_rectangle_set_corners (r, CL_CORNER_NARROW, CL_CORNER_NARROW,
+                                    CL_CORNER_NARROW, CL_CORNER_NARROW);
+       
+       tmp = cl_gc_set_fg_color_shade (style->black_gc, style->colormap,
+                                       &style->base[GTK_STATE_PRELIGHT], 0.8);
+
+       r->bordergc = style->black_gc;
+       r->fillgc = style->base_gc[GTK_STATE_PRELIGHT];
+       
+       if (menubar) height++;
+
+       cl_rectangle_set_clip_rectangle (r, area);
+       cl_draw_rectangle (window, widget, style, x, y, width, height, r);
+       cl_rectangle_reset_clip_rectangle (r);  
+       
+       gdk_gc_set_foreground (style->black_gc, &tmp);
+}
+
+void cl_draw_menuitem_gradient (GdkDrawable *window, GtkWidget *widget, GtkStyle *style,
+                                GdkRectangle *area, GtkStateType state_type, 
+                                int x, int y, int width, int height, CLRectangle *r)
+{
+       ClearlooksStyle *clearlooks_style = (ClearlooksStyle*)style;
+       gboolean menubar  = (widget->parent && GTK_IS_MENU_BAR(widget->parent)) ? TRUE : FALSE;
+       GdkColor tmp;
+       GdkColor lower_color;
+       
+       shade (&style->base[GTK_STATE_SELECTED], &lower_color, 0.8);
+       
+       cl_rectangle_set_corners (r, CL_CORNER_NARROW, CL_CORNER_NARROW,
+                                    CL_CORNER_NARROW, CL_CORNER_NARROW);
+                                    
+       cl_rectangle_set_gradient (&r->fill_gradient,
+                                  &style->base[GTK_STATE_SELECTED], &lower_color);
+
+       r->gradient_type = CL_GRADIENT_VERTICAL;
+       
+       tmp = cl_gc_set_fg_color_shade (style->black_gc, style->colormap,
+                                       &style->base[GTK_STATE_PRELIGHT], 0.8);
+
+       r->bordergc = style->black_gc;
+       r->fillgc = style->base_gc[GTK_STATE_PRELIGHT];
+       
+       if (menubar) height++;
+
+       cl_rectangle_set_clip_rectangle (r, area);
+       cl_draw_rectangle (window, widget, style, x, y, width, height, r);
+       cl_rectangle_reset_clip_rectangle (r);
+       
+       gdk_gc_set_foreground (style->black_gc, &tmp);
+}
+
+void cl_draw_treeview_header (GtkStyle *style, GdkWindow *window,
+                              GtkStateType state_type, GtkShadowType shadow_type,
+                              GdkRectangle *area,
+                              GtkWidget *widget, const gchar *detail,
+                              gint x, gint y, gint width, gint height)
+{
+       ClearlooksStyle *clearlooks_style = CLEARLOOKS_STYLE (style);
+       gint columns = 0, column_index = -1, fill_width = width;
+       gboolean is_etree = strcmp("ETree", G_OBJECT_TYPE_NAME(widget->parent)) == 0;
+       gboolean resizable = TRUE;
+       
+       GdkGC *bottom = clearlooks_style->shade_gc[5];
+               
+       if ( width < 2 || height < 2 )
+               return;
+       
+       if (GTK_IS_TREE_VIEW (widget->parent))
+       {
+               gtk_treeview_get_header_index (GTK_TREE_VIEW(widget->parent),
+                                          widget, &column_index, &columns,
+                                          &resizable);
+       }
+       else if (GTK_IS_CLIST (widget->parent))
+       {
+               gtk_clist_get_header_index (GTK_CLIST(widget->parent),
+                                           widget, &column_index, &columns);
+       }
+       
+       if (area)
+       {
+               gdk_gc_set_clip_rectangle (clearlooks_style->shade_gc[0], area);
+               gdk_gc_set_clip_rectangle (clearlooks_style->shade_gc[4], area);
+               gdk_gc_set_clip_rectangle (style->bg_gc[state_type], area);                     
+               gdk_gc_set_clip_rectangle (clearlooks_style->shade_gc[5], area);
+       }
+       
+       if (state_type != GTK_STATE_NORMAL)
+               fill_width-=2;
+       
+       gdk_draw_rectangle (window, style->bg_gc[state_type], TRUE, x, y, fill_width, height-(height/3)+1);
+       
+       draw_hgradient (window, style->bg_gc[state_type], style,
+                       x, 1+y+height-(height/3), fill_width, height/3,
+                       &style->bg[state_type], &clearlooks_style->inset_dark[state_type]);
+
+       if (resizable || (column_index != columns-1))
+       {
+               gdk_draw_line (window, clearlooks_style->shade_gc[4], x+width-2, y+4, x+width-2, y+height-5); 
+               gdk_draw_line (window, clearlooks_style->shade_gc[0], x+width-1, y+4, x+width-1, y+height-5); 
+       }
+       
+       /* left light line */
+       if (column_index == 0)
+               gdk_draw_line (window, clearlooks_style->shade_gc[0], x, y+1, x, y+height-2);
+               
+       /* top light line */
+       gdk_draw_line (window, clearlooks_style->shade_gc[0], x, y, x+width-1, y);
+       
+       /* bottom dark line */
+       if (state_type == GTK_STATE_INSENSITIVE)
+               bottom = clearlooks_style->shade_gc[3];
+       
+       
+       gdk_draw_line (window, bottom, x, y+height-1, x+width-1, y+height-1);
+       
+       if (area)
+       {
+               gdk_gc_set_clip_rectangle (clearlooks_style->shade_gc[0], NULL);
+               gdk_gc_set_clip_rectangle (clearlooks_style->shade_gc[4], NULL);
+               gdk_gc_set_clip_rectangle (style->bg_gc[state_type], NULL);
+               gdk_gc_set_clip_rectangle (clearlooks_style->shade_gc[5], NULL);
+       }               
+}
diff --git a/libs/clearlooks/clearlooks_draw.h b/libs/clearlooks/clearlooks_draw.h
new file mode 100644 (file)
index 0000000..a8cbb37
--- /dev/null
@@ -0,0 +1,159 @@
+#ifndef CLEARLOOKS_DRAW_H
+#define CLEARLOOKS_DRAW_H
+
+#include <gtk/gtk.h>
+#include <gdk/gdk.h>
+
+typedef struct 
+{
+       GdkColor *from;
+       GdkColor *to;
+} CLGradient;
+
+typedef enum
+{
+       CL_GRADIENT_NONE,
+       CL_GRADIENT_HORIZONTAL,
+       CL_GRADIENT_VERTICAL
+} CLGradientType;
+
+typedef struct
+{
+       CLGradient      fill_gradient;
+       CLGradient      border_gradient;
+       
+       CLGradientType  gradient_type;
+       
+       GdkGC          *bordergc;
+       GdkGC          *fillgc;
+
+       guint8          corners[4];
+       
+       GdkGC          *topleft;                /* top + left shadow */
+       GdkGC          *bottomright;    /* bottom + right shadow */
+       
+       GdkColor        tmp_color;              /* used for gradient */
+} CLRectangle;
+
+typedef enum /* DON'T CHANGE THE ORDER! */
+{
+       CL_CORNER_TOPRIGHT,
+       CL_CORNER_BOTTOMRIGHT,
+       CL_CORNER_BOTTOMLEFT,
+       CL_CORNER_TOPLEFT
+} CLCornerSide;
+
+typedef enum /* DON'T CHANGE THE ORDER! */
+{
+       CL_BORDER_TOP,
+       CL_BORDER_RIGHT,
+       CL_BORDER_BOTTOM,
+       CL_BORDER_LEFT
+} CLBorderType;
+
+typedef enum
+{
+       CL_CORNER_NONE   = 0,
+       CL_CORNER_NARROW = 1,
+       CL_CORNER_ROUND  = 2
+} CLCornerSharpness;
+
+
+
+CLRectangle *cl_rectangle_new(GdkGC *fillgc, GdkGC *bordergc,
+                              int tl, int tr, int bl, int br);
+
+void cl_draw_rectangle (GdkWindow *window, GtkWidget *widget, GtkStyle *style,
+                        int x, int y, int width, int height, CLRectangle *r);
+
+void cl_rectangle_set_color (CLGradient *g, GdkColor *color);
+void cl_rectangle_set_gradient (CLGradient *g, GdkColor *from, GdkColor *to);
+
+void cl_rectangle_set_button (CLRectangle *r, GtkStyle *style,
+                             GtkStateType state_type, gboolean hasdefault, gboolean has_focus,
+                             CLBorderType tl, CLBorderType tr,
+                             CLBorderType bl, CLBorderType br);
+
+void cl_rectangle_set_entry (CLRectangle *r, GtkStyle *style,
+                            GtkStateType state_type,
+                            CLBorderType tl, CLBorderType tr,
+                            CLBorderType bl, CLBorderType br,
+                            gboolean has_focus);
+                                                       
+void cl_draw_shadow(GdkWindow *window, GtkWidget *widget, GtkStyle *style,
+                    int x, int y, int width, int height, CLRectangle *r);
+
+void cl_rectangle_set_clip_rectangle (CLRectangle *r, GdkRectangle *area);
+void cl_rectangle_reset_clip_rectangle (CLRectangle *r);
+
+void cl_set_corner_sharpness (const gchar *detail, GtkWidget *widget, CLRectangle *r);
+
+
+void cl_rectangle_set_corners (CLRectangle *r, int tl, int tr, int bl, int br);
+
+void cl_rectangle_init (CLRectangle *r, GdkGC *fillgc, GdkGC *bordergc,
+                        int tl, int tr, int bl, int br);
+
+void cl_rectangle_reset (CLRectangle *r, GtkStyle *style);
+
+
+GdkPixmap* cl_progressbar_tile_new (GdkDrawable *drawable, GtkWidget *widget,
+                              GtkStyle *style, gint height, gint offset);
+                               
+void cl_progressbar_fill (GdkDrawable *drawable, GtkWidget *widget,
+                          GtkStyle *style, GdkGC *gc,
+                          gint x, gint y, gint width, gint height,
+                                                 guint8 offset, GdkRectangle *area);
+                                                 
+GdkColor cl_gc_set_fg_color_shade (GdkGC *gc, GdkColormap *colormap, 
+                                   GdkColor *from, gfloat s);
+
+void cl_draw_spinbutton(GtkStyle *style, GdkWindow *window,
+                        GtkStateType state_type, GtkShadowType shadow_type,
+                        GdkRectangle *area,
+                        GtkWidget *widget, const gchar *detail,
+                        gint x, gint y, gint width, gint height);
+                                               
+void cl_draw_button(GtkStyle *style, GdkWindow *window,
+                    GtkStateType state_type, GtkShadowType shadow_type,
+                    GdkRectangle *area,
+                    GtkWidget *widget, const gchar *detail,
+                    gint x, gint y, gint width, gint height);
+                                       
+void cl_draw_entry (GtkStyle *style, GdkWindow *window,
+                    GtkStateType state_type, GtkShadowType shadow_type,
+                    GdkRectangle *area,
+                    GtkWidget *widget, const gchar *detail,
+                    gint x, gint y, gint width, gint height);
+                                       
+void cl_draw_combobox_entry (GtkStyle *style, GdkWindow *window,
+                             GtkStateType state_type, GtkShadowType shadow_type,
+                             GdkRectangle *area,
+                             GtkWidget *widget, const gchar *detail,
+                             gint x, gint y, gint width, gint height);
+               
+void cl_draw_combobox_button (GtkStyle *style, GdkWindow *window,
+                             GtkStateType state_type, GtkShadowType shadow_type,
+                             GdkRectangle *area,
+                             GtkWidget *widget, const gchar *detail,
+                             gint x, gint y, gint width, gint height);
+                                                        
+void cl_draw_menuitem_button (GdkDrawable *window, GtkWidget *widget, GtkStyle *style,
+                              GdkRectangle *area, GtkStateType state_type, 
+                              int x, int y, int wiidth, int height, CLRectangle *r);
+
+void cl_draw_menuitem_flat (GdkDrawable *window, GtkWidget *widget, GtkStyle *style,
+                            GdkRectangle *area, GtkStateType state_type, 
+                            int x, int y, int wiidth, int height, CLRectangle *r);
+                            
+void cl_draw_menuitem_gradient (GdkDrawable *window, GtkWidget *widget, GtkStyle *style,
+                                GdkRectangle *area, GtkStateType state_type, 
+                                int x, int y, int wiidth, int height, CLRectangle *r);
+                                                         
+void cl_draw_treeview_header (GtkStyle *style, GdkWindow *window,
+                              GtkStateType state_type, GtkShadowType shadow_type,
+                              GdkRectangle *area,
+                              GtkWidget *widget, const gchar *detail,
+                              gint x, gint y, gint width, gint height);
+                                                         
+#endif /* CLEARLOOKS_DRAW_H */
diff --git a/libs/clearlooks/clearlooks_rc_style.c b/libs/clearlooks/clearlooks_rc_style.c
new file mode 100644 (file)
index 0000000..1c5f2c4
--- /dev/null
@@ -0,0 +1,392 @@
+/* Clearlooks theme engine
+ * Copyright (C) 2005 Richard Stellingwerff.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ *
+ * Written by Owen Taylor <otaylor@redhat.com>
+ * and by Alexander Larsson <alexl@redhat.com>
+ * Modified by Richard Stellingwerff <remenic@gmail.com>
+ */
+
+#include "clearlooks_style.h"
+#include "clearlooks_rc_style.h"
+
+static void      clearlooks_rc_style_init         (ClearlooksRcStyle      *style);
+static void      clearlooks_rc_style_class_init   (ClearlooksRcStyleClass *klass);
+static GtkStyle *clearlooks_rc_style_create_style (GtkRcStyle             *rc_style);
+static guint     clearlooks_rc_style_parse        (GtkRcStyle             *rc_style,
+                                                  GtkSettings            *settings,
+                                                  GScanner               *scanner);
+static void      clearlooks_rc_style_merge        (GtkRcStyle             *dest,
+                                                  GtkRcStyle             *src);
+
+
+static GtkRcStyleClass *parent_class;
+
+GType clearlooks_type_rc_style = 0;
+
+enum
+{
+  TOKEN_SPOTCOLOR = G_TOKEN_LAST + 1,
+  TOKEN_CONTRAST,
+  TOKEN_SUNKENMENU,
+  TOKEN_PROGRESSBARSTYLE,
+  TOKEN_MENUBARSTYLE,
+  TOKEN_MENUITEMSTYLE,
+  TOKEN_LISTVIEWITEMSTYLE
+};
+
+static struct
+  {
+    const gchar        *name;
+    guint               token;
+  }
+theme_symbols[] =
+{
+  { "spotcolor",               TOKEN_SPOTCOLOR  },
+  { "contrast",                TOKEN_CONTRAST  },
+  { "sunkenmenubar",    TOKEN_SUNKENMENU },
+  { "progressbarstyle",  TOKEN_PROGRESSBARSTYLE },
+  { "menubarstyle",     TOKEN_MENUBARSTYLE },
+  { "menuitemstyle",    TOKEN_MENUITEMSTYLE },
+  { "listviewitemstyle", TOKEN_LISTVIEWITEMSTYLE }
+};
+
+
+void
+clearlooks_rc_style_register_type (GTypeModule *module)
+{
+  static const GTypeInfo object_info =
+  {
+    sizeof (ClearlooksRcStyleClass),
+    (GBaseInitFunc) NULL,
+    (GBaseFinalizeFunc) NULL,
+    (GClassInitFunc) clearlooks_rc_style_class_init,
+    NULL,           /* class_finalize */
+    NULL,           /* class_data */
+    sizeof (ClearlooksRcStyle),
+    0,              /* n_preallocs */
+    (GInstanceInitFunc) clearlooks_rc_style_init,
+    NULL
+  };
+  
+  clearlooks_type_rc_style = g_type_module_register_type (module,
+                                                    GTK_TYPE_RC_STYLE,
+                                                    "ClearlooksRcStyle",
+                                                    &object_info, 0);
+}
+
+static void
+clearlooks_rc_style_init (ClearlooksRcStyle *clearlooks_rc)
+{
+  clearlooks_rc->has_spot_color = FALSE;
+  clearlooks_rc->contrast = 1.0;
+  clearlooks_rc->sunkenmenubar = 1;
+  clearlooks_rc->progressbarstyle = 0;
+  clearlooks_rc->menubarstyle = 0;
+  clearlooks_rc->menuitemstyle = 1;
+  clearlooks_rc->listviewitemstyle = 1;
+}
+
+static void
+clearlooks_rc_style_class_init (ClearlooksRcStyleClass *klass)
+{
+  GtkRcStyleClass *rc_style_class = GTK_RC_STYLE_CLASS (klass);
+
+  parent_class = g_type_class_peek_parent (klass);
+
+  rc_style_class->parse = clearlooks_rc_style_parse;
+  rc_style_class->create_style = clearlooks_rc_style_create_style;
+  rc_style_class->merge = clearlooks_rc_style_merge;
+}
+
+static guint
+theme_parse_color(GtkSettings  *settings,
+                 GScanner     *scanner,
+                 GdkColor     *color)
+{
+  guint token;
+
+  /* Skip 'blah_color' */
+  token = g_scanner_get_next_token(scanner);
+
+  token = g_scanner_get_next_token(scanner);
+  if (token != G_TOKEN_EQUAL_SIGN)
+    return G_TOKEN_EQUAL_SIGN;
+
+  return gtk_rc_parse_color (scanner, color);
+}
+
+static guint
+theme_parse_contrast(GtkSettings  *settings,
+                    GScanner     *scanner,
+                    double       *contrast)
+{
+  guint token;
+
+  /* Skip 'contrast' */
+  token = g_scanner_get_next_token(scanner);
+
+  token = g_scanner_get_next_token(scanner);
+  if (token != G_TOKEN_EQUAL_SIGN)
+    return G_TOKEN_EQUAL_SIGN;
+
+  token = g_scanner_get_next_token(scanner);
+  if (token != G_TOKEN_FLOAT)
+    return G_TOKEN_FLOAT;
+
+  *contrast = scanner->value.v_float;
+  
+  return G_TOKEN_NONE;
+}
+
+static guint
+theme_parse_sunkenmenubar(GtkSettings  *settings,
+                    GScanner     *scanner,
+                    guint8       *sunken)
+{
+  guint token;
+
+  /* Skip 'sunkenmenubar' */
+  token = g_scanner_get_next_token(scanner);
+
+  token = g_scanner_get_next_token(scanner);
+  if (token != G_TOKEN_EQUAL_SIGN)
+    return G_TOKEN_EQUAL_SIGN;
+
+  token = g_scanner_get_next_token(scanner);
+  if (token != G_TOKEN_INT)
+    return G_TOKEN_INT;
+
+  *sunken = scanner->value.v_int;
+  
+  return G_TOKEN_NONE;
+}
+
+static guint
+theme_parse_progressbarstyle(GtkSettings  *settings,
+                    GScanner     *scanner,
+                    guint8       *progressbarstyle)
+{
+  guint token;
+
+  /* Skip 'sunkenmenubar' */
+  token = g_scanner_get_next_token(scanner);
+
+  token = g_scanner_get_next_token(scanner);
+  if (token != G_TOKEN_EQUAL_SIGN)
+    return G_TOKEN_EQUAL_SIGN;
+
+  token = g_scanner_get_next_token(scanner);
+  if (token != G_TOKEN_INT)
+    return G_TOKEN_INT;
+
+  *progressbarstyle = scanner->value.v_int;
+  
+  return G_TOKEN_NONE;
+}
+
+static guint
+theme_parse_menubarstyle(GtkSettings  *settings,
+                    GScanner     *scanner,
+                    guint8       *menubarstyle)
+{
+  guint token;
+
+  /* Skip 'menubarstyle' */
+  token = g_scanner_get_next_token(scanner);
+
+  token = g_scanner_get_next_token(scanner);
+  if (token != G_TOKEN_EQUAL_SIGN)
+    return G_TOKEN_EQUAL_SIGN;
+
+  token = g_scanner_get_next_token(scanner);
+  if (token != G_TOKEN_INT)
+    return G_TOKEN_INT;
+
+  *menubarstyle = scanner->value.v_int;
+  
+  return G_TOKEN_NONE;
+}
+
+static guint
+theme_parse_menuitemstyle(GtkSettings  *settings,
+                    GScanner     *scanner,
+                    guint8       *menuitemstyle)
+{
+  guint token;
+
+  /* Skip 'sunkenmenubar' */
+  token = g_scanner_get_next_token(scanner);
+
+  token = g_scanner_get_next_token(scanner);
+  if (token != G_TOKEN_EQUAL_SIGN)
+    return G_TOKEN_EQUAL_SIGN;
+
+  token = g_scanner_get_next_token(scanner);
+  if (token != G_TOKEN_INT)
+    return G_TOKEN_INT;
+
+  *menuitemstyle = scanner->value.v_int;
+  
+  return G_TOKEN_NONE;
+}
+
+static guint
+theme_parse_listviewitemstyle(GtkSettings  *settings,
+                          GScanner     *scanner,
+                          guint8       *listviewitemstyle)
+{         
+  guint token;
+                   
+  token = g_scanner_get_next_token(scanner);
+                     
+  token = g_scanner_get_next_token(scanner);
+
+  if (token != G_TOKEN_EQUAL_SIGN)
+     return G_TOKEN_EQUAL_SIGN;
+                         
+  token = g_scanner_get_next_token(scanner);
+  if (token != G_TOKEN_INT)
+    return G_TOKEN_INT;
+                           
+  *listviewitemstyle = scanner->value.v_int;
+                       
+  return G_TOKEN_NONE;
+}         
+
+static guint
+clearlooks_rc_style_parse (GtkRcStyle *rc_style,
+                          GtkSettings  *settings,
+                          GScanner   *scanner)
+                    
+{
+  static GQuark scope_id = 0;
+  ClearlooksRcStyle *clearlooks_style = CLEARLOOKS_RC_STYLE (rc_style);
+
+  guint old_scope;
+  guint token;
+  guint i;
+  
+  /* Set up a new scope in this scanner. */
+
+  if (!scope_id)
+    scope_id = g_quark_from_string("clearlooks_theme_engine");
+
+  /* If we bail out due to errors, we *don't* reset the scope, so the
+   * error messaging code can make sense of our tokens.
+   */
+  old_scope = g_scanner_set_scope(scanner, scope_id);
+
+  /* Now check if we already added our symbols to this scope
+   * (in some previous call to clearlooks_rc_style_parse for the
+   * same scanner.
+   */
+
+  if (!g_scanner_lookup_symbol(scanner, theme_symbols[0].name))
+    {
+      g_scanner_freeze_symbol_table(scanner);
+      for (i = 0; i < G_N_ELEMENTS (theme_symbols); i++)
+       g_scanner_scope_add_symbol(scanner, scope_id,
+                                  theme_symbols[i].name,
+                                  GINT_TO_POINTER(theme_symbols[i].token));
+      g_scanner_thaw_symbol_table(scanner);
+    }
+
+  /* We're ready to go, now parse the top level */
+
+  token = g_scanner_peek_next_token(scanner);
+  while (token != G_TOKEN_RIGHT_CURLY)
+    {
+      switch (token)
+       {
+       case TOKEN_SPOTCOLOR:
+         token = theme_parse_color(settings, scanner, &clearlooks_style->spot_color);
+         clearlooks_style->has_spot_color = TRUE;
+         break;
+       case TOKEN_CONTRAST:
+         token = theme_parse_contrast(settings, scanner, &clearlooks_style->contrast);
+         break;
+       case TOKEN_SUNKENMENU:
+         token = theme_parse_sunkenmenubar(settings, scanner, &clearlooks_style->sunkenmenubar);
+         break;
+       case TOKEN_PROGRESSBARSTYLE:
+         token = theme_parse_progressbarstyle(settings, scanner, &clearlooks_style->progressbarstyle);
+         break;
+       case TOKEN_MENUBARSTYLE:
+         token = theme_parse_menubarstyle(settings, scanner, &clearlooks_style->menubarstyle);
+         break;
+       case TOKEN_MENUITEMSTYLE:
+         token = theme_parse_menuitemstyle(settings, scanner, &clearlooks_style->menuitemstyle);
+         break;
+       case TOKEN_LISTVIEWITEMSTYLE:
+         token = theme_parse_listviewitemstyle(settings, scanner, &clearlooks_style->listviewitemstyle);
+         break;
+       default:
+         g_scanner_get_next_token(scanner);
+         token = G_TOKEN_RIGHT_CURLY;
+         break;
+       }
+
+      if (token != G_TOKEN_NONE)
+       return token;
+
+      token = g_scanner_peek_next_token(scanner);
+    }
+
+  g_scanner_get_next_token(scanner);
+
+  g_scanner_set_scope(scanner, old_scope);
+
+  return G_TOKEN_NONE;
+}
+
+static void
+clearlooks_rc_style_merge (GtkRcStyle *dest,
+                          GtkRcStyle *src)
+{
+       ClearlooksRcStyle *dest_w, *src_w;
+       
+       parent_class->merge (dest, src);
+       
+       if (!CLEARLOOKS_IS_RC_STYLE (src))
+               return;
+       
+       src_w = CLEARLOOKS_RC_STYLE (src);
+       dest_w = CLEARLOOKS_RC_STYLE (dest);
+       
+       dest_w->contrast = src_w->contrast;
+       dest_w->sunkenmenubar = src_w->sunkenmenubar;
+       dest_w->progressbarstyle = src_w->progressbarstyle;
+       dest_w->menubarstyle = src_w->menubarstyle;
+       dest_w->menuitemstyle = src_w->menuitemstyle;
+       dest_w->listviewitemstyle = src_w->listviewitemstyle;
+
+       if (src_w->has_spot_color)
+       {
+               dest_w->has_spot_color = TRUE;
+               dest_w->spot_color = src_w->spot_color;
+       }
+}
+
+
+/* Create an empty style suitable to this RC style
+ */
+static GtkStyle *
+clearlooks_rc_style_create_style (GtkRcStyle *rc_style)
+{
+  return GTK_STYLE (g_object_new (CLEARLOOKS_TYPE_STYLE, NULL));
+}
diff --git a/libs/clearlooks/clearlooks_rc_style.h b/libs/clearlooks/clearlooks_rc_style.h
new file mode 100644 (file)
index 0000000..bd8e0ca
--- /dev/null
@@ -0,0 +1,57 @@
+/* Clearlooks Theme Engine
+ * Copyright (C) 2005 Richard Stellingwerff.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ *
+ * Written by Owen Taylor <otaylor@redhat.com>
+ * and by Alexander Larsson <alexl@redhat.com>
+ * Modified by Richard Stellingwerff <remenic@gmail.com>
+ */
+
+#include <gtk/gtkrc.h>
+
+typedef struct _ClearlooksRcStyle ClearlooksRcStyle;
+typedef struct _ClearlooksRcStyleClass ClearlooksRcStyleClass;
+
+extern GType clearlooks_type_rc_style;
+
+#define CLEARLOOKS_TYPE_RC_STYLE              clearlooks_type_rc_style
+#define CLEARLOOKS_RC_STYLE(object)           (G_TYPE_CHECK_INSTANCE_CAST ((object), CLEARLOOKS_TYPE_RC_STYLE, ClearlooksRcStyle))
+#define CLEARLOOKS_RC_STYLE_CLASS(klass)      (G_TYPE_CHECK_CLASS_CAST ((klass), CLEARLOOKS_TYPE_RC_STYLE, ClearlooksRcStyleClass))
+#define CLEARLOOKS_IS_RC_STYLE(object)        (G_TYPE_CHECK_INSTANCE_TYPE ((object), CLEARLOOKS_TYPE_RC_STYLE))
+#define CLEARLOOKS_IS_RC_STYLE_CLASS(klass)   (G_TYPE_CHECK_CLASS_TYPE ((klass), CLEARLOOKS_TYPE_RC_STYLE))
+#define CLEARLOOKS_RC_STYLE_GET_CLASS(obj)    (G_TYPE_INSTANCE_GET_CLASS ((obj), CLEARLOOKS_TYPE_RC_STYLE, ClearlooksRcStyleClass))
+
+struct _ClearlooksRcStyle
+{
+  GtkRcStyle parent_instance;
+
+  GdkColor spot_color;
+  gboolean has_spot_color;
+  double contrast;
+  guint8 sunkenmenubar;
+  guint8 progressbarstyle;
+  guint8 menubarstyle;
+  guint8 menuitemstyle;
+  guint8 listviewitemstyle;
+};
+
+struct _ClearlooksRcStyleClass
+{
+  GtkRcStyleClass parent_class;
+};
+
+void clearlooks_rc_style_register_type (GTypeModule *module);
diff --git a/libs/clearlooks/clearlooks_style.c b/libs/clearlooks/clearlooks_style.c
new file mode 100644 (file)
index 0000000..241f14c
--- /dev/null
@@ -0,0 +1,2657 @@
+#include <gtk/gtk.h>
+
+#include "clearlooks_style.h"
+#include "clearlooks_rc_style.h"
+#include "clearlooks_draw.h"
+
+#include <math.h>
+#include <string.h>
+
+#include "bits.c"
+#include "support.h"
+//#include "config.h"
+
+/* #define DEBUG 1 */
+
+#define SCALE_SIZE 5
+
+#define DETAIL(xx)   ((detail) && (!strcmp(xx, detail)))
+#define COMPARE_COLORS(a,b) (a.red == b.red && a.green == b.green && a.blue == b.blue)
+
+#define DRAW_ARGS    GtkStyle       *style, \
+                     GdkWindow      *window, \
+                     GtkStateType    state_type, \
+                     GtkShadowType   shadow_type, \
+                     GdkRectangle   *area, \
+                     GtkWidget      *widget, \
+                     const gchar    *detail, \
+                     gint            x, \
+                     gint            y, \
+                     gint            width, \
+                     gint            height
+
+static GdkGC *realize_color (GtkStyle * style, GdkColor * color);
+static GtkStyleClass *parent_class;
+static GList *progressbars = NULL;
+static gint8 pboffset = 10;
+static int timer_id = 0;
+
+static void cl_progressbar_remove (gpointer data)
+{
+       if (g_list_find (progressbars, data) == NULL)
+               return;
+
+       progressbars = g_list_remove (progressbars, data);
+       g_object_unref (data);
+       
+       if (g_list_first(progressbars) == NULL) {
+               g_source_remove(timer_id);
+               timer_id = 0;
+       }
+}
+
+static void update_progressbar (gpointer data, gpointer user_data)
+{
+       gfloat fraction;
+
+       if (data == NULL)
+               return;
+
+       fraction = gtk_progress_bar_get_fraction (GTK_PROGRESS_BAR (data));
+       
+       /* update only if not filled */
+       if (fraction < 1.0)
+               gtk_widget_queue_resize ((GtkWidget*)data);
+       
+       if (fraction >= 1.0 || GTK_PROGRESS (data)->activity_mode)
+               cl_progressbar_remove (data);
+}
+
+static gboolean timer_func (gpointer data)
+{
+       g_list_foreach (progressbars, update_progressbar, NULL);
+       if (--pboffset < 0) pboffset = 9;
+       return (g_list_first(progressbars) != NULL);
+}
+
+static gboolean cl_progressbar_known(gconstpointer data)
+{
+       return (g_list_find (progressbars, data) != NULL);
+}
+
+
+static void cl_progressbar_add (gpointer data)
+{
+       if (!GTK_IS_PROGRESS_BAR (data))
+               return;
+
+       progressbars = g_list_append (progressbars, data);
+
+       g_object_ref (data);
+       g_signal_connect ((GObject*)data, "unrealize", G_CALLBACK (cl_progressbar_remove), data);
+       
+       if (timer_id == 0)
+               timer_id = g_timeout_add (100, timer_func, NULL);
+}
+
+static GdkColor *
+clearlooks_get_spot_color (ClearlooksRcStyle *clearlooks_rc)
+{
+       GtkRcStyle *rc = GTK_RC_STYLE (clearlooks_rc);
+       
+       if (clearlooks_rc->has_spot_color)
+               return &clearlooks_rc->spot_color;
+       else
+               return &rc->base[GTK_STATE_SELECTED];
+}
+
+/**************************************************************************/
+
+/* used for optionmenus... */
+static void
+draw_tab (GtkStyle      *style,
+         GdkWindow     *window,
+         GtkStateType   state_type,
+         GtkShadowType  shadow_type,
+         GdkRectangle  *area,
+         GtkWidget     *widget,
+         const gchar   *detail,
+         gint           x,
+         gint           y,
+         gint           width,
+         gint           height)
+{
+#define ARROW_SPACE 2
+#define ARROW_LINE_HEIGHT 2
+#define ARROW_LINE_WIDTH 5
+       ClearlooksStyle *clearlooks_style = CLEARLOOKS_STYLE (style);
+       GtkRequisition indicator_size;
+       GtkBorder indicator_spacing;
+       gint arrow_height;
+       
+       option_menu_get_props (widget, &indicator_size, &indicator_spacing);
+       
+       indicator_size.width += (indicator_size.width % 2) - 1;
+       arrow_height = indicator_size.width / 2 + 2;
+       
+       x += (width - indicator_size.width) / 2;
+       y += height/2;
+
+       if (state_type == GTK_STATE_INSENSITIVE)
+       {
+               draw_arrow (window, style->light_gc[state_type], area,
+                           GTK_ARROW_UP, 1+x, 1+y-arrow_height,
+                           indicator_size.width, arrow_height);
+
+               draw_arrow (window, style->light_gc[state_type], area,
+                           GTK_ARROW_DOWN, 1+x, 1+y+1,
+                           indicator_size.width, arrow_height);
+       }
+       
+       draw_arrow (window, style->fg_gc[state_type], area,
+                   GTK_ARROW_UP, x, y-arrow_height,
+                   indicator_size.width, arrow_height);
+       
+       draw_arrow (window, style->fg_gc[state_type], area,
+                   GTK_ARROW_DOWN, x, y+1,
+                   indicator_size.width, arrow_height);
+}
+
+static void
+clearlooks_draw_arrow (GtkStyle      *style,
+                       GdkWindow     *window,
+                       GtkStateType   state,
+                       GtkShadowType  shadow,
+                       GdkRectangle  *area,
+                       GtkWidget     *widget,
+                       const gchar   *detail,
+                       GtkArrowType   arrow_type,
+                       gboolean       fill,
+                       gint           x,
+                       gint           y,
+                       gint           width,
+                       gint           height)
+{
+       ClearlooksStyle *clearlooks_style = CLEARLOOKS_STYLE (style);
+       gint original_width, original_x;
+       GdkGC *gc;
+       
+       sanitize_size (window, &width, &height);
+       
+       if (is_combo_box (widget))
+       {
+               width = 7;
+               height = 5;
+               x+=2;
+               y+=4;
+               if (state == GTK_STATE_INSENSITIVE)
+               {
+                       draw_arrow (window, style->light_gc[state], area,
+                                   GTK_ARROW_UP, 1+x, 1+y-height,
+                                   width, height);
+
+                       draw_arrow (window, style->light_gc[state], area,
+                                   GTK_ARROW_DOWN, 1+x, 1+y+1,
+                                   width, height);
+               }
+       
+               draw_arrow (window, style->fg_gc[state], area,
+                           GTK_ARROW_UP, x, y-height,
+                           width, height);
+       
+               draw_arrow (window, style->fg_gc[state], area,
+                           GTK_ARROW_DOWN, x, y+1,
+                           width, height);
+               
+               return;
+       }
+       
+       original_width = width;
+       original_x = x;
+       
+       /* Make spinbutton arrows and arrows in menus
+       * slightly larger to get the right pixels drawn */
+       if (DETAIL ("spinbutton"))
+               height += 1;
+       
+       if (DETAIL("menuitem"))
+       {
+               width = 6;
+               height = 7;
+       }
+       
+       /* Compensate arrow position for "sunken" look */ 
+       if (DETAIL ("spinbutton") && arrow_type == GTK_ARROW_DOWN &&
+           style->xthickness > 2 && style->ythickness > 2)
+                       y -= 1;
+       
+       if (widget && widget->parent && GTK_IS_COMBO (widget->parent->parent))
+       {
+               width -= 2;
+               height -=2;
+               x++;
+       }
+       
+       calculate_arrow_geometry (arrow_type, &x, &y, &width, &height);
+       
+       if (DETAIL ("menuitem"))
+               x = original_x + original_width - width;
+       
+       if (DETAIL ("spinbutton") && (arrow_type == GTK_ARROW_DOWN))
+               y += 1;
+       
+       if (state == GTK_STATE_INSENSITIVE)
+               draw_arrow (window, style->light_gc[state], area, arrow_type, x + 1, y + 1, width, height);
+
+       gc = style->fg_gc[state];
+               
+       draw_arrow (window, gc, area, arrow_type, x, y, width, height);
+}
+
+
+static void
+draw_flat_box (DRAW_ARGS)
+{
+       ClearlooksStyle *clearlooks_style = CLEARLOOKS_STYLE (style);
+
+       g_return_if_fail (GTK_IS_STYLE (style));
+       g_return_if_fail (window != NULL);
+
+       sanitize_size (window, &width, &height);
+
+       if (detail &&   
+           clearlooks_style->listviewitemstyle == 1 && 
+           state_type == GTK_STATE_SELECTED && (
+           !strncmp ("cell_even", detail, strlen ("cell_even")) ||
+           !strncmp ("cell_odd", detail, strlen ("cell_odd"))))
+       {
+               GdkGC    *gc;
+               GdkColor  lower_color;
+               GdkColor *upper_color;
+
+               if (GTK_WIDGET_HAS_FOCUS (widget))
+               {
+                       gc = style->base_gc[state_type];
+                       upper_color = &style->base[state_type];
+               }
+               else
+               {
+                       gc = style->base_gc[GTK_STATE_ACTIVE];
+                       upper_color = &style->base[GTK_STATE_ACTIVE];
+               }
+               
+               if (GTK_IS_TREE_VIEW (widget) && 0)
+               {
+                       GtkTreeSelection *sel = gtk_tree_view_get_selection (GTK_TREE_VIEW (widget));
+
+                       if (gtk_tree_selection_count_selected_rows (sel) > 1)
+                       {
+                               parent_class->draw_flat_box (style, window, state_type, shadow_type,
+                                                            area, widget, detail,
+                                                            x, y, width, height);
+                               return;
+                       }
+               }
+               
+               shade (upper_color, &lower_color, 0.8);
+
+               if (area)
+                       gdk_gc_set_clip_rectangle (gc, area);
+               
+               draw_hgradient (window, gc, style,
+                               x, y, width, height, upper_color, &lower_color);
+
+               if (area)
+                       gdk_gc_set_clip_rectangle (gc, NULL);
+       }
+       else
+       {
+               parent_class->draw_flat_box (style, window, state_type,
+                                            shadow_type,
+                                            area, widget, detail,
+                                            x, y, width, height);
+       }
+}
+/**************************************************************************/
+
+static void
+draw_shadow (DRAW_ARGS)
+{
+       ClearlooksStyle *clearlooks_style = CLEARLOOKS_STYLE (style);
+       CLRectangle r;
+       
+       GdkGC *outer_gc = clearlooks_style->shade_gc[4];
+       GdkGC *gc1 = NULL;
+       GdkGC *gc2 = NULL;
+       gint thickness_light;
+       gint thickness_dark;
+       gboolean interior_focus = FALSE;
+
+#if DEBUG
+               printf("draw_shadow: %s %d %d %d %d\n", detail, x, y, width, height);
+#endif
+
+       if (widget == NULL)
+       {
+               gdk_draw_rectangle (window, outer_gc, FALSE,
+                                   x, y, width - 1, height - 1);
+               return;
+       }
+
+       if ((width == -1) && (height == -1))
+               gdk_window_get_size (window, &width, &height);
+       else if (width == -1)
+               gdk_window_get_size (window, &width, NULL);
+       else if (height == -1)
+               gdk_window_get_size (window, NULL, &height);
+
+       cl_rectangle_reset (&r, style);
+
+       if (DETAIL ("frame") && widget->parent &&
+           GTK_IS_STATUSBAR (widget->parent))
+       {
+               gtk_style_apply_default_background (style, window,widget && !GTK_WIDGET_NO_WINDOW (widget),
+                                                   state_type, area, x, y, width, height);
+      
+               if (area)
+               {
+                       gdk_gc_set_clip_rectangle (clearlooks_style->shade_gc[3], area);
+                       gdk_gc_set_clip_rectangle (clearlooks_style->shade_gc[0], area);
+               }
+               
+               gdk_draw_line (window, clearlooks_style->shade_gc[3],
+                              x, y, x + width, y);
+               gdk_draw_line (window, clearlooks_style->shade_gc[0],
+                              x, y + 1, x + width, y + 1);
+               
+               if (area)
+               {
+                       gdk_gc_set_clip_rectangle (clearlooks_style->shade_gc[3], NULL);
+                       gdk_gc_set_clip_rectangle (clearlooks_style->shade_gc[0], NULL);
+               }
+       }
+       else if (detail && !strcmp (detail, "entry"))
+       {
+               if ( widget->parent && (GTK_IS_COMBO_BOX_ENTRY (widget->parent) ||
+                                       GTK_IS_SPIN_BUTTON(widget) ||
+                                       GTK_IS_COMBO (widget->parent)))
+               {
+                       cl_draw_combobox_entry (style, window, GTK_WIDGET_STATE(widget), shadow_type, area, widget, detail, x, y, width, height);
+               }
+               else
+               {
+                       cl_draw_entry (style, window, GTK_WIDGET_STATE(widget), shadow_type, area, widget, detail, x, y, width, height);
+               }
+       }
+       else if (DETAIL ("viewport") || DETAIL ("scrolled_window"))
+       {
+               gdk_draw_rectangle (window, clearlooks_style->shade_gc[4], FALSE,
+                                   x, y, width - 1, height - 1);
+       }
+       else
+       {
+               if (DETAIL ("menuitem"))
+                       outer_gc = clearlooks_style->spot3_gc;
+               else
+                       outer_gc = clearlooks_style->shade_gc[4];
+
+               if (shadow_type == GTK_SHADOW_IN)
+                       gdk_draw_rectangle (window, outer_gc, FALSE,
+                                           x, y, width - 1, height - 1);
+               else if (shadow_type == GTK_SHADOW_OUT)
+               {
+                       gdk_draw_rectangle (window, outer_gc, FALSE,
+                                           x, y, width - 1, height - 1);
+                       gdk_draw_line (window, style->light_gc[state_type],
+                                      x+1, y+1, x+width-2, y+1);
+                       gdk_draw_line (window, style->light_gc[state_type],
+                                      x+1, y+1, x+1, y+height-2);
+               }
+               else if (shadow_type == GTK_SHADOW_ETCHED_IN)
+               {
+                       GdkGC *a = clearlooks_style->shade_gc[(shadow_type == GTK_SHADOW_ETCHED_IN) ? 0 : 3];
+                       GdkGC *b = clearlooks_style->shade_gc[(shadow_type == GTK_SHADOW_ETCHED_IN) ? 3 : 0];
+       
+                       cl_rectangle_set_corners (&r, CL_CORNER_NONE, CL_CORNER_NONE,
+                                                     CL_CORNER_NONE, CL_CORNER_NONE);
+
+                       r.bordergc = a;
+                       cl_rectangle_set_clip_rectangle (&r, area);
+                       cl_draw_rectangle (window, widget, style, x+1, y+1, width-1, height-1, &r);
+                       cl_rectangle_reset_clip_rectangle (&r);
+       
+                       r.bordergc = b;
+                       cl_rectangle_set_clip_rectangle (&r, area);
+                       cl_draw_rectangle (window, widget, style, x, y, width-1, height-1, &r); 
+                       cl_rectangle_reset_clip_rectangle (&r);
+               }
+               else if (shadow_type == GTK_SHADOW_ETCHED_IN)
+               {
+                       GdkGC *a = clearlooks_style->shade_gc[(shadow_type == GTK_SHADOW_ETCHED_IN) ? 3 : 0];
+                       GdkGC *b = clearlooks_style->shade_gc[(shadow_type == GTK_SHADOW_ETCHED_IN) ? 0 : 3];
+       
+                       cl_rectangle_set_corners (&r, CL_CORNER_NONE, CL_CORNER_NONE,
+                                                     CL_CORNER_NONE, CL_CORNER_NONE);
+
+                       r.bordergc = a;
+                       cl_rectangle_set_clip_rectangle (&r, area);
+                       cl_draw_rectangle (window, widget, style, x+1, y+1, width-1, height-1, &r);
+                       cl_rectangle_reset_clip_rectangle (&r);
+       
+                       r.bordergc = b;
+                       cl_rectangle_set_clip_rectangle (&r, area);
+                       cl_draw_rectangle (window, widget, style, x, y, width-1, height-1, &r); 
+                       cl_rectangle_reset_clip_rectangle (&r);
+               }               
+               else
+                       parent_class->draw_shadow (style, window, state_type, shadow_type,
+                                                  area, widget, detail,
+                                                  x, y, width, height);
+       }
+}
+
+#define GDK_RECTANGLE_SET(rect,a,b,c,d) rect.x = a; \
+                                        rect.y = b; \
+                                        rect.width = c; \
+                                        rect.height = d;
+
+
+static void 
+draw_box_gap (DRAW_ARGS,
+             GtkPositionType gap_side,
+             gint            gap_x,
+             gint            gap_width)
+{
+       ClearlooksStyle *clearlooks_style = CLEARLOOKS_STYLE (style);
+       CLRectangle r;
+       
+       GdkRegion *area_region = NULL,
+                 *gap_region  = NULL;
+       GdkRectangle light_rect;
+       GdkRectangle dark_rect;
+
+#if DEBUG
+               printf("draw_box_gap: %s %d %d %d %d\n", detail, x, y, width, height);
+#endif
+       
+       g_return_if_fail (GTK_IS_STYLE (style));
+       g_return_if_fail (window != NULL);
+       
+       sanitize_size (window, &width, &height);
+
+       cl_rectangle_reset (&r, style);
+
+       r.bordergc = clearlooks_style->shade_gc[5];
+
+       r.topleft     = style->light_gc[state_type];
+       r.bottomright = clearlooks_style->shade_gc[1];
+
+       if (area)
+               area_region = gdk_region_rectangle (area);
+       else
+       {
+               GdkRectangle tmp = { x, y, width, height };
+               area_region = gdk_region_rectangle (&tmp);
+       }
+       
+       switch (gap_side)
+       {
+               case GTK_POS_TOP:
+               {
+                       GdkRectangle rect = { x+gap_x+1, y, gap_width-2, 2 };
+                       gap_region = gdk_region_rectangle (&rect);
+
+                       GDK_RECTANGLE_SET (light_rect, x+gap_x+1, y, x+gap_x+1, y+1);
+                       GDK_RECTANGLE_SET (dark_rect, x+gap_x+gap_width-2, y, x+gap_x+gap_width-2, y);
+                               
+                       cl_rectangle_set_corners (&r, CL_CORNER_NONE, CL_CORNER_NONE,
+                                                     CL_CORNER_ROUND, CL_CORNER_ROUND);
+
+                       break;
+               }
+               case GTK_POS_BOTTOM:
+               {
+                       GdkRectangle rect = { x+gap_x+1, y+height-2, gap_width-2, 2 };
+                       gap_region = gdk_region_rectangle (&rect);
+                               
+                       GDK_RECTANGLE_SET (light_rect, x+gap_x+1, y+height-2, x+gap_x+1, y+height-1);
+                       GDK_RECTANGLE_SET (dark_rect, x+gap_x+gap_width-2, y+height-2, x+gap_x+gap_width-2, y+height-1);
+
+                       cl_rectangle_set_corners (&r, CL_CORNER_ROUND, CL_CORNER_ROUND,
+                                                     CL_CORNER_NONE, CL_CORNER_NONE);
+
+                       break;
+               }
+               case GTK_POS_LEFT:
+               {
+                       GdkRectangle rect = { x, y+gap_x+1, 2, gap_width-2 };
+                       gap_region = gdk_region_rectangle (&rect);
+                               
+                       GDK_RECTANGLE_SET (light_rect, x, y+gap_x+1, x+1, y+gap_x+1);
+                       GDK_RECTANGLE_SET (dark_rect, x, y+gap_x+gap_width-2, x, y+gap_x+gap_width-2);
+
+                       cl_rectangle_set_corners (&r, CL_CORNER_NONE, CL_CORNER_ROUND,
+                                                     CL_CORNER_NONE, CL_CORNER_ROUND);
+                       break;
+               }               
+               case GTK_POS_RIGHT:
+               {
+                       GdkRectangle rect = { x+width-2, y+gap_x+1, 2, gap_width-2 };
+                       gap_region = gdk_region_rectangle (&rect);
+                               
+                       GDK_RECTANGLE_SET (light_rect, x+width-2, y+gap_x+1, x+width-1, y+gap_x+1);
+                       GDK_RECTANGLE_SET (dark_rect, x+width-2, y+gap_x+gap_width-2, x+width-1, y+gap_x+gap_width-2);
+
+                       cl_rectangle_set_corners (&r, CL_CORNER_ROUND, CL_CORNER_NONE,
+                                                     CL_CORNER_ROUND, CL_CORNER_NONE);
+                       break;
+               }               
+       }
+               
+       gdk_region_subtract (area_region, gap_region);
+               
+       gdk_gc_set_clip_region (r.bordergc,    area_region);
+       gdk_gc_set_clip_region (r.topleft,     area_region);
+       gdk_gc_set_clip_region (r.bottomright, area_region);
+       
+       gdk_region_destroy (area_region);
+       gdk_region_destroy (gap_region);
+       
+       gdk_draw_rectangle (window, style->bg_gc[state_type], TRUE, x, y, width, height);
+
+       cl_draw_rectangle (window, widget, style, x, y, width, height, &r);
+
+       cl_draw_shadow (window, widget, style, x, y, width, height, &r); 
+
+       gdk_gc_set_clip_region (r.bordergc,    NULL);
+       gdk_gc_set_clip_region (r.topleft,     NULL);
+       gdk_gc_set_clip_region (r.bottomright, NULL);
+       
+       /* it's a semi hack */
+       gdk_draw_line (window, style->light_gc[state_type],
+                      light_rect.x, light_rect.y,
+                      light_rect.width, light_rect.height);
+               
+       gdk_draw_line (window, clearlooks_style->shade_gc[1],
+                      dark_rect.x, dark_rect.y,
+                      dark_rect.width, dark_rect.height);
+}
+
+/**************************************************************************/
+
+static void
+draw_extension (DRAW_ARGS, GtkPositionType gap_side)
+{
+       ClearlooksStyle *clearlooks_style = CLEARLOOKS_STYLE (style);
+       int              my_state_type = (state_type == GTK_STATE_ACTIVE) ? 2 : 0;
+       CLRectangle      r;
+
+#if DEBUG
+               printf("draw_extension: %s %d %d %d %d\n", detail, x, y, width, height);
+#endif
+
+       g_return_if_fail (GTK_IS_STYLE (style));
+       g_return_if_fail (window != NULL);
+       
+       sanitize_size (window, &width, &height);
+       
+       if (DETAIL ("tab"))
+       {
+               GdkRectangle new_area;
+               GdkColor tmp_color;
+
+               cl_rectangle_set_button (&r, style, state_type, FALSE, FALSE,
+                                                               CL_CORNER_ROUND, CL_CORNER_ROUND,
+                                                               CL_CORNER_ROUND, CL_CORNER_ROUND);
+               
+               if (state_type == GTK_STATE_ACTIVE)
+                       shade (&style->bg[state_type], &tmp_color, 1.08);
+               else
+                       shade (&style->bg[state_type], &tmp_color, 1.05);
+               
+               if (area)
+               {
+                       new_area = *area;
+               }
+               else
+               {
+                       new_area.x = x;
+                       new_area.y = y;
+                       new_area.width = width;
+                       new_area.height = height;
+               }
+               
+               switch (gap_side)
+               {
+                       case GTK_POS_BOTTOM:
+                               height+=2;
+                               new_area.y = y;
+                               new_area.height = height-2;
+                               r.gradient_type = CL_GRADIENT_VERTICAL;
+                               cl_rectangle_set_gradient (&r.fill_gradient, &tmp_color, &style->bg[state_type]);
+                               cl_rectangle_set_gradient (&r.border_gradient,
+                                              &clearlooks_style->border[CL_BORDER_UPPER+my_state_type],
+                                              &clearlooks_style->border[CL_BORDER_LOWER+my_state_type]);
+                               break;
+                       case GTK_POS_TOP:
+                               y-=2;
+                               height+=2;
+                               new_area.y = y+2;
+                               new_area.height = height;
+                               r.gradient_type = CL_GRADIENT_VERTICAL;
+                               cl_rectangle_set_gradient (&r.fill_gradient, &style->bg[state_type], &tmp_color);
+                               cl_rectangle_set_gradient (&r.border_gradient,
+                                              &clearlooks_style->border[CL_BORDER_LOWER+my_state_type],
+                                              &clearlooks_style->border[CL_BORDER_UPPER+my_state_type]);
+                               break;
+                       case GTK_POS_LEFT:
+                               x-=2;
+                               width+=2;
+                               new_area.x = x+2;
+                               new_area.width = width;
+                               r.gradient_type = CL_GRADIENT_HORIZONTAL;
+                               cl_rectangle_set_gradient (&r.fill_gradient, &style->bg[state_type], &tmp_color);
+                               cl_rectangle_set_gradient (&r.border_gradient,
+                                              &clearlooks_style->border[CL_BORDER_LOWER+my_state_type],
+                                              &clearlooks_style->border[CL_BORDER_UPPER+my_state_type]);
+                               break;
+                       case GTK_POS_RIGHT:
+                               width+=2;
+                               new_area.x = x;
+                               new_area.width = width-2;
+                               r.gradient_type = CL_GRADIENT_HORIZONTAL;
+                               cl_rectangle_set_gradient (&r.fill_gradient, &tmp_color, &style->bg[state_type]);
+                               cl_rectangle_set_gradient (&r.border_gradient,
+                                              &clearlooks_style->border[CL_BORDER_UPPER+my_state_type],
+                                              &clearlooks_style->border[CL_BORDER_LOWER+my_state_type]);
+                               break;
+               }
+               
+               r.topleft = style->light_gc[state_type];                
+               r.bottomright = (state_type == GTK_STATE_NORMAL) ? clearlooks_style->shade_gc[1] : NULL;
+
+               cl_rectangle_set_clip_rectangle (&r, &new_area);
+               cl_draw_rectangle (window, widget, style, x, y, width, height, &r);
+               cl_draw_shadow (window, widget, style, x, y, width, height, &r);
+               cl_rectangle_reset_clip_rectangle (&r);
+               
+               /* draw the selection stripe */
+               if (state_type != GTK_STATE_ACTIVE) {
+                       cl_rectangle_set_gradient (&r.fill_gradient, NULL, NULL);
+                       r.fillgc = clearlooks_style->spot2_gc;
+                       
+                       switch (gap_side)
+                       {
+                               case GTK_POS_BOTTOM:
+                                       cl_rectangle_set_corners (&r, CL_CORNER_ROUND, CL_CORNER_ROUND,
+                                                                     CL_CORNER_NONE, CL_CORNER_NONE);
+                                       cl_rectangle_set_gradient (&r.border_gradient, &clearlooks_style->spot3, &clearlooks_style->spot2);
+                                       r.gradient_type = CL_GRADIENT_VERTICAL;
+
+                                       cl_rectangle_set_clip_rectangle (&r, &new_area);
+                                       cl_draw_rectangle (window, widget, style, x, y, width, 3, &r);
+                                       cl_rectangle_reset_clip_rectangle (&r);
+                                       break;
+                               case GTK_POS_TOP:
+                                       cl_rectangle_set_corners (&r, CL_CORNER_NONE, CL_CORNER_NONE,
+                                                                     CL_CORNER_ROUND, CL_CORNER_ROUND);
+                                       cl_rectangle_set_gradient (&r.border_gradient, &clearlooks_style->spot2, &clearlooks_style->spot3);
+                                       r.gradient_type = CL_GRADIENT_VERTICAL;
+
+                                       cl_rectangle_set_clip_rectangle (&r, &new_area);
+                                       cl_draw_rectangle (window, widget, style, x, y + height - 3, width, 3, &r);
+                                       cl_rectangle_reset_clip_rectangle (&r);
+                                       break;
+                               case GTK_POS_LEFT:
+                                       cl_rectangle_set_corners (&r, CL_CORNER_NONE, CL_CORNER_ROUND,
+                                                                     CL_CORNER_NONE, CL_CORNER_ROUND);
+                                       cl_rectangle_set_gradient (&r.border_gradient, &clearlooks_style->spot2, &clearlooks_style->spot3);
+                                       r.gradient_type = CL_GRADIENT_HORIZONTAL;
+
+                                       cl_rectangle_set_clip_rectangle (&r, &new_area);
+                                       cl_draw_rectangle (window, widget, style, x + width - 3, y, 3, height, &r);
+                                       cl_rectangle_reset_clip_rectangle (&r);
+                                       break;
+                               case GTK_POS_RIGHT:
+                                       cl_rectangle_set_corners (&r, CL_CORNER_ROUND, CL_CORNER_NONE,
+                                                                     CL_CORNER_ROUND, CL_CORNER_NONE);
+                                       cl_rectangle_set_gradient (&r.border_gradient, &clearlooks_style->spot3, &clearlooks_style->spot2);
+                                       r.gradient_type = CL_GRADIENT_HORIZONTAL;
+                               
+                                       cl_rectangle_set_clip_rectangle (&r, &new_area);
+                                       cl_draw_rectangle (window, widget, style, x, y, 3, height, &r);
+                                       cl_rectangle_reset_clip_rectangle (&r);
+                                       break;
+                       }
+               }
+               
+
+       }
+       else
+       {
+               parent_class->draw_extension (style, window, state_type, shadow_type, area,
+                                             widget, detail, x, y, width, height,
+                                             gap_side);
+       }
+}
+    
+
+/**************************************************************************/
+
+static void 
+draw_handle (DRAW_ARGS, GtkOrientation orientation)
+{
+       ClearlooksStyle *clearlooks_style = CLEARLOOKS_STYLE (style);
+       gint xx, yy;
+       gint xthick, ythick;
+       GdkGC *light_gc, *dark_gc;
+       GdkRectangle rect;
+       GdkRectangle dest;
+       gint intersect;
+       gint h;
+       int i;
+       int n_lines;
+       int offset;
+       
+#if DEBUG
+               printf("draw_handle: %s %d %d %d %d\n", detail, x, y, width, height);
+#endif
+
+       g_return_if_fail (GTK_IS_STYLE (style));
+       g_return_if_fail (window != NULL);
+       
+       sanitize_size (window, &width, &height);
+       
+       if (state_type == GTK_STATE_PRELIGHT)
+               gtk_style_apply_default_background (style, window,
+                                         widget && !GTK_WIDGET_NO_WINDOW (widget),
+                                         state_type, area, x, y, width, height);
+
+       /* orientation is totally bugged, but this actually works... */
+       orientation = (width > height) ? GTK_ORIENTATION_HORIZONTAL : GTK_ORIENTATION_VERTICAL;
+
+       if (!strcmp (detail, "paned"))
+       {
+               /* we want to ignore the shadow border in paned widgets */
+               xthick = 0;
+               ythick = 0;
+       }
+       else
+       {
+               xthick = style->xthickness;
+               ythick = style->ythickness;
+       }
+
+       if ( ((DETAIL ("handlebox") && widget && GTK_IS_HANDLE_BOX (widget)) || DETAIL ("dockitem")) &&
+            orientation == GTK_ORIENTATION_VERTICAL )
+       {
+               /* The line in the toolbar */
+       
+               light_gc = style->light_gc[state_type];
+               dark_gc = clearlooks_style->shade_gc[3];
+               
+               if (area)
+               {
+                       gdk_gc_set_clip_rectangle (light_gc, area);
+                       gdk_gc_set_clip_rectangle (dark_gc, area);
+               }
+     
+               if (area)
+               {
+                       gdk_gc_set_clip_rectangle (light_gc, NULL);
+                       gdk_gc_set_clip_rectangle (dark_gc, NULL);
+               }
+
+               if (area)
+               {
+                       gdk_gc_set_clip_rectangle (clearlooks_style->shade_gc[0], area);
+                       gdk_gc_set_clip_rectangle (clearlooks_style->shade_gc[3], area);
+               }
+      
+               gdk_draw_line (window, clearlooks_style->shade_gc[0], x, y, x + width, y);
+               gdk_draw_line (window, clearlooks_style->shade_gc[3], x, y + height - 1, x + width, y + height - 1);
+                       
+               if (area)
+               {
+                       gdk_gc_set_clip_rectangle (clearlooks_style->shade_gc[0], NULL);
+                       gdk_gc_set_clip_rectangle (clearlooks_style->shade_gc[3], NULL);
+               }
+       }
+       
+       light_gc = clearlooks_style->shade_gc[0];
+       dark_gc = clearlooks_style->shade_gc[4];
+
+       rect.x = x + xthick;
+       rect.y = y + ythick;
+       rect.width = width - (xthick * 2);
+       rect.height = height - (ythick * 2);
+       
+       if (area)
+               intersect = gdk_rectangle_intersect (area, &rect, &dest);
+       else
+       {
+               intersect = TRUE;
+               dest = rect;
+       }
+
+       if (!intersect)
+               return;
+
+       gdk_gc_set_clip_rectangle (light_gc, &dest);
+       gdk_gc_set_clip_rectangle (dark_gc, &dest);
+       
+       n_lines = (!strcmp (detail, "paned")) ? 21 : 11;
+
+       if (orientation == GTK_ORIENTATION_VERTICAL)
+       {       
+               h = width - 2 * xthick;
+               h = MAX (3, h - 6);
+               
+               xx = x + (width - h) / 2;
+               offset = (height - 2*ythick - 2*n_lines)/2 + 1;
+               if (offset < 0)
+                       offset = 0;
+                       
+               for (i = 0, yy = y + ythick + offset; yy <= (y + height - ythick - 1) && i < n_lines; yy += 2, i++)
+               {
+                       gdk_draw_line (window, dark_gc, xx, yy, xx + h, yy);
+                       gdk_draw_line (window, light_gc, xx, yy + 1, xx + h, yy + 1);
+               }
+       }
+       else
+       {
+               h = height - 2 * ythick;
+               h = MAX (3, h - 6);
+               
+               yy = y + (height - h) / 2;
+               offset = (width - 2*xthick - 2*n_lines)/2 + 1;
+               if (offset < 0)
+                       offset = 0;
+               
+               for (i = 0, xx = x + xthick + offset;  i < n_lines; xx += 2, i++)
+               {
+                       gdk_draw_line (window, dark_gc, xx, yy, xx, yy + h);
+                       gdk_draw_line (window, light_gc, xx + 1, yy, xx + 1, yy + h);
+               }
+       }
+
+       gdk_gc_set_clip_rectangle (light_gc, NULL);
+       gdk_gc_set_clip_rectangle (dark_gc, NULL);
+}
+
+/**************************************************************************/
+
+static void
+draw_box (DRAW_ARGS)
+{
+       ClearlooksStyle *clearlooks_style = CLEARLOOKS_STYLE (style);
+       CLRectangle r;
+       gboolean false_size = FALSE;
+
+#ifdef DEBUG
+               printf("draw_box: %s %d %d %d %d\n", detail, x, y, width, height);
+#endif
+       
+       g_return_if_fail (style != NULL);
+       g_return_if_fail (window != NULL);
+
+       if (width == -1 || height == -1)
+               false_size = TRUE;
+               
+       if ((width == -1) && (height == -1))
+               gdk_window_get_size (window, &width, &height);
+       else if (width == -1)
+               gdk_window_get_size (window, &width, NULL);
+       else if (height == -1)
+               gdk_window_get_size (window, NULL, &height);
+
+       cl_rectangle_reset (&r, style);
+
+       if (widget == NULL)
+               return;
+       
+       /* listview headers */
+       if (widget && DETAIL ("button") && widget->parent &&
+                (GTK_IS_TREE_VIEW(widget->parent) ||
+                 GTK_IS_CLIST (widget->parent) ||
+                         strcmp(G_OBJECT_TYPE_NAME (widget->parent), "ETree") == 0))
+       {
+               cl_draw_treeview_header (style, window, state_type, shadow_type,
+                                        area, widget, detail, x, y, width, height);
+       }
+       else if (detail && (!strcmp (detail, "button") ||
+                               !strcmp (detail, "buttondefault")))
+       {
+               if (GTK_IS_COMBO_BOX_ENTRY(widget->parent) || GTK_IS_COMBO(widget->parent))
+               {
+                       cl_draw_combobox_button (style, window, state_type, shadow_type,
+                                                area, widget,
+                                            detail, x, y, width, height);
+               }
+               else
+               {
+                       cl_draw_button (style, window, state_type, shadow_type, area, widget,
+                                   detail, x, y, width, height);
+               }
+       }
+       else if (detail && (
+                !strcmp (detail, "spinbutton_up") ||
+                !strcmp (detail, "spinbutton_down") ||
+                !strcmp (detail, "spinbutton")))
+       {               
+               cl_draw_spinbutton (style, window, state_type, shadow_type, area,
+                                   widget, detail, x, y, width, height);
+       }
+       else if (detail && (
+                    !strcmp (detail, "hscale") || !strcmp (detail, "vscale")))
+       {
+               cl_rectangle_set_button (&r, style, state_type,
+                               GTK_WIDGET_HAS_DEFAULT  (widget), GTK_WIDGET_HAS_FOCUS (widget),
+                               CL_CORNER_ROUND, CL_CORNER_ROUND,
+                               CL_CORNER_ROUND, CL_CORNER_ROUND);
+
+               if (!strcmp (detail, "hscale") || !strcmp (detail, "vscale"))
+               {
+                       r.fill_gradient.to = &clearlooks_style->shade[2];
+                       r.bottomright = clearlooks_style->shade_gc[2];
+               }
+               
+               cl_set_corner_sharpness (detail, widget, &r);
+
+               if (!strcmp (detail, "spinbutton_up"))
+               {
+                       r.border_gradient.to = r.border_gradient.from;
+                       height++;
+                       gtk_style_apply_default_background (style, window, FALSE, state_type,
+                                                           area, x, y, width, height);
+               }
+               else if (!strcmp (detail, "spinbutton_down"))
+               {
+                       r.border_gradient.to = r.border_gradient.from;
+                       gtk_style_apply_default_background (style, window, FALSE, state_type,
+                                                           area, x, y, width, height);
+               }
+       
+               cl_rectangle_set_clip_rectangle (&r, area);     
+               cl_draw_rectangle (window, widget, style, x+1, y+1, width-2, height-2, &r);
+               cl_draw_shadow (window, widget, style, x+1, y+1, width-2, height-2, &r);
+               cl_rectangle_reset_clip_rectangle (&r);         
+       }
+       else if (DETAIL ("trough") && GTK_IS_PROGRESS_BAR (widget))
+       {
+               GdkPoint points[4] = { {x,y}, {x+width-1,y}, {x,y+height-1}, {x+width-1,y+height-1} };
+               
+               gdk_draw_points (window, style->bg_gc[state_type], points, 4);
+               
+               r.bordergc = clearlooks_style->shade_gc[5];
+               r.fillgc   = clearlooks_style->shade_gc[2];
+                       
+               cl_rectangle_set_corners (&r, CL_CORNER_NARROW, CL_CORNER_NARROW,
+                                                 CL_CORNER_NARROW, CL_CORNER_NARROW);
+               
+               cl_rectangle_set_clip_rectangle (&r, area);
+               cl_draw_rectangle (window, widget, style, x, y, width, height, &r);
+               cl_rectangle_reset_clip_rectangle (&r);
+       }
+       else if (DETAIL ("trough") &&
+                    (GTK_IS_VSCALE (widget) || GTK_IS_HSCALE (widget)))
+       {
+               GdkGC   *inner  = clearlooks_style->shade_gc[3],
+                       *outer  = clearlooks_style->shade_gc[5],
+                           *shadow = clearlooks_style->shade_gc[4];
+               GdkColor upper_color = *clearlooks_get_spot_color (CLEARLOOKS_RC_STYLE (style->rc_style)),
+                                lower_color;
+               
+               GtkAdjustment *adjustment = gtk_range_get_adjustment (GTK_RANGE (widget));
+               
+               GtkOrientation orientation = GTK_RANGE (widget)->orientation;
+               
+               gint fill_size = (orientation ? height : width) * 
+                                (1 / ((adjustment->upper - adjustment->lower) / 
+                                     (adjustment->value - adjustment->lower)));
+
+               if (orientation == GTK_ORIENTATION_HORIZONTAL)
+               {
+                       y += (height - SCALE_SIZE) / 2;
+                       height = SCALE_SIZE;
+               }
+               else
+               {
+                       x += (width - SCALE_SIZE) / 2;
+                       width = SCALE_SIZE;
+               }
+               
+               if (state_type == GTK_STATE_INSENSITIVE)
+               {
+                       outer  = clearlooks_style->shade_gc[4];
+                       inner  = clearlooks_style->shade_gc[2];
+                       shadow = clearlooks_style->shade_gc[3];
+               }
+               
+               cl_rectangle_init (&r, inner, outer, CL_CORNER_NONE, CL_CORNER_NONE, 
+                                                    CL_CORNER_NONE, CL_CORNER_NONE );
+               
+               r.topleft = shadow;
+               
+               cl_rectangle_set_clip_rectangle (&r, area);     
+               cl_draw_rectangle (window, widget, style, x, y, width, height, &r);
+               cl_draw_shadow (window, widget, style, x, y, width, height, &r);
+               cl_rectangle_reset_clip_rectangle (&r); 
+
+               /* DRAW FILL */
+               shade (&upper_color, &lower_color, 1.3);
+               
+               r.bordergc = clearlooks_style->spot3_gc;
+               r.fillgc   = style->bg_gc[state_type];
+               
+               r.gradient_type = (orientation == GTK_ORIENTATION_HORIZONTAL ) ? CL_GRADIENT_VERTICAL
+                                                                                                                                          : CL_GRADIENT_HORIZONTAL;
+               
+               cl_rectangle_set_gradient (&r.fill_gradient, &upper_color, &lower_color);
+               
+               cl_rectangle_set_clip_rectangle (&r, area);     
+               if (orientation == GTK_ORIENTATION_HORIZONTAL && fill_size > 1)
+               {
+                       if (gtk_range_get_inverted(GTK_RANGE(widget)) != (get_direction(widget) == GTK_TEXT_DIR_RTL))
+                               cl_draw_rectangle (window, widget, style, x+width-fill_size, y, fill_size, height, &r);
+                       else
+                               cl_draw_rectangle (window, widget, style, x, y, fill_size, height, &r);                         
+               }
+               else if (fill_size > 1)
+               {
+                       if (gtk_range_get_inverted (GTK_RANGE (widget)))
+                               cl_draw_rectangle (window, widget, style, x, y+height-fill_size, width, fill_size, &r);
+                       else
+                               cl_draw_rectangle (window, widget, style, x, y, width, fill_size, &r);                  
+               }
+               cl_rectangle_reset_clip_rectangle (&r); 
+       }
+       else if (DETAIL ("trough"))
+       {
+               GdkGC *inner  = clearlooks_style->shade_gc[3],
+                     *outer  = clearlooks_style->shade_gc[5];  
+               
+               cl_rectangle_init (&r, inner, outer, CL_CORNER_NONE, CL_CORNER_NONE, 
+                                                    CL_CORNER_NONE, CL_CORNER_NONE );
+               
+               if (GTK_RANGE (widget)->orientation == GTK_ORIENTATION_VERTICAL)
+               {
+                       y+=1;
+                       height-=2;
+               }
+               else
+               {
+                       x+=1;
+                       width-=2;
+               }
+               
+               cl_rectangle_set_clip_rectangle (&r, area);
+               cl_draw_rectangle (window, widget, style, x, y, width, height, &r);
+               cl_rectangle_reset_clip_rectangle (&r);
+       }
+       else if (detail && (!strcmp (detail, "vscrollbar") ||
+                           !strcmp (detail, "hscrollbar") ||
+                           !strcmp (detail, "stepper")))
+       {
+               ClScrollButtonType button_type = CL_SCROLLBUTTON_OTHER;
+               gboolean horizontal = TRUE;
+
+               if (GTK_IS_VSCROLLBAR(widget))
+               {
+                       if (y == widget->allocation.y)
+                               button_type = CL_SCROLLBUTTON_BEGIN;
+                       else if (y+height == widget->allocation.y+widget->allocation.height)
+                               button_type = CL_SCROLLBUTTON_END;
+
+                       horizontal = FALSE;
+               }
+               else if (GTK_IS_HSCROLLBAR(widget))
+               {
+                       if (x == widget->allocation.x)
+                               button_type = CL_SCROLLBUTTON_BEGIN;
+                       else if (x+width == widget->allocation.x+widget->allocation.width)
+                               button_type = CL_SCROLLBUTTON_END;
+               }
+
+               cl_rectangle_set_button (&r, style, state_type, FALSE, FALSE, 0,0,0,0);
+               
+               cl_rectangle_set_gradient (&r.fill_gradient, NULL, NULL);
+               cl_rectangle_set_gradient (&r.fill_gradient, &clearlooks_style->inset_light[state_type],
+                                          &clearlooks_style->inset_dark[state_type]);
+       
+               
+               r.gradient_type = horizontal ? CL_GRADIENT_VERTICAL
+                                            : CL_GRADIENT_HORIZONTAL;
+               
+               r.bottomright = clearlooks_style->shade_gc[1];
+               r.border_gradient.to = r.border_gradient.from;
+               
+               if (button_type == CL_SCROLLBUTTON_OTHER)
+               {
+                       cl_rectangle_set_corners (&r, CL_CORNER_NONE, CL_CORNER_NONE,
+                                                     CL_CORNER_NONE, CL_CORNER_NONE);
+               }
+               else if (button_type == CL_SCROLLBUTTON_BEGIN)
+               {
+                       if (horizontal)
+                               cl_rectangle_set_corners (&r, CL_CORNER_ROUND, CL_CORNER_NONE,
+                                                                                         CL_CORNER_ROUND, CL_CORNER_NONE);
+                       else
+                               cl_rectangle_set_corners (&r, CL_CORNER_ROUND, CL_CORNER_ROUND,
+                                                                                         CL_CORNER_NONE,  CL_CORNER_NONE);
+               }
+               else
+               {
+                       if (horizontal)
+                               cl_rectangle_set_corners (&r, CL_CORNER_NONE,  CL_CORNER_ROUND,
+                                                                                         CL_CORNER_NONE,  CL_CORNER_ROUND);
+                       else
+                               cl_rectangle_set_corners (&r, CL_CORNER_NONE,  CL_CORNER_NONE,
+                                                                                         CL_CORNER_ROUND, CL_CORNER_ROUND);
+               }
+               
+               cl_rectangle_set_clip_rectangle (&r, area);     
+               cl_draw_rectangle (window, widget, style, x, y, width, height, &r);
+               cl_draw_shadow (window, widget, style, x, y, width, height, &r);
+               cl_rectangle_reset_clip_rectangle (&r); 
+
+       }
+       else if (DETAIL ("slider"))
+       {
+               if (DETAIL("slider") && widget && GTK_IS_RANGE (widget))
+               {
+                       GtkAdjustment *adj = GTK_RANGE (widget)->adjustment;
+                       
+                       if (adj->value <= adj->lower &&
+                               (GTK_RANGE (widget)->has_stepper_a || GTK_RANGE (widget)->has_stepper_b))
+                       {
+                               if (GTK_IS_VSCROLLBAR (widget))
+                               {
+                                       y-=1;
+                                       height+=1;
+                               }
+                               else if (GTK_IS_HSCROLLBAR (widget))
+                               {
+                                       x-=1;
+                                       width+=1;
+                               }
+                       }
+                       if (adj->value >= adj->upper - adj->page_size &&
+                           (GTK_RANGE (widget)->has_stepper_c || GTK_RANGE (widget)->has_stepper_d))
+                       {
+                               if (GTK_IS_VSCROLLBAR (widget))
+                                       height+=1;
+                               else if (GTK_IS_HSCROLLBAR (widget))
+                                       width+=1;
+                       }
+               }
+                       
+               cl_rectangle_set_button (&r, style, state_type, FALSE, GTK_WIDGET_HAS_FOCUS (widget),
+                                       CL_CORNER_NONE, CL_CORNER_NONE,
+                                       CL_CORNER_NONE, CL_CORNER_NONE);
+               
+               r.gradient_type = GTK_IS_HSCROLLBAR (widget) ? CL_GRADIENT_VERTICAL
+                                                            : CL_GRADIENT_HORIZONTAL;
+
+               cl_rectangle_set_gradient (&r.fill_gradient, &clearlooks_style->inset_light[state_type],
+                                          &clearlooks_style->inset_dark[state_type]);
+
+               r.bottomright = clearlooks_style->shade_gc[1];
+               r.border_gradient.to = r.border_gradient.from;
+               
+               cl_rectangle_set_clip_rectangle (&r, area);     
+               cl_draw_rectangle (window, widget, style, x, y, width, height, &r);
+               cl_draw_shadow (window, widget, style, x, y, width, height, &r);
+               cl_rectangle_reset_clip_rectangle (&r); 
+       }
+       else if (detail && !strcmp (detail, "optionmenu")) /* supporting deprecated */
+       {
+               cl_draw_optionmenu(style, window, state_type, shadow_type, area, widget, detail, x, y, width, height);
+       }
+       else if (DETAIL ("menuitem"))
+       {
+               if (clearlooks_style->menuitemstyle == 0)
+               {
+                       cl_draw_menuitem_flat (window, widget, style, area, state_type,
+                                              x, y, width, height, &r);                        
+               }
+               else if (clearlooks_style->menuitemstyle == 1)
+               {
+                       cl_draw_menuitem_gradient (window, widget, style, area, state_type,
+                                                  x, y, width, height, &r);
+               }
+               else
+               {
+                       cl_draw_menuitem_button (window, widget, style, area, state_type,
+                                                x, y, width, height, &r);
+               }
+       }
+       else if (DETAIL ("menubar") && (clearlooks_style->sunkenmenubar || clearlooks_style->menubarstyle > 0))
+       {
+               GdkGC *dark = clearlooks_style->shade_gc[2];
+               GdkColor upper_color, lower_color;
+               
+               /* don't draw sunken menubar on gnome panel
+                  IT'S A HACK! HORRIBLE HACK! HIDEOUS HACK!
+                  BUT IT WORKS FOR ME(tm)! */
+               if (widget->parent &&
+                       strcmp(G_OBJECT_TYPE_NAME (widget->parent), "PanelWidget") == 0)
+                       return;
+               
+               shade(&style->bg[state_type], &upper_color, 1.0);
+               shade(&style->bg[state_type], &lower_color, 0.95);
+       
+               cl_rectangle_set_corners (&r, CL_CORNER_NONE, CL_CORNER_NONE,
+                                             CL_CORNER_NONE, CL_CORNER_NONE);
+               
+               r.fillgc = style->bg_gc[state_type];
+               r.bordergc = clearlooks_style->shade_gc[2];
+               r.gradient_type = CL_GRADIENT_VERTICAL;
+               
+               cl_rectangle_set_gradient (&r.border_gradient, &clearlooks_style->shade[2],
+                                                              &clearlooks_style->shade[3]);
+               cl_rectangle_set_gradient (&r.fill_gradient, &upper_color, &lower_color);
+               
+               /* make vertical and top borders invisible for style 2 */
+               if (clearlooks_style->menubarstyle == 2) {
+                       x--; width+=2;
+                       y--; height+=1;
+               }
+               
+               cl_rectangle_set_clip_rectangle (&r, area);
+               cl_draw_rectangle (window, widget, style, x, y, width, height, &r);
+               cl_rectangle_reset_clip_rectangle (&r);
+       }
+       else if (DETAIL ("menu") && widget->parent &&
+                GDK_IS_WINDOW (widget->parent->window))
+       {       
+               cl_rectangle_set_corners (&r, CL_CORNER_NONE, CL_CORNER_NONE,
+                                             CL_CORNER_NONE, CL_CORNER_NONE);
+               
+               r.bordergc    = clearlooks_style->border_gc[CL_BORDER_UPPER];
+               r.topleft     = style->light_gc[state_type];
+               r.bottomright = clearlooks_style->shade_gc[1];
+               
+               cl_rectangle_set_clip_rectangle (&r, area);
+               cl_draw_rectangle (window, widget, style, x, y, width, height, &r);
+               cl_draw_shadow (window, widget, style, x, y, width, height, &r);
+               cl_rectangle_reset_clip_rectangle (&r); 
+
+               return;
+       }
+       else if (DETAIL ("bar") && widget && GTK_IS_PROGRESS_BAR (widget))
+       {
+               GdkColor upper_color = *clearlooks_get_spot_color (CLEARLOOKS_RC_STYLE (style->rc_style)),
+                        lower_color,
+                        prev_foreground;
+               gboolean activity_mode = GTK_PROGRESS (widget)->activity_mode;
+               
+#ifdef HAVE_ANIMATION
+               if (!activity_mode && gtk_progress_bar_get_fraction (widget) != 1.0 &&
+                       !cl_progressbar_known((gconstpointer)widget))
+               {
+                       cl_progressbar_add ((gpointer)widget);
+               }
+#endif         
+               cl_progressbar_fill (window, widget, style, style->black_gc,
+                                    x, y, width, height,
+#ifdef HAVE_ANIMATION
+                                    activity_mode ? 0 : pboffset,
+#else
+                                    0,         
+#endif
+                                    area);
+               
+               cl_rectangle_set_corners (&r, CL_CORNER_NONE, CL_CORNER_NONE,
+                                             CL_CORNER_NONE, CL_CORNER_NONE);
+               
+               r.bordergc = clearlooks_style->spot3_gc;
+               r.topleft = clearlooks_style->spot2_gc;
+               
+               prev_foreground = cl_gc_set_fg_color_shade (clearlooks_style->spot2_gc,
+                                                           style->colormap,
+                                                           &clearlooks_style->spot2,
+                                                           1.2);
+
+               cl_rectangle_set_clip_rectangle (&r, area);
+               cl_draw_rectangle (window, widget, style, x, y, width, height, &r);
+               cl_draw_shadow (window, widget, style, x, y, width, height, &r);
+               cl_rectangle_reset_clip_rectangle (&r);
+               
+               gdk_gc_set_foreground (clearlooks_style->spot2_gc, &prev_foreground);
+       }
+
+       else if ( widget && (DETAIL ("menubar") || DETAIL ("toolbar") || DETAIL ("dockitem_bin") || DETAIL ("handlebox_bin")) && shadow_type != GTK_SHADOW_NONE) /* Toolbars and menus */
+       {
+               if (area)
+               {
+                       gdk_gc_set_clip_rectangle (clearlooks_style->shade_gc[0], area);
+                       gdk_gc_set_clip_rectangle (clearlooks_style->shade_gc[3], area);
+               }
+               
+               gtk_style_apply_default_background (style, window,
+                               widget && !GTK_WIDGET_NO_WINDOW (widget),
+                               state_type, area, x, y, width, height);
+               
+               /* we only want the borders on horizontal toolbars */
+               if ( DETAIL ("menubar") || height < 2*width ) { 
+                       if (!DETAIL ("menubar"))
+                               gdk_draw_line (window, clearlooks_style->shade_gc[0],
+                                              x, y, x + width, y); /* top */
+                                                       
+                       gdk_draw_line (window, clearlooks_style->shade_gc[3],
+                                      x, y + height - 1, x + width, y + height - 1); /* bottom */
+               }
+               
+               if (area)
+               {
+                       gdk_gc_set_clip_rectangle (clearlooks_style->shade_gc[0], NULL);
+                       gdk_gc_set_clip_rectangle (clearlooks_style->shade_gc[3], NULL);
+               }
+       }
+       else
+       {
+               parent_class->draw_box (style, window, state_type, shadow_type, area,
+                                       widget, detail, x, y, width, height);
+       }
+}
+
+/**************************************************************************/
+
+static void
+ensure_check_pixmaps (GtkStyle     *style,
+                      GtkStateType  state,
+                      GdkScreen    *screen,
+                      gboolean      treeview)
+{
+       ClearlooksStyle *clearlooks_style = CLEARLOOKS_STYLE (style);
+       ClearlooksRcStyle *clearlooks_rc = CLEARLOOKS_RC_STYLE (style->rc_style);
+       GdkPixbuf *check, *base, *inconsistent, *composite;
+       GdkColor *spot_color = clearlooks_get_spot_color (clearlooks_rc);
+       
+       if (clearlooks_style->check_pixmap_nonactive[state] != NULL)
+               return;
+       
+       if (state == GTK_STATE_ACTIVE || state == GTK_STATE_SELECTED) {
+               check = generate_bit (check_alpha, &style->text[GTK_STATE_NORMAL], 1.0);
+               inconsistent = generate_bit (check_inconsistent_alpha, &style->text[GTK_STATE_NORMAL], 1.0);
+       } else {
+               check = generate_bit (check_alpha, &style->text[state], 1.0);
+               inconsistent = generate_bit (check_inconsistent_alpha, &style->text[state], 1.0);
+       }
+       
+       if (state == GTK_STATE_ACTIVE && !treeview)
+               base = generate_bit (check_base_alpha, &style->bg[state], 1.0);
+       else
+               base = generate_bit (check_base_alpha, &style->base[GTK_STATE_NORMAL], 1.0);
+       
+       if (treeview)
+               composite = generate_bit (NULL, &clearlooks_style->shade[6], 1.0);
+       else
+               composite = generate_bit (NULL, &clearlooks_style->shade[5], 1.0);
+       
+       gdk_pixbuf_composite (base, composite,
+                             0, 0, RADIO_SIZE, RADIO_SIZE, 0, 0,
+                             1.0, 1.0, GDK_INTERP_NEAREST, 255);
+
+       clearlooks_style->check_pixmap_nonactive[state] =
+               pixbuf_to_pixmap (style, composite, screen);
+       
+       gdk_pixbuf_composite (check, composite,
+                             0, 0, RADIO_SIZE, RADIO_SIZE, 0, 0,
+                             1.0, 1.0, GDK_INTERP_NEAREST, 255);
+
+       clearlooks_style->check_pixmap_active[state] =
+               pixbuf_to_pixmap (style, composite, screen);
+
+       g_object_unref (composite);
+
+       composite = generate_bit (NULL, &clearlooks_style->shade[6], 1.0);
+
+       gdk_pixbuf_composite (base, composite,
+                             0, 0, RADIO_SIZE, RADIO_SIZE, 0, 0,
+                             1.0, 1.0, GDK_INTERP_NEAREST, 255);
+       gdk_pixbuf_composite (inconsistent, composite,
+                             0, 0, RADIO_SIZE, RADIO_SIZE, 0, 0,
+                             1.0, 1.0, GDK_INTERP_NEAREST, 255);
+
+       clearlooks_style->check_pixmap_inconsistent[state] =
+               pixbuf_to_pixmap (style, composite, screen);
+
+       g_object_unref (composite);
+       g_object_unref (base);
+       g_object_unref (check);
+       g_object_unref (inconsistent);
+}
+
+static void
+draw_check (DRAW_ARGS)
+{
+       ClearlooksStyle *clearlooks_style = CLEARLOOKS_STYLE (style);
+       GdkGC *gc = style->base_gc[state_type];
+       GdkPixmap *pixmap;
+       gboolean treeview;
+
+       if (DETAIL ("check")) /* Menu item */
+       {
+               parent_class->draw_check (style, window, state_type, shadow_type, area,
+                                       widget, detail, x, y, width, height);
+               return;
+       }
+
+       treeview = widget && GTK_IS_TREE_VIEW(widget);
+       ensure_check_pixmaps (style, state_type, gtk_widget_get_screen (widget), treeview);
+
+       if (area)
+               gdk_gc_set_clip_rectangle (gc, area);
+
+       if (shadow_type == GTK_SHADOW_IN)
+               pixmap = clearlooks_style->check_pixmap_active[state_type];
+       else if (shadow_type == GTK_SHADOW_ETCHED_IN) /* inconsistent */
+               pixmap = clearlooks_style->check_pixmap_inconsistent[state_type];
+       else
+               pixmap = clearlooks_style->check_pixmap_nonactive[state_type];
+
+       x += (width - CHECK_SIZE)/2;
+       y += (height - CHECK_SIZE)/2;
+
+       gdk_draw_drawable (window, gc, pixmap, 0, 0, x, y, CHECK_SIZE, CHECK_SIZE);
+       
+       if (area)
+               gdk_gc_set_clip_rectangle (gc, NULL);
+}
+
+/**************************************************************************/
+static void
+draw_slider (DRAW_ARGS, GtkOrientation orientation)
+{
+       ClearlooksStyle *clearlooks_style = CLEARLOOKS_STYLE (style);
+       GdkGC *shade_gc = clearlooks_style->shade_gc[4];
+       GdkGC *white_gc = clearlooks_style->shade_gc[0];
+       int x1, y1;
+
+#if DEBUG
+               printf("draw_slider: %s %d %d %d %d\n", detail, x, y, width, height);
+#endif
+
+       g_return_if_fail (GTK_IS_STYLE (style));
+       g_return_if_fail (window != NULL);
+
+       sanitize_size (window, &width, &height);
+
+       gtk_paint_box (style, window, state_type, shadow_type,
+                      area, widget, detail, x, y, width, height);
+
+       if ((orientation == GTK_ORIENTATION_VERTICAL && height < 20) ||
+               (orientation == GTK_ORIENTATION_HORIZONTAL && width < 20))
+               return;
+       
+       if (detail && strcmp ("slider", detail) == 0)
+       {
+               if (area)
+               {
+                       gdk_gc_set_clip_rectangle (shade_gc, area);
+                       gdk_gc_set_clip_rectangle (white_gc, area);
+               }
+               if (orientation == GTK_ORIENTATION_HORIZONTAL)
+               {
+                       x1 = x + width / 2 - 4;
+                       y1 = y + (height - 6) / 2;
+                       gdk_draw_line (window, shade_gc, x1, y1, x1, y1 + 6);
+                       gdk_draw_line (window, white_gc, x1 + 1, y1, x1 + 1, y1 + 6);
+                       gdk_draw_line (window, shade_gc, x1 + 3, y1, x1 + 3, y1 + 6);
+                       gdk_draw_line (window, white_gc, x1 + 3 + 1, y1, x1 + 3 + 1, y1 + 6);
+                       gdk_draw_line (window, shade_gc, x1 + 3*2, y1, x1 + 3*2, y1 + 6);
+                       gdk_draw_line (window, white_gc, x1 + 3*2 + 1, y1, x1 + 3*2 + 1, y1 + 6);
+               }
+               else
+               {
+                       x1 = x + (width - 6) / 2;
+                       y1 = y + height / 2 - 4;
+                       gdk_draw_line (window, shade_gc, x1 + 6, y1, x1, y1);
+                       gdk_draw_line (window, white_gc, x1 + 6, y1 + 1, x1, y1 + 1);
+                       gdk_draw_line (window, shade_gc, x1 + 6, y1 + 3, x1, y1 + 3);
+                       gdk_draw_line (window, white_gc, x1 + 6, y1 + 3 + 1, x1, y1 + 3 + 1);
+                       gdk_draw_line (window, shade_gc, x1 + 6, y1 + 3*2, x1, y1 + 3*2);
+                       gdk_draw_line (window, white_gc, x1 + 6, y1 + 3*2 + 1, x1, y1 + 3*2 + 1);
+               }
+               if (area)
+               {
+                       gdk_gc_set_clip_rectangle (shade_gc, NULL);
+                       gdk_gc_set_clip_rectangle (white_gc, NULL);
+               }
+       }
+       else if (detail && (strcmp ("hscale", detail) == 0 || strcmp ("vscale", detail) == 0))
+       {
+               if (area)
+               {
+                       gdk_gc_set_clip_rectangle (shade_gc, area);
+                       gdk_gc_set_clip_rectangle (white_gc, area);
+               }
+
+               if (orientation == GTK_ORIENTATION_HORIZONTAL)
+               {
+                       x1 = x + width / 2 - 3;
+                       y1 = y + (height - 7) / 2;
+                       gdk_draw_line (window, shade_gc, x1 + 0, y1 + 5, x1 + 0, y1 + 1);
+                       gdk_draw_line (window, white_gc, x1 + 1, y1 + 5, x1 + 1, y1 + 1);
+                       gdk_draw_line (window, shade_gc, x1 + 3, y1 + 5, x1 + 3, y1 + 1);
+                       gdk_draw_line (window, white_gc, x1 + 4, y1 + 5, x1 + 4, y1 + 1);
+                       gdk_draw_line (window, shade_gc, x1 + 6,  y1 + 5, x1 + 6, y1 + 1);
+                       gdk_draw_line (window, white_gc, x1 + 7,  y1 + 5, x1 + 7, y1 + 1);
+               }
+               else
+               {
+                       x1 = x + (width - 7) / 2;
+                       y1 = y + height / 2 - 3;
+                       gdk_draw_line (window, shade_gc, x1 + 5, y1 + 0, x1 + 1, y1 + 0);
+                       gdk_draw_line (window, white_gc, x1 + 5, y1 + 1, x1 + 1, y1 + 1);
+                       gdk_draw_line (window, shade_gc, x1 + 5, y1 + 3, x1 + 1, y1 + 3);
+                       gdk_draw_line (window, white_gc, x1 + 5, y1 + 4, x1 + 1, y1 + 4);
+                       gdk_draw_line (window, shade_gc, x1 + 5, y1 + 6, x1 + 1, y1 + 6);
+                       gdk_draw_line (window, white_gc, x1 + 5, y1 + 7, x1 + 1, y1 + 7);
+               }
+               if (area)
+               {
+                       gdk_gc_set_clip_rectangle (shade_gc, NULL);
+                       gdk_gc_set_clip_rectangle (white_gc, NULL);
+               }
+       }
+}
+
+/**************************************************************************/
+static void
+ensure_radio_pixmaps (GtkStyle     *style,
+                     GtkStateType  state,
+                     GdkScreen    *screen)
+{
+       ClearlooksStyle *clearlooks_style = CLEARLOOKS_STYLE (style);
+       ClearlooksRcStyle *clearlooks_rc = CLEARLOOKS_RC_STYLE (style->rc_style);
+       GdkPixbuf *dot, *circle, *outline, *inconsistent, *composite;
+       GdkColor *spot_color = clearlooks_get_spot_color (clearlooks_rc);
+       GdkColor *composite_color;
+       
+       if (clearlooks_style->radio_pixmap_nonactive[state] != NULL)
+               return;
+       
+       if (state == GTK_STATE_ACTIVE || state == GTK_STATE_SELECTED) {
+               dot = colorize_bit (dot_intensity, dot_alpha, &style->text[GTK_STATE_NORMAL]);
+               inconsistent = generate_bit (inconsistent_alpha, &style->text[GTK_STATE_NORMAL], 1.0);
+       } else {
+               dot = colorize_bit (dot_intensity, dot_alpha, &style->text[state]);
+               inconsistent = generate_bit (inconsistent_alpha, &style->text[state], 1.0);
+       }
+       
+       outline = generate_bit (outline_alpha, &clearlooks_style->shade[5], 1.0);
+       
+       if (clearlooks_style->radio_pixmap_mask == NULL)
+       {
+               gdk_pixbuf_render_pixmap_and_mask (outline,
+                                                  NULL,
+                                                  &clearlooks_style->radio_pixmap_mask,
+                                                  1);
+       }
+       
+       if (state == GTK_STATE_ACTIVE)
+       {
+               composite_color = &style->bg[GTK_STATE_PRELIGHT];
+               circle = generate_bit (circle_alpha, &style->bg[state], 1.0);
+       }
+       else
+       {
+               composite_color = &style->bg[state];
+               circle = generate_bit (circle_alpha, &style->base[GTK_STATE_NORMAL], 1.0);
+       }
+       
+       composite = generate_bit (NULL, composite_color, 1.0);
+       
+       gdk_pixbuf_composite (outline, composite,
+                             0, 0, RADIO_SIZE, RADIO_SIZE, 0, 0,
+                             1.0, 1.0, GDK_INTERP_NEAREST, 255);
+                                                 
+       gdk_pixbuf_composite (circle, composite,
+                             0, 0, RADIO_SIZE, RADIO_SIZE, 0, 0,
+                             1.0, 1.0, GDK_INTERP_NEAREST, 255);
+       
+       clearlooks_style->radio_pixmap_nonactive[state] =
+               pixbuf_to_pixmap (style, composite, screen);
+       
+       gdk_pixbuf_composite (dot, composite,
+                             0, 0, RADIO_SIZE, RADIO_SIZE, 0, 0,
+                             1.0, 1.0, GDK_INTERP_NEAREST, 255);
+       
+       clearlooks_style->radio_pixmap_active[state] =
+               pixbuf_to_pixmap (style, composite, screen);
+       
+       g_object_unref (composite);
+       
+       composite = generate_bit (NULL, composite_color,1.0);
+       
+       gdk_pixbuf_composite (outline, composite,
+                             0, 0, RADIO_SIZE, RADIO_SIZE, 0, 0,
+                             1.0, 1.0, GDK_INTERP_NEAREST, 255);
+       gdk_pixbuf_composite (circle, composite,
+                             0, 0, RADIO_SIZE, RADIO_SIZE, 0, 0,
+                             1.0, 1.0, GDK_INTERP_NEAREST, 255);
+       gdk_pixbuf_composite (inconsistent, composite,
+                             0, 0, RADIO_SIZE, RADIO_SIZE, 0, 0,
+                             1.0, 1.0, GDK_INTERP_NEAREST, 255);
+       
+       clearlooks_style->radio_pixmap_inconsistent[state] =
+               pixbuf_to_pixmap (style, composite, screen);
+       
+       g_object_unref (composite);
+       g_object_unref (circle);
+       g_object_unref (dot);
+       g_object_unref (inconsistent);
+       g_object_unref (outline);
+}
+
+static void
+draw_option (DRAW_ARGS)
+{
+       ClearlooksStyle *clearlooks_style = CLEARLOOKS_STYLE (style);
+       GdkGC *gc = style->base_gc[state_type];
+       GdkPixmap *pixmap;
+       
+       if (DETAIL ("option")) /* Menu item */
+       {
+               parent_class->draw_option (style, window, state_type, shadow_type,
+                                          area, widget, detail, x, y, width, height);
+               return;
+       }
+       
+       ensure_radio_pixmaps (style, state_type, gtk_widget_get_screen (widget));
+       
+       if (area)
+               gdk_gc_set_clip_rectangle (gc, area);
+       
+       if (shadow_type == GTK_SHADOW_IN)
+               pixmap = clearlooks_style->radio_pixmap_active[state_type];
+       else if (shadow_type == GTK_SHADOW_ETCHED_IN) /* inconsistent */
+               pixmap = clearlooks_style->radio_pixmap_inconsistent[state_type];
+       else
+               pixmap = clearlooks_style->radio_pixmap_nonactive[state_type];
+       
+       x += (width - RADIO_SIZE)/2;
+       y += (height - RADIO_SIZE)/2;
+       
+       gdk_gc_set_clip_mask (gc, clearlooks_style->radio_pixmap_mask);
+       gdk_gc_set_clip_origin (gc, x, y);
+       
+       gdk_draw_drawable (window, gc, pixmap, 0, 0, x, y,
+                          RADIO_SIZE, RADIO_SIZE);
+       
+       gdk_gc_set_clip_origin (gc, 0, 0);
+       gdk_gc_set_clip_mask (gc, NULL);
+       
+       if (area)
+               gdk_gc_set_clip_rectangle (gc, NULL);
+}
+
+/**************************************************************************/
+
+static void 
+draw_shadow_gap (DRAW_ARGS,
+                 GtkPositionType gap_side,
+                 gint            gap_x,
+                 gint            gap_width)
+{
+       /* I need to improve this function. */
+       ClearlooksStyle *clearlooks_style = CLEARLOOKS_STYLE (style);
+       CLRectangle r;
+       GdkRegion *area_region = NULL, 
+                 *gap_region  = NULL;
+
+#if DEBUG
+               printf("draw_shadow_gap: %s %d %d %d %d\n", detail, x, y, width, height);
+#endif
+
+       g_return_if_fail (GTK_IS_STYLE (style));
+       g_return_if_fail (window != NULL);
+       
+       sanitize_size (window, &width, &height);
+
+       cl_rectangle_reset (&r, style);
+       cl_rectangle_set_corners (&r, CL_CORNER_NONE, CL_CORNER_NONE,
+                                                                 CL_CORNER_NONE, CL_CORNER_NONE);
+       
+       if (area)
+       {
+               area_region = gdk_region_rectangle (area);
+       
+               switch (gap_side)
+               {
+                       case GTK_POS_TOP:
+                       {
+                               GdkRectangle rect = { x+gap_x, y, gap_width, 2 };
+                               gap_region = gdk_region_rectangle (&rect);
+                               break;
+                       }
+                       case GTK_POS_BOTTOM:
+                       {
+                               GdkRectangle rect = { x+gap_x, y+height-2, gap_width, 2 };
+                               gap_region = gdk_region_rectangle (&rect);
+                               break;
+                       }
+                       case GTK_POS_LEFT:
+                       {
+                               GdkRectangle rect = { x, y+gap_x, 2, gap_width };
+                               gap_region = gdk_region_rectangle (&rect);
+                               break;
+                       }               
+                       case GTK_POS_RIGHT:
+                       {
+                               GdkRectangle rect = { x+width-2, y+gap_x, 2, gap_width };
+                               gap_region = gdk_region_rectangle (&rect);
+                               break;
+                       }               
+               }
+               
+               gdk_region_subtract (area_region, gap_region);
+       }
+       
+       if (shadow_type == GTK_SHADOW_ETCHED_IN ||
+           shadow_type == GTK_SHADOW_ETCHED_OUT)
+       {
+               GdkGC *a;
+               GdkGC *b;
+
+               if (shadow_type == GTK_SHADOW_ETCHED_IN)
+               {
+                       a = style->light_gc[state_type];
+                       b = clearlooks_style->shade_gc[3];
+               }
+               else
+               {
+                       a = clearlooks_style->shade_gc[3];
+                       b = style->light_gc[state_type];
+               }
+               
+               gdk_gc_set_clip_region (a, area_region);                
+               gdk_gc_set_clip_region (b, area_region);                
+
+               r.bordergc = a;
+               cl_draw_rectangle (window, widget, style, x+1, y+1, width-1, height-1, &r);
+
+               r.bordergc = b;
+               cl_draw_rectangle (window, widget, style, x, y, width-1, height-1, &r);
+
+               gdk_gc_set_clip_region (a, NULL);       
+               gdk_gc_set_clip_region (b, NULL);               
+       }
+       else if (shadow_type == GTK_SHADOW_IN || shadow_type == GTK_SHADOW_OUT)
+       {
+               r.topleft     = (shadow_type == GTK_SHADOW_OUT) ? style->light_gc[state_type] : clearlooks_style->shade_gc[1];
+               r.bottomright = (shadow_type == GTK_SHADOW_OUT) ? clearlooks_style->shade_gc[1] : style->light_gc[state_type];
+               r.bordergc    = clearlooks_style->shade_gc[5];
+               
+               gdk_gc_set_clip_region (r.bordergc,    area_region);            
+               gdk_gc_set_clip_region (r.topleft,     area_region);            
+               gdk_gc_set_clip_region (r.bottomright, area_region);            
+                               
+               cl_draw_rectangle (window, widget, style, x, y, width, height, &r);
+               
+               cl_draw_shadow (window, widget, style, x, y, width, height, &r);
+
+               gdk_gc_set_clip_region (r.bordergc,    NULL);
+               gdk_gc_set_clip_region (r.topleft,     NULL);
+               gdk_gc_set_clip_region (r.bottomright, NULL);
+       }
+
+       if (area_region)
+               gdk_region_destroy (area_region);
+}
+
+/**************************************************************************/
+static void
+draw_hline (GtkStyle     *style,
+            GdkWindow    *window,
+            GtkStateType  state_type,
+            GdkRectangle  *area,
+            GtkWidget     *widget,
+            const gchar   *detail,
+            gint          x1,
+            gint          x2,
+            gint          y)
+{
+       ClearlooksStyle *clearlooks_style = CLEARLOOKS_STYLE (style);
+
+#if DEBUG
+               printf("draw_hline\n");
+#endif
+
+       g_return_if_fail (GTK_IS_STYLE (style));
+       g_return_if_fail (window != NULL);
+       
+       if (area)
+               gdk_gc_set_clip_rectangle (clearlooks_style->shade_gc[2], area);
+       
+       if (detail && !strcmp (detail, "label"))
+       {
+               if (state_type == GTK_STATE_INSENSITIVE)
+                       gdk_draw_line (window, style->light_gc[state_type], x1 + 1, y + 1, x2 + 1, y + 1);
+                       
+               gdk_draw_line (window, style->fg_gc[state_type], x1, y, x2, y);
+       }
+       else
+       {
+               gdk_draw_line (window, clearlooks_style->shade_gc[2], x1, y, x2, y);
+               
+               /* if (DETAIL ("menuitem")) */
+               gdk_draw_line (window, clearlooks_style->shade_gc[0], x1, y+1, x2, y+1);
+       }
+       
+       if (area)
+               gdk_gc_set_clip_rectangle (clearlooks_style->shade_gc[2], NULL);
+}
+
+/**************************************************************************/
+static void
+draw_vline (GtkStyle     *style,
+            GdkWindow    *window,
+            GtkStateType  state_type,
+            GdkRectangle  *area,
+            GtkWidget     *widget,
+            const gchar   *detail,
+            gint          y1,
+            gint          y2,
+            gint          x)
+{
+       ClearlooksStyle *clearlooks_style = CLEARLOOKS_STYLE (style);
+       gint thickness_light;
+       gint thickness_dark;
+
+#if DEBUG
+               printf("draw_vline\n");
+#endif
+
+       g_return_if_fail (GTK_IS_STYLE (style));
+       g_return_if_fail (window != NULL);
+       
+       thickness_light = style->xthickness / 2;
+       thickness_dark = style->xthickness - thickness_light;
+       
+       if (area)
+               gdk_gc_set_clip_rectangle (clearlooks_style->shade_gc[2], area);
+       
+       gdk_draw_line (window, clearlooks_style->shade_gc[2], x, y1, x, y2 - 1);
+       gdk_draw_line (window, clearlooks_style->shade_gc[0], x+1, y1, x+1, y2 - 1);
+       
+       if (area)
+               gdk_gc_set_clip_rectangle (clearlooks_style->shade_gc[2], NULL);
+}
+
+/**************************************************************************/
+static void
+draw_focus (GtkStyle      *style,
+           GdkWindow     *window,
+           GtkStateType   state_type,
+           GdkRectangle  *area,
+           GtkWidget     *widget,
+           const gchar   *detail,
+           gint           x,
+           gint           y,
+           gint           width,
+           gint           height)
+{
+       ClearlooksStyle *clearlooks_style = CLEARLOOKS_STYLE (style);
+       GdkPoint points[5];
+       GdkGC    *gc;
+       gboolean free_dash_list = FALSE;
+       gint line_width = 1;
+       gchar *dash_list = "\1\1";
+       gint dash_len;
+
+#if DEBUG
+               printf("draw_focus: %s %d %d %d %d\n", detail, x, y, width, height);
+#endif
+       
+       gc = clearlooks_style->shade_gc[6];
+       
+       if (widget)
+       {
+               gtk_widget_style_get (widget,
+                                     "focus-line-width", &line_width,
+                                     "focus-line-pattern", (gchar *)&dash_list,
+                                     NULL);
+       
+               free_dash_list = TRUE;
+       }
+       
+       sanitize_size (window, &width, &height);
+       
+       if (area)
+               gdk_gc_set_clip_rectangle (gc, area);
+       
+       gdk_gc_set_line_attributes (gc, line_width,
+                                   dash_list[0] ? GDK_LINE_ON_OFF_DASH : GDK_LINE_SOLID,
+                                   GDK_CAP_BUTT, GDK_JOIN_MITER);
+       
+       
+       if (detail && !strcmp (detail, "add-mode"))
+       {
+               if (free_dash_list)
+                       g_free (dash_list);
+               
+               dash_list = "\4\4";
+               free_dash_list = FALSE;
+       }
+       
+       points[0].x = x + line_width / 2;
+       points[0].y = y + line_width / 2;
+       points[1].x = x + width - line_width + line_width / 2;
+       points[1].y = y + line_width / 2;
+       points[2].x = x + width - line_width + line_width / 2;
+       points[2].y = y + height - line_width + line_width / 2;
+       points[3].x = x + line_width / 2;
+       points[3].y = y + height - line_width + line_width / 2;
+       points[4] = points[0];
+       
+       if (!dash_list[0])
+       {
+               gdk_draw_lines (window, gc, points, 5);
+       }
+       else
+       {
+               dash_len = strlen (dash_list);
+               
+               if (dash_list[0])
+                       gdk_gc_set_dashes (gc, 0, dash_list, dash_len);
+               
+               gdk_draw_lines (window, gc, points, 3);
+               
+               points[2].x += 1;
+               
+               if (dash_list[0])
+               {
+                       gint dash_pixels = 0;
+                       gint i;
+               
+                       /* Adjust the dash offset for the bottom and left so we
+                       * match up at the upper left.
+                       */
+                       for (i = 0; i < dash_len; i++)
+                               dash_pixels += dash_list[i];
+                       
+                       if (dash_len % 2 == 1)
+                               dash_pixels *= 2;
+               
+                       gdk_gc_set_dashes (gc,
+                                                       dash_pixels - (width + height - 2 * line_width) % dash_pixels,
+                                                       dash_list, dash_len);
+               }
+               
+               gdk_draw_lines (window, gc, points + 2, 3);
+       }
+       
+       gdk_gc_set_line_attributes (gc, 0, GDK_LINE_SOLID, GDK_CAP_BUTT, GDK_JOIN_MITER);
+       
+       if (area)
+               gdk_gc_set_clip_rectangle (gc, NULL);
+       
+       if (free_dash_list)
+               g_free (dash_list);
+}
+
+static void
+draw_layout(GtkStyle * style,
+            GdkWindow * window,
+            GtkStateType state_type,
+            gboolean use_text,
+            GdkRectangle * area,
+            GtkWidget * widget,
+            const gchar * detail, gint x, gint y, PangoLayout * layout)
+{
+       ClearlooksStyle *clearlooks_style = CLEARLOOKS_STYLE (style);
+       
+       g_return_if_fail(GTK_IS_STYLE (style));
+       g_return_if_fail(window != NULL);
+
+       parent_class->draw_layout(style, window, state_type, use_text,
+                                 area, widget, detail, x, y, layout);
+
+       
+}
+
+/**************************************************************************/
+static void
+draw_resize_grip (GtkStyle       *style,
+                 GdkWindow      *window,
+                 GtkStateType    state_type,
+                 GdkRectangle   *area,
+                 GtkWidget      *widget,
+                 const gchar    *detail,
+                 GdkWindowEdge   edge,
+                 gint            x,
+                 gint            y,
+                 gint            width,
+                 gint            height)
+{
+  ClearlooksStyle *clearlooks_style = CLEARLOOKS_STYLE (style);
+  g_return_if_fail (GTK_IS_STYLE (style));
+  g_return_if_fail (window != NULL);
+  
+  if (area)
+    {
+      gdk_gc_set_clip_rectangle (style->light_gc[state_type], area);
+      gdk_gc_set_clip_rectangle (style->dark_gc[state_type], area);
+      gdk_gc_set_clip_rectangle (style->bg_gc[state_type], area);
+    }
+
+  switch (edge)
+    {
+    case GDK_WINDOW_EDGE_NORTH_WEST:
+      /* make it square */
+      if (width < height)
+       {
+         height = width;
+       }
+      else if (height < width)
+       {
+         width = height;
+       }
+      break;
+    case GDK_WINDOW_EDGE_NORTH:
+      if (width < height)
+       {
+         height = width;
+       }
+      break;
+    case GDK_WINDOW_EDGE_NORTH_EAST:
+      /* make it square, aligning to top right */
+      if (width < height)
+       {
+         height = width;
+       }
+      else if (height < width)
+       {
+         x += (width - height);
+         width = height;
+       }
+      break;
+    case GDK_WINDOW_EDGE_WEST:
+      if (height < width)
+       {
+          width = height;
+       }
+      break;
+    case GDK_WINDOW_EDGE_EAST:
+      /* aligning to right */
+      if (height < width)
+       {
+         x += (width - height);
+         width = height;
+       }
+      break;
+    case GDK_WINDOW_EDGE_SOUTH_WEST:
+      /* make it square, aligning to bottom left */
+      if (width < height)
+       {
+         y += (height - width);
+         height = width;
+       }
+      else if (height < width)
+       {
+         width = height;
+       }
+      break;
+    case GDK_WINDOW_EDGE_SOUTH:
+      /* align to bottom */
+      if (width < height)
+       {
+         y += (height - width);
+         height = width;
+       }
+      break;
+    case GDK_WINDOW_EDGE_SOUTH_EAST:
+      /* make it square, aligning to bottom right */
+      if (width < height)
+       {
+         y += (height - width);
+         height = width;
+       }
+      else if (height < width)
+       {
+         x += (width - height);
+         width = height;
+       }
+      break;
+    default:
+      g_assert_not_reached ();
+    }
+
+  /* Clear background */
+  gtk_style_apply_default_background (style, window, FALSE,
+                                     state_type, area,
+                                     x, y, width, height);   
+
+  switch (edge)
+    {
+    case GDK_WINDOW_EDGE_WEST:
+    case GDK_WINDOW_EDGE_EAST:
+      {
+       gint xi;
+
+       xi = x;
+
+       while (xi < x + width)
+         {
+           gdk_draw_line (window,
+                          style->light_gc[state_type],
+                          xi, y,
+                          xi, y + height);
+
+           xi++;
+           gdk_draw_line (window,
+                          clearlooks_style->shade_gc[4],
+                          xi, y,
+                          xi, y + height);
+
+           xi += 2;
+         }
+      }
+      break;
+    case GDK_WINDOW_EDGE_NORTH:
+    case GDK_WINDOW_EDGE_SOUTH:
+      {
+       gint yi;
+
+       yi = y;
+
+       while (yi < y + height)
+         {
+           gdk_draw_line (window,
+                          style->light_gc[state_type],
+                          x, yi,
+                          x + width, yi);
+
+           yi++;
+           gdk_draw_line (window,
+                          clearlooks_style->shade_gc[4],
+                          x, yi,
+                          x + width, yi);
+
+           yi+= 2;
+         }
+      }
+      break;
+    case GDK_WINDOW_EDGE_NORTH_WEST:
+      {
+       gint xi, yi;
+
+       xi = x + width;
+       yi = y + height;
+
+       while (xi > x + 3)
+         {
+           gdk_draw_line (window,
+                          clearlooks_style->shade_gc[4],
+                          xi, y,
+                          x, yi);
+
+           --xi;
+           --yi;
+
+           gdk_draw_line (window,
+                          style->light_gc[state_type],
+                          xi, y,
+                          x, yi);
+
+           xi -= 3;
+           yi -= 3;
+           
+         }
+      }
+      break;
+    case GDK_WINDOW_EDGE_NORTH_EAST:
+      {
+        gint xi, yi;
+
+        xi = x;
+        yi = y + height;
+
+        while (xi < (x + width - 3))
+          {
+            gdk_draw_line (window,
+                           style->light_gc[state_type],
+                           xi, y,
+                           x + width, yi);                           
+
+            ++xi;
+            --yi;
+            
+            gdk_draw_line (window,
+                           clearlooks_style->shade_gc[4],
+                           xi, y,
+                           x + width, yi);
+
+            xi += 3;
+            yi -= 3;
+          }
+      }
+      break;
+    case GDK_WINDOW_EDGE_SOUTH_WEST:
+      {
+       gint xi, yi;
+
+       xi = x + width;
+       yi = y;
+
+       while (xi > x + 3)
+         {
+           gdk_draw_line (window,
+                          clearlooks_style->shade_gc[4],
+                          x, yi,
+                          xi, y + height);
+
+           --xi;
+           ++yi;
+
+           gdk_draw_line (window,
+                          style->light_gc[state_type],
+                          x, yi,
+                          xi, y + height);
+
+           xi -= 3;
+           yi += 3;
+           
+         }
+      }
+      break;
+      
+    case GDK_WINDOW_EDGE_SOUTH_EAST:
+      {
+        gint xi, yi;
+
+        xi = x;
+        yi = y;
+
+        while (xi < (x + width - 3))
+          {
+            gdk_draw_line (window,
+                           style->light_gc[state_type],
+                           xi, y + height,
+                           x + width, yi);                           
+
+            ++xi;
+            ++yi;
+            
+            gdk_draw_line (window,
+                           clearlooks_style->shade_gc[4],
+                           xi, y + height,
+                           x + width, yi);                           
+            
+            xi += 3;
+            yi += 3;
+          }
+      }
+      break;
+    default:
+      g_assert_not_reached ();
+      break;
+    }
+  
+  if (area)
+    {
+      gdk_gc_set_clip_rectangle (style->light_gc[state_type], NULL);
+      gdk_gc_set_clip_rectangle (style->dark_gc[state_type], NULL);
+      gdk_gc_set_clip_rectangle (style->bg_gc[state_type], NULL);
+    }
+}
+
+/**************************************************************************/
+
+static void
+clearlooks_style_init_from_rc (GtkStyle * style,
+                              GtkRcStyle * rc_style)
+{
+       ClearlooksStyle *clearlooks_style = CLEARLOOKS_STYLE (style);
+       GdkColor *spot_color;
+       double shades[] = {1.065, 0.93, 0.896, 0.85, 0.768, 0.665, 0.4, 0.205};
+       int i;
+       double contrast;
+       
+       parent_class->init_from_rc (style, rc_style);
+       
+       contrast = CLEARLOOKS_RC_STYLE (rc_style)->contrast;
+       
+       clearlooks_style->sunkenmenubar = CLEARLOOKS_RC_STYLE (rc_style)->sunkenmenubar;
+       clearlooks_style->progressbarstyle = CLEARLOOKS_RC_STYLE (rc_style)->progressbarstyle;
+       clearlooks_style->menubarstyle = CLEARLOOKS_RC_STYLE (rc_style)->menubarstyle;
+       clearlooks_style->menuitemstyle = CLEARLOOKS_RC_STYLE (rc_style)->menuitemstyle;
+       clearlooks_style->listviewitemstyle = CLEARLOOKS_RC_STYLE (rc_style)->listviewitemstyle;
+       
+       /* Lighter to darker */
+       for (i = 0; i < 8; i++)
+       {
+               shade (&style->bg[GTK_STATE_NORMAL], &clearlooks_style->shade[i],
+                      (shades[i]-0.7) * contrast + 0.7);
+       }
+               
+       spot_color = clearlooks_get_spot_color (CLEARLOOKS_RC_STYLE (rc_style));
+       
+       clearlooks_style->spot_color = *spot_color;
+       shade (&clearlooks_style->spot_color, &clearlooks_style->spot1, 1.42);
+       shade (&clearlooks_style->spot_color, &clearlooks_style->spot2, 1.05);
+       shade (&clearlooks_style->spot_color, &clearlooks_style->spot3, 0.65);
+
+       shade (&style->bg[GTK_STATE_NORMAL], &clearlooks_style->border[CL_BORDER_UPPER],        0.5);
+       shade (&style->bg[GTK_STATE_NORMAL], &clearlooks_style->border[CL_BORDER_LOWER],        0.62);
+       shade (&style->bg[GTK_STATE_ACTIVE], &clearlooks_style->border[CL_BORDER_UPPER_ACTIVE], 0.5);
+       shade (&style->bg[GTK_STATE_ACTIVE], &clearlooks_style->border[CL_BORDER_LOWER_ACTIVE], 0.55);
+}
+
+static GdkGC *
+realize_color (GtkStyle * style,
+              GdkColor * color)
+{
+       GdkGCValues gc_values;
+       
+       gdk_colormap_alloc_color (style->colormap, color, FALSE, TRUE);
+       
+       gc_values.foreground = *color;
+       
+       return gtk_gc_get (style->depth, style->colormap, &gc_values, GDK_GC_FOREGROUND);
+}
+
+static void
+clearlooks_style_realize (GtkStyle * style)
+{
+       ClearlooksStyle *clearlooks_style = CLEARLOOKS_STYLE (style);
+       int i;
+       
+       parent_class->realize (style);
+       
+       for (i = 0; i < 8; i++)
+               clearlooks_style->shade_gc[i] = realize_color (style, &clearlooks_style->shade[i]);
+
+       for (i=0; i < CL_BORDER_COUNT; i++)
+               clearlooks_style->border_gc[i] = realize_color (style, &clearlooks_style->border[i]);
+               
+       clearlooks_style->spot1_gc = realize_color (style, &clearlooks_style->spot1);
+       clearlooks_style->spot2_gc = realize_color (style, &clearlooks_style->spot2);
+       clearlooks_style->spot3_gc = realize_color (style, &clearlooks_style->spot3);
+
+       /* set light inset color */
+       for (i=0; i<5; i++)
+       {
+               shade (&style->bg[i], &clearlooks_style->inset_dark[i], 0.93);
+               gdk_rgb_find_color (style->colormap, &clearlooks_style->inset_dark[i]);
+
+               shade (&style->bg[i], &clearlooks_style->inset_light[i], 1.055);
+               gdk_rgb_find_color (style->colormap, &clearlooks_style->inset_light[i]);
+
+               shade (&style->bg[i], &clearlooks_style->listview_bg[i], 1.015);
+               gdk_rgb_find_color (style->colormap, &clearlooks_style->listview_bg[i]);
+
+               /* CREATE GRADIENT FOR BUTTONS */               
+               shade (&style->bg[i], &clearlooks_style->button_g1[i], 1.055);
+               gdk_rgb_find_color (style->colormap, &clearlooks_style->button_g1[i]);
+               
+               shade (&style->bg[i], &clearlooks_style->button_g2[i], 1.005);
+               gdk_rgb_find_color (style->colormap, &clearlooks_style->button_g2[i]);
+
+               shade (&style->bg[i], &clearlooks_style->button_g3[i], 0.98);
+               gdk_rgb_find_color (style->colormap, &clearlooks_style->button_g3[i]);
+
+               shade (&style->bg[i], &clearlooks_style->button_g4[i], 0.91);
+               gdk_rgb_find_color (style->colormap, &clearlooks_style->button_g4[i]);
+       }
+
+}
+
+static void
+clearlooks_style_unrealize (GtkStyle * style)
+{
+       ClearlooksStyle *clearlooks_style = CLEARLOOKS_STYLE (style);
+       int i;
+       
+       /* We don't free the colors, because we don't know if
+       * gtk_gc_release() actually freed the GC. FIXME - need
+       * a way of ref'ing colors explicitely so GtkGC can
+       * handle things properly.
+       */
+       for (i=0; i < 8; i++)
+               gtk_gc_release (clearlooks_style->shade_gc[i]);
+       
+       gtk_gc_release (clearlooks_style->spot1_gc);
+       gtk_gc_release (clearlooks_style->spot2_gc);
+       gtk_gc_release (clearlooks_style->spot3_gc);
+       
+       for (i = 0; i < 5; i++)
+       {
+               if (clearlooks_style->radio_pixmap_nonactive[i] != NULL)
+               {
+                       g_object_unref (clearlooks_style->radio_pixmap_nonactive[i]);
+                       clearlooks_style->radio_pixmap_nonactive[i] = NULL;
+                       g_object_unref (clearlooks_style->radio_pixmap_active[i]);
+                       clearlooks_style->radio_pixmap_active[i] = NULL;
+                       g_object_unref (clearlooks_style->radio_pixmap_inconsistent[i]);
+                       clearlooks_style->radio_pixmap_inconsistent[i] = NULL;
+               }
+               
+               if (clearlooks_style->check_pixmap_nonactive[i] != NULL)
+               {
+                       g_object_unref (clearlooks_style->check_pixmap_nonactive[i]);
+                       clearlooks_style->check_pixmap_nonactive[i] = NULL;
+                       g_object_unref (clearlooks_style->check_pixmap_active[i]);
+                       clearlooks_style->check_pixmap_active[i] = NULL;
+                       g_object_unref (clearlooks_style->check_pixmap_inconsistent[i]);
+                       clearlooks_style->check_pixmap_inconsistent[i] = NULL;
+               }
+       }
+       
+       if (clearlooks_style->radio_pixmap_mask != NULL)
+               g_object_unref (clearlooks_style->radio_pixmap_mask);
+               
+       clearlooks_style->radio_pixmap_mask = NULL;
+
+       while (progressbars = g_list_first (progressbars))
+               cl_progressbar_remove (progressbars->data);
+       
+       if (timer_id != 0)
+       {
+               g_source_remove(timer_id);
+               timer_id = 0;           
+       }
+       
+       parent_class->unrealize (style);
+}
+
+static GdkPixbuf *
+set_transparency (const GdkPixbuf *pixbuf, gdouble alpha_percent)
+{
+       GdkPixbuf *target;
+       guchar *data, *current;
+       guint x, y, rowstride, height, width;
+
+       g_return_val_if_fail (pixbuf != NULL, NULL);
+       g_return_val_if_fail (GDK_IS_PIXBUF (pixbuf), NULL);
+
+       /* Returns a copy of pixbuf with it's non-completely-transparent pixels to
+          have an alpha level "alpha_percent" of their original value. */
+
+       target = gdk_pixbuf_add_alpha (pixbuf, FALSE, 0, 0, 0);
+
+       if (alpha_percent == 1.0)
+               return target;
+       width = gdk_pixbuf_get_width (target);
+       height = gdk_pixbuf_get_height (target);
+       rowstride = gdk_pixbuf_get_rowstride (target);
+       data = gdk_pixbuf_get_pixels (target);
+
+       for (y = 0; y < height; y++) {
+               for (x = 0; x < width; x++) {
+                       /* The "4" is the number of chars per pixel, in this case, RGBA,
+                          the 3 means "skip to the alpha" */
+                       current = data + (y * rowstride) + (x * 4) + 3; 
+                       *(current) = (guchar) (*(current) * alpha_percent);
+               }
+       }
+
+       return target;
+}
+
+static GdkPixbuf*
+scale_or_ref (GdkPixbuf *src,
+              int width,
+              int height)
+{
+       if (width == gdk_pixbuf_get_width (src) &&
+           height == gdk_pixbuf_get_height (src)) {
+               return g_object_ref (src);
+       } else {
+               return gdk_pixbuf_scale_simple (src,
+                                               width, height,
+                                               GDK_INTERP_BILINEAR);
+       }
+}
+
+static GdkPixbuf *
+render_icon (GtkStyle            *style,
+            const GtkIconSource *source,
+            GtkTextDirection     direction,
+            GtkStateType         state,
+            GtkIconSize          size,
+            GtkWidget           *widget,
+            const char          *detail)
+{
+       int width = 1;
+       int height = 1;
+       GdkPixbuf *scaled;
+       GdkPixbuf *stated;
+       GdkPixbuf *base_pixbuf;
+       GdkScreen *screen;
+       GtkSettings *settings;
+       
+       /* Oddly, style can be NULL in this function, because
+        * GtkIconSet can be used without a style and if so
+        * it uses this function.
+        */
+       
+       base_pixbuf = gtk_icon_source_get_pixbuf (source);
+       
+       g_return_val_if_fail (base_pixbuf != NULL, NULL);
+       
+       if (widget && gtk_widget_has_screen (widget)) {
+               screen = gtk_widget_get_screen (widget);
+               settings = gtk_settings_get_for_screen (screen);
+       } else if (style->colormap) {
+               screen = gdk_colormap_get_screen (style->colormap);
+               settings = gtk_settings_get_for_screen (screen);
+       } else {
+               settings = gtk_settings_get_default ();
+               GTK_NOTE (MULTIHEAD,
+                         g_warning ("Using the default screen for gtk_default_render_icon()"));
+       }
+       
+  
+       if (size != (GtkIconSize) -1 && !gtk_icon_size_lookup_for_settings (settings, size, &width, &height)) {
+               g_warning (G_STRLOC ": invalid icon size '%d'", size);
+               return NULL;
+       }
+
+       /* If the size was wildcarded, and we're allowed to scale, then scale; otherwise,
+        * leave it alone.
+        */
+       if (size != (GtkIconSize)-1 && gtk_icon_source_get_size_wildcarded (source))
+               scaled = scale_or_ref (base_pixbuf, width, height);
+       else
+               scaled = g_object_ref (base_pixbuf);
+       
+       /* If the state was wildcarded, then generate a state. */
+       if (gtk_icon_source_get_state_wildcarded (source)) {
+               if (state == GTK_STATE_INSENSITIVE) {
+                       stated = set_transparency (scaled, 0.3);
+#if 0
+                       stated =
+                               gdk_pixbuf_composite_color_simple (scaled,
+                                                                  gdk_pixbuf_get_width (scaled),
+                                                                  gdk_pixbuf_get_height (scaled),
+                                                                  GDK_INTERP_BILINEAR, 128,
+                                                                  gdk_pixbuf_get_width (scaled),
+                                                                  style->bg[state].pixel,
+                                                                  style->bg[state].pixel);
+#endif
+                       gdk_pixbuf_saturate_and_pixelate (stated, stated,
+                                                         0.1, FALSE);
+                       
+                       g_object_unref (scaled);
+               } else if (state == GTK_STATE_PRELIGHT) {
+                       stated = gdk_pixbuf_copy (scaled);      
+                       
+                       gdk_pixbuf_saturate_and_pixelate (scaled, stated,
+                                                         1.2, FALSE);
+                       
+                       g_object_unref (scaled);
+               } else {
+                       stated = scaled;
+               }
+       }
+       else
+               stated = scaled;
+  
+  return stated;
+}
+
+static void
+clearlooks_style_init (ClearlooksStyle * style)
+{
+}
+
+static void
+clearlooks_style_class_init (ClearlooksStyleClass * klass)
+{
+       GtkStyleClass *style_class = GTK_STYLE_CLASS (klass);
+       
+       parent_class = g_type_class_peek_parent (klass);
+
+       style_class->realize = clearlooks_style_realize;
+       style_class->unrealize = clearlooks_style_unrealize;
+       style_class->init_from_rc = clearlooks_style_init_from_rc;
+       style_class->draw_focus = draw_focus;
+       style_class->draw_resize_grip = draw_resize_grip;
+       style_class->draw_handle = draw_handle;
+       style_class->draw_vline = draw_vline;
+       style_class->draw_hline = draw_hline;
+       style_class->draw_slider = draw_slider;
+       style_class->draw_shadow_gap = draw_shadow_gap;
+       style_class->draw_arrow = clearlooks_draw_arrow;
+       style_class->draw_check = draw_check;
+       style_class->draw_tab = draw_tab;
+       style_class->draw_box = draw_box;
+       style_class->draw_shadow = draw_shadow;
+       style_class->draw_box_gap = draw_box_gap;
+       style_class->draw_extension = draw_extension;
+       style_class->draw_option = draw_option;
+       style_class->draw_layout = draw_layout; 
+       style_class->render_icon = render_icon;
+       style_class->draw_flat_box = draw_flat_box;
+}
+
+GType clearlooks_type_style = 0;
+
+void
+clearlooks_style_register_type (GTypeModule * module)
+{
+       static const GTypeInfo object_info =
+       {
+               sizeof (ClearlooksStyleClass),
+               (GBaseInitFunc) NULL,
+               (GBaseFinalizeFunc) NULL,
+               (GClassInitFunc) clearlooks_style_class_init,
+               NULL,         /* class_finalize */
+               NULL,         /* class_data */
+               sizeof (ClearlooksStyle),
+               0,            /* n_preallocs */
+               (GInstanceInitFunc) clearlooks_style_init,
+               NULL
+       };
+
+       clearlooks_type_style = g_type_module_register_type (module,
+                                                            GTK_TYPE_STYLE,
+                                                            "ClearlooksStyle",
+                                                            &object_info, 0);
+}
diff --git a/libs/clearlooks/clearlooks_style.h b/libs/clearlooks/clearlooks_style.h
new file mode 100644 (file)
index 0000000..1e07877
--- /dev/null
@@ -0,0 +1,108 @@
+/* Clearlooks Engine
+ * Copyright (C) 2005 Richard Stellingwerff.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ *
+ * Written by Owen Taylor <otaylor@redhat.com>
+ * and by Alexander Larsson <alexl@redhat.com>
+ * Modified by Richard Stellingwerff <remenic@gmail.com>
+ */
+#include <gtk/gtkstyle.h>
+
+#include "clearlooks_draw.h"
+
+typedef struct _ClearlooksStyle ClearlooksStyle;
+typedef struct _ClearlooksStyleClass ClearlooksStyleClass;
+
+extern GType clearlooks_type_style;
+
+#define CLEARLOOKS_TYPE_STYLE              clearlooks_type_style
+#define CLEARLOOKS_STYLE(object)           (G_TYPE_CHECK_INSTANCE_CAST ((object), CLEARLOOKS_TYPE_STYLE, ClearlooksStyle))
+#define CLEARLOOKS_STYLE_CLASS(klass)      (G_TYPE_CHECK_CLASS_CAST ((klass), CLEARLOOKS_TYPE_STYLE, ClearlooksStyleClass))
+#define CLEARLOOKS_IS_STYLE(object)        (G_TYPE_CHECK_INSTANCE_TYPE ((object), CLEARLOOKS_TYPE_STYLE))
+#define CLEARLOOKS_IS_STYLE_CLASS(klass)   (G_TYPE_CHECK_CLASS_TYPE ((klass), CLEARLOOKS_TYPE_STYLE))
+#define CLEARLOOKS_STYLE_GET_CLASS(obj)    (G_TYPE_INSTANCE_GET_CLASS ((obj), CLEARLOOKS_TYPE_STYLE, ClearlooksStyleClass))
+
+typedef enum
+{
+       CL_BORDER_UPPER = 0,
+       CL_BORDER_LOWER,
+       CL_BORDER_UPPER_ACTIVE,
+       CL_BORDER_LOWER_ACTIVE,
+       CL_BORDER_COUNT
+} ClBorderColorType;
+
+typedef enum
+{
+       CL_SCROLLBUTTON_BEGIN = 0,
+       CL_SCROLLBUTTON_END,
+       CL_SCROLLBUTTON_OTHER
+} ClScrollButtonType;
+
+struct _ClearlooksStyle
+{
+       GtkStyle parent_instance;
+       
+       GdkColor shade[9];
+       
+       GdkColor spot_color;
+       GdkColor spot1;
+       GdkColor spot2;
+       GdkColor spot3;
+       
+       GdkColor border[CL_BORDER_COUNT];
+       
+       /* from light to dark */
+       GdkGC *shade_gc[9];
+       GdkGC *border_gc[CL_BORDER_COUNT];
+       
+       GdkGC *spot1_gc;
+       GdkGC *spot2_gc;
+       GdkGC *spot3_gc;
+       
+       GdkColor inset_light[5];
+       GdkColor inset_dark[5];
+       
+       GdkColor button_g1[5];
+       GdkColor button_g2[5];
+       GdkColor button_g3[5];
+       GdkColor button_g4[5];
+       
+       GdkColor listview_bg[5];
+
+       GdkPixmap *radio_pixmap_nonactive[5];
+       GdkPixmap *radio_pixmap_active[5];
+       GdkPixmap *radio_pixmap_inconsistent[5];
+       GdkBitmap *radio_pixmap_mask; /* All masks are the same */
+       
+       GdkPixmap *check_pixmap_nonactive[5];
+       GdkPixmap *check_pixmap_active[5];
+       GdkPixmap *check_pixmap_inconsistent[5];
+       
+       gboolean sunkenmenubar:1;
+
+       guint8   progressbarstyle;
+       guint8   menubarstyle;
+       guint8   menuitemstyle;
+       guint8   listviewitemstyle;
+};
+
+struct _ClearlooksStyleClass
+{
+  GtkStyleClass parent_class;
+};
+
+void clearlooks_style_register_type (GTypeModule *module);
diff --git a/libs/clearlooks/clearlooks_theme_main.c b/libs/clearlooks/clearlooks_theme_main.c
new file mode 100644 (file)
index 0000000..d30d4dd
--- /dev/null
@@ -0,0 +1,37 @@
+#include <gmodule.h>
+#include <gtk/gtk.h>
+
+#include "clearlooks_style.h"
+#include "clearlooks_rc_style.h"
+
+G_MODULE_EXPORT void
+theme_init (GTypeModule *module)
+{
+  clearlooks_rc_style_register_type (module);
+  clearlooks_style_register_type (module);
+  printf("theme_init() called from internal clearlooks engine!\n");
+}
+
+G_MODULE_EXPORT void
+theme_exit (void)
+{
+}
+
+G_MODULE_EXPORT GtkRcStyle *
+theme_create_rc_style (void)
+{
+  return GTK_RC_STYLE (g_object_new (CLEARLOOKS_TYPE_RC_STYLE, NULL));  
+}
+
+/* The following function will be called by GTK+ when the module
+ * is loaded and checks to see if we are compatible with the
+ * version of GTK+ that loads us.
+ */
+G_MODULE_EXPORT const gchar* g_module_check_init (GModule *module);
+const gchar*
+g_module_check_init (GModule *module)
+{
+  return gtk_check_version (GTK_MAJOR_VERSION,
+                           GTK_MINOR_VERSION,
+                           GTK_MICRO_VERSION - GTK_INTERFACE_AGE);
+}
diff --git a/libs/clearlooks/cpdll.sh b/libs/clearlooks/cpdll.sh
new file mode 100755 (executable)
index 0000000..fb101d5
--- /dev/null
@@ -0,0 +1,2 @@
+mkdir engines
+cp libclearlooks.so engines
diff --git a/libs/clearlooks/support.c b/libs/clearlooks/support.c
new file mode 100644 (file)
index 0000000..358c7f4
--- /dev/null
@@ -0,0 +1,981 @@
+#include "support.h"
+
+/* #define ALWAYS_DITHER_GRADIENTS */
+
+GtkTextDirection
+get_direction (GtkWidget *widget)
+{
+       GtkTextDirection dir;
+       
+       if (widget)
+               dir = gtk_widget_get_direction (widget);
+       else
+               dir = GTK_TEXT_DIR_LTR;
+       
+       return dir;
+}
+
+GdkPixbuf *
+generate_bit (unsigned char alpha[], GdkColor *color, double mult)
+{
+       guint r, g, b;
+       GdkPixbuf *pixbuf;
+       unsigned char *pixels;
+       int w, h, rs;
+       int x, y;
+       
+       r = (color->red >> 8) * mult;
+       r = MIN(r, 255);
+       g = (color->green >> 8) * mult;
+       g = MIN(g, 255);
+       b = (color->blue >> 8) * mult;
+       b = MIN(b, 255);
+       
+       pixbuf = gdk_pixbuf_new (GDK_COLORSPACE_RGB, TRUE, 8, RADIO_SIZE, RADIO_SIZE);
+       
+       w = gdk_pixbuf_get_width (pixbuf);
+       h = gdk_pixbuf_get_height (pixbuf);
+       rs = gdk_pixbuf_get_rowstride (pixbuf);
+       pixels = gdk_pixbuf_get_pixels (pixbuf);
+       
+       
+       for (y=0; y < h; y++)
+       {
+               for (x=0; x < w; x++)
+               {
+                       pixels[y*rs + x*4 + 0] = r;
+                       pixels[y*rs + x*4 + 1] = g;
+                       pixels[y*rs + x*4 + 2] = b;
+                       if (alpha)
+                               pixels[y*rs + x*4 + 3] = alpha[y*w + x];
+                       else
+                               pixels[y*rs + x*4 + 3] = 255;
+               }
+       }
+       
+       return pixbuf;
+}
+
+#define CLAMP_UCHAR(v) ((guchar) (CLAMP (((int)v), (int)0, (int)255)))
+
+GdkPixbuf *
+colorize_bit (unsigned char *bit,
+              unsigned char *alpha,
+              GdkColor  *new_color)
+{
+       GdkPixbuf *pixbuf;
+       double intensity;
+       int x, y;
+       const guchar *src, *asrc;
+       guchar *dest;
+       int dest_rowstride;
+       int width, height;
+       guchar *dest_pixels;
+       
+       pixbuf = gdk_pixbuf_new (GDK_COLORSPACE_RGB, TRUE, 8, RADIO_SIZE, RADIO_SIZE);
+       
+       if (pixbuf == NULL)
+               return NULL;
+       
+       dest_rowstride = gdk_pixbuf_get_rowstride (pixbuf);
+       width = gdk_pixbuf_get_width (pixbuf);
+       height = gdk_pixbuf_get_height (pixbuf);
+       dest_pixels = gdk_pixbuf_get_pixels (pixbuf);
+       
+       for (y = 0; y < RADIO_SIZE; y++)
+       {
+               src = bit + y * RADIO_SIZE;
+               asrc = alpha + y * RADIO_SIZE;
+               dest = dest_pixels + y * dest_rowstride;
+       
+               for (x = 0; x < RADIO_SIZE; x++)
+               {
+                       double dr, dg, db;
+       
+                       intensity = (src[x] + 0 )/ 255.0;
+       
+                       if (intensity <= 0.5)
+                       {
+                               /* Go from black at intensity = 0.0 to new_color at intensity = 0.5 */
+                               dr = (new_color->red * intensity * 2.0) / 65535.0;
+                               dg = (new_color->green * intensity * 2.0) / 65535.0;
+                               db = (new_color->blue * intensity * 2.0) / 65535.0;
+                       }
+                       else
+                       {
+                               /* Go from new_color at intensity = 0.5 to white at intensity = 1.0 */
+                               dr = (new_color->red + (65535 - new_color->red) * (intensity - 0.5) * 2.0) / 65535.0;
+                               dg = (new_color->green + (65535 - new_color->green) * (intensity - 0.5) * 2.0) / 65535.0;
+                               db = (new_color->blue + (65535 - new_color->blue) * (intensity - 0.5) * 2.0) / 65535.0;
+                       }
+       
+                       dest[0] = CLAMP_UCHAR (255 * dr);
+                       dest[1] = CLAMP_UCHAR (255 * dg);
+                       dest[2] = CLAMP_UCHAR (255 * db);
+       
+                       dest[3] = asrc[x];
+                       dest += 4;
+               }
+       }
+       
+       return pixbuf;
+}
+
+GdkPixmap *
+pixbuf_to_pixmap (GtkStyle  *style,
+                  GdkPixbuf *pixbuf,
+                  GdkScreen *screen)
+{
+       GdkGC *tmp_gc;
+       GdkPixmap *pixmap;
+       
+       pixmap = gdk_pixmap_new (gdk_screen_get_root_window (screen),
+                                gdk_pixbuf_get_width (pixbuf),
+                                gdk_pixbuf_get_height (pixbuf),
+                                style->depth);
+                                                        
+       gdk_drawable_set_colormap (pixmap, style->colormap);
+       
+       tmp_gc = gdk_gc_new (pixmap);
+       
+       gdk_pixbuf_render_to_drawable (pixbuf, pixmap, tmp_gc, 0, 0, 0, 0,
+                                      gdk_pixbuf_get_width (pixbuf),
+                                      gdk_pixbuf_get_height (pixbuf),
+                                      GDK_RGB_DITHER_NORMAL, 0, 0);
+       
+       gdk_gc_unref (tmp_gc);
+       
+       return pixmap;
+}
+
+
+void
+rgb_to_hls (gdouble *r,
+            gdouble *g,
+            gdouble *b)
+{
+       gdouble min;
+       gdouble max;
+       gdouble red;
+       gdouble green;
+       gdouble blue;
+       gdouble h, l, s;
+       gdouble delta;
+       
+       red = *r;
+       green = *g;
+       blue = *b;
+
+       if (red > green)
+       {
+               if (red > blue)
+                       max = red;
+               else
+                       max = blue;
+       
+               if (green < blue)
+                       min = green;
+               else
+                       min = blue;
+       }
+       else
+       {
+               if (green > blue)
+                       max = green;
+               else
+                       max = blue;
+       
+               if (red < blue)
+                       min = red;
+               else
+                       min = blue;
+       }
+
+       l = (max + min) / 2;
+       s = 0;
+       h = 0;
+
+       if (max != min)
+       {
+               if (l <= 0.5)
+                       s = (max - min) / (max + min);
+               else
+                       s = (max - min) / (2 - max - min);
+       
+               delta = max -min;
+               if (red == max)
+                       h = (green - blue) / delta;
+               else if (green == max)
+                       h = 2 + (blue - red) / delta;
+               else if (blue == max)
+                       h = 4 + (red - green) / delta;
+       
+               h *= 60;
+               if (h < 0.0)
+                       h += 360;
+       }
+
+       *r = h;
+       *g = l;
+       *b = s;
+}
+
+void
+hls_to_rgb (gdouble *h,
+            gdouble *l,
+            gdouble *s)
+{
+       gdouble hue;
+       gdouble lightness;
+       gdouble saturation;
+       gdouble m1, m2;
+       gdouble r, g, b;
+       
+       lightness = *l;
+       saturation = *s;
+
+       if (lightness <= 0.5)
+               m2 = lightness * (1 + saturation);
+       else
+               m2 = lightness + saturation - lightness * saturation;
+               
+       m1 = 2 * lightness - m2;
+
+       if (saturation == 0)
+       {
+               *h = lightness;
+               *l = lightness;
+               *s = lightness;
+       }
+       else
+       {
+               hue = *h + 120;
+               while (hue > 360)
+                       hue -= 360;
+               while (hue < 0)
+                       hue += 360;
+       
+               if (hue < 60)
+                       r = m1 + (m2 - m1) * hue / 60;
+               else if (hue < 180)
+                       r = m2;
+               else if (hue < 240)
+                       r = m1 + (m2 - m1) * (240 - hue) / 60;
+               else
+                       r = m1;
+       
+               hue = *h;
+               while (hue > 360)
+                       hue -= 360;
+               while (hue < 0)
+                       hue += 360;
+       
+               if (hue < 60)
+                       g = m1 + (m2 - m1) * hue / 60;
+               else if (hue < 180)
+                       g = m2;
+               else if (hue < 240)
+                       g = m1 + (m2 - m1) * (240 - hue) / 60;
+               else
+                       g = m1;
+       
+               hue = *h - 120;
+               while (hue > 360)
+                       hue -= 360;
+               while (hue < 0)
+                       hue += 360;
+       
+               if (hue < 60)
+                       b = m1 + (m2 - m1) * hue / 60;
+               else if (hue < 180)
+                       b = m2;
+               else if (hue < 240)
+                       b = m1 + (m2 - m1) * (240 - hue) / 60;
+               else
+                       b = m1;
+       
+               *h = r;
+               *l = g;
+               *s = b;
+       }
+}
+
+void
+shade (GdkColor * a, GdkColor * b, float k)
+{
+       gdouble red;
+       gdouble green;
+       gdouble blue;
+       
+       red = (gdouble) a->red / 65535.0;
+       green = (gdouble) a->green / 65535.0;
+       blue = (gdouble) a->blue / 65535.0;
+       
+       rgb_to_hls (&red, &green, &blue);
+       
+       green *= k;
+       if (green > 1.0)
+               green = 1.0;
+       else if (green < 0.0)
+               green = 0.0;
+       
+       blue *= k;
+       if (blue > 1.0)
+               blue = 1.0;
+       else if (blue < 0.0)
+               blue = 0.0;
+       
+       hls_to_rgb (&red, &green, &blue);
+       
+       b->red = red * 65535.0;
+       b->green = green * 65535.0;
+       b->blue = blue * 65535.0;
+}
+
+
+/**************************************************************************/
+
+void
+arrow_draw_hline (GdkWindow     *window,
+               GdkGC         *gc,
+               int            x1,
+               int            x2,
+               int            y,
+               gboolean       last)
+{
+       if (x2 - x1 < 7 && !last) /* 7 to get garretts pixels, otherwise 6 */
+       {
+               gdk_draw_line (window, gc, x1, y, x2, y);
+       }
+       else if (last)
+       {
+               /* we don't draw "spikes" for very small arrows */
+               if (x2 - x1 <= 9)
+               {
+                       /*gdk_draw_line (window, gc, x1+1, y, x1+1, y);
+                       gdk_draw_line (window, gc, x2-1, y, x2-1, y);*/
+               }
+               else
+               {
+                       gdk_draw_line (window, gc, x1+2, y, x1+2, y);
+                       gdk_draw_line (window, gc, x2-2, y, x2-2, y);
+               }
+       }
+       else
+       {
+               gdk_draw_line (window, gc, x1, y, x1+2, y);
+               gdk_draw_line (window, gc, x2-2, y, x2, y);
+       }
+}
+
+void
+arrow_draw_vline (GdkWindow     *window,
+                  GdkGC         *gc,
+                  int            y1,
+                  int            y2,
+                  int            x,
+                  gboolean       last)
+{
+       if (y2 - y1 < 7 && !last) /* 7 to get garretts pixels */
+               gdk_draw_line (window, gc, x, y1, x, y2);
+       else if (last)
+       {
+               /* we don't draw "spikes" for very small arrows */
+               if (y2 - y1 > 9) {
+                       gdk_draw_line (window, gc, x, y1+2, x, y1+2);
+                       gdk_draw_line (window, gc, x, y2-2, x, y2-2);
+               }
+       }
+       else
+       {
+               gdk_draw_line (window, gc, x, y1, x, y1+2);
+               gdk_draw_line (window, gc, x, y2-2, x, y2);
+       }
+}
+
+
+
+void
+draw_arrow (GdkWindow     *window,
+            GdkGC         *gc,
+            GdkRectangle  *area,
+            GtkArrowType   arrow_type,
+            gint           x,
+            gint           y,
+            gint           width,
+            gint           height)
+{
+       gint i, j;
+
+       if (area)
+               gdk_gc_set_clip_rectangle (gc, area);
+
+       if (arrow_type == GTK_ARROW_DOWN)
+       {
+               for (i = 0, j = -1; i < height; i++, j++)
+                       arrow_draw_hline (window, gc, x + j, x + width - j - 1, y + i, i == 0);
+
+       }
+       else if (arrow_type == GTK_ARROW_UP)
+       {
+               for (i = height - 1, j = -1; i >= 0; i--, j++)
+                       arrow_draw_hline (window, gc, x + j, x + width - j - 1, y + i, i == height - 1);
+       }
+       else if (arrow_type == GTK_ARROW_LEFT)
+       {
+               for (i = width - 1, j = -1; i >= 0; i--, j++)
+                       arrow_draw_vline (window, gc, y + j, y + height - j - 1, x + i, i == width - 1);
+       }
+       else if (arrow_type == GTK_ARROW_RIGHT)
+       {
+               for (i = 0, j = -1; i < width; i++, j++)
+                       arrow_draw_vline (window, gc, y + j, y + height - j - 1,  x + i, i == 0);
+       }
+
+       if (area)
+               gdk_gc_set_clip_rectangle (gc, NULL);
+}
+
+void
+calculate_arrow_geometry (GtkArrowType  arrow_type,
+                          gint         *x,
+                          gint         *y,
+                          gint         *width,
+                          gint         *height)
+{
+       gint w = *width;
+       gint h = *height;
+
+       switch (arrow_type)
+       {
+               case GTK_ARROW_UP:
+               case GTK_ARROW_DOWN:
+                       w += (w % 2) - 1;
+                       h = (w / 2 + 1) + 1;
+               
+                       if (h > *height)
+                       {
+                               h = *height;
+                               w = 2 * (h - 1) - 1;
+                       }
+               
+                       if (arrow_type == GTK_ARROW_DOWN)
+                       {
+                               if (*height % 2 == 1 || h % 2 == 0)
+                                       *height += 1;
+                       }
+                       else
+                       {
+                               if (*height % 2 == 0 || h % 2 == 0)
+                                       *height -= 1;
+                       }
+                       break;
+       
+               case GTK_ARROW_RIGHT:
+               case GTK_ARROW_LEFT:
+                       h += (h % 2) - 1;
+                       w = (h / 2 + 1) + 1;
+               
+                       if (w > *width)
+                       {
+                               w = *width;
+                               h = 2 * (w - 1) - 1;
+                       }
+               
+                       if (arrow_type == GTK_ARROW_RIGHT)
+                       {
+                               if (*width % 2 == 1 || w % 2 == 0)
+                                       *width += 1;
+                       }
+                       else
+                       {
+                               if (*width % 2 == 0 || w % 2 == 0)
+                                       *width -= 1;
+                       }
+                       break;
+       
+               default:
+                       /* should not be reached */
+                       break;
+       }
+
+       *x += (*width - w) / 2;
+       *y += (*height - h) / 2;
+       *height = h;
+       *width = w;
+}
+
+
+void gtk_treeview_get_header_index (GtkTreeView *tv, GtkWidget *header,
+                                           gint *column_index, gint *columns,
+gboolean *resizable)
+{
+       GList *list;
+       *column_index = *columns = 0;
+       list = gtk_tree_view_get_columns (tv);
+
+       do
+       {
+               GtkTreeViewColumn *column = GTK_TREE_VIEW_COLUMN(list->data);
+               if ( column->button == header )
+               {
+                       *column_index = *columns;
+                       *resizable = column->resizable;
+               }
+               if ( column->visible )
+                       (*columns)++;
+       } while ((list = g_list_next(list)));
+}
+
+void gtk_clist_get_header_index (GtkCList *clist, GtkWidget *button,
+                                 gint *column_index, gint *columns)
+{
+       *columns = clist->columns;
+       int i;
+       
+       for (i=0; i<*columns; i++)
+       {
+               if (clist->column[i].button == button)
+               {
+                       *column_index = i;
+                       break;
+               }
+       }
+}
+
+gboolean
+sanitize_size (GdkWindow      *window,
+               gint           *width,
+               gint           *height)
+{
+       gboolean set_bg = FALSE;
+       
+       if ((*width == -1) && (*height == -1))
+       {
+               set_bg = GDK_IS_WINDOW (window);
+               gdk_window_get_size (window, width, height);
+       }
+       else if (*width == -1)
+               gdk_window_get_size (window, width, NULL);
+       else if (*height == -1)
+               gdk_window_get_size (window, NULL, height);
+       
+       return set_bg;
+}
+
+static GtkRequisition default_option_indicator_size = { 7, 13 };
+static GtkBorder default_option_indicator_spacing = { 7, 5, 2, 2 };
+
+void
+option_menu_get_props (GtkWidget      *widget,
+                       GtkRequisition *indicator_size,
+                       GtkBorder      *indicator_spacing)
+{
+       GtkRequisition *tmp_size = NULL;
+       GtkBorder *tmp_spacing = NULL;
+       
+       if (widget)
+               gtk_widget_style_get (widget, "indicator_size", &tmp_size,
+                                     "indicator_spacing", &tmp_spacing, NULL);
+       
+       if (tmp_size)
+       {
+               *indicator_size = *tmp_size;
+               g_free (tmp_size);
+       }
+       else
+               *indicator_size = default_option_indicator_size;
+       
+       if (tmp_spacing)
+       {
+               *indicator_spacing = *tmp_spacing;
+               g_free (tmp_spacing);
+       }
+       else
+               *indicator_spacing = default_option_indicator_spacing;
+}
+
+GtkWidget *special_get_ancestor(GtkWidget * widget,
+                                      GType widget_type)
+{
+       g_return_val_if_fail(GTK_IS_WIDGET(widget), NULL);
+
+       while (widget && widget->parent
+              && !g_type_is_a(GTK_WIDGET_TYPE(widget->parent),
+                              widget_type))
+               widget = widget->parent;
+
+       if (!
+           (widget && widget->parent
+            && g_type_is_a(GTK_WIDGET_TYPE(widget->parent), widget_type)))
+               return NULL;
+
+       return widget;
+}
+
+/* Dithered Gradient Buffers */
+static void
+internel_image_buffer_free_pixels (guchar *pixels, gpointer data)
+{
+       g_free (pixels);
+}
+
+static GdkPixbuf*
+internal_image_buffer_new (gint width, gint height)
+{
+       guchar *buf;
+       int rowstride;
+
+       g_return_val_if_fail (width > 0, NULL);
+       g_return_val_if_fail (height > 0, NULL);
+
+       rowstride = width * 3;
+
+       buf = g_try_malloc (height * rowstride);
+
+       if (!buf)
+               return NULL;
+
+       return gdk_pixbuf_new_from_data(buf, GDK_COLORSPACE_RGB,
+                                       FALSE, 8,
+                                       width, height, rowstride,
+                                       internel_image_buffer_free_pixels, NULL);
+}
+
+static void 
+internal_color_get_as_uchars(GdkColor *color, 
+                               guchar *red, 
+                               guchar *green, 
+                               guchar *blue)
+{
+       *red = (guchar) (color->red / 256.0);
+       *green = (guchar) (color->green / 256.0);
+       *blue = (guchar) (color->blue / 256.0);
+}                              
+
+static GdkPixbuf*
+internal_create_horizontal_gradient_image_buffer (gint width, gint height,
+                                                       GdkColor *from,
+                                                       GdkColor *to)
+{    
+       int i;
+       long r, g, b, dr, dg, db;
+       GdkPixbuf* buffer;
+       guchar *ptr;
+       guchar *pixels;
+       guchar r0, g0, b0;
+       guchar rf, gf, bf;
+       int rowstride;
+
+       buffer = internal_image_buffer_new (width, height);
+
+       if (buffer == NULL)
+               return NULL;
+    
+       pixels = gdk_pixbuf_get_pixels (buffer);
+       ptr = pixels;
+       rowstride = gdk_pixbuf_get_rowstride (buffer);
+  
+       internal_color_get_as_uchars(from, &r0, &g0, &b0);
+       internal_color_get_as_uchars(to, &rf, &gf, &bf);
+  
+       r = r0 << 16;
+       g = g0 << 16;
+       b = b0 << 16;
+    
+       dr = ((rf-r0)<<16)/width;
+       dg = ((gf-g0)<<16)/width;
+       db = ((bf-b0)<<16)/width;
+
+       /* render the first line */
+       for (i=0; i<width; i++)
+       {
+               *(ptr++) = (guchar)(r>>16);
+               *(ptr++) = (guchar)(g>>16);
+               *(ptr++) = (guchar)(b>>16);
+
+               r += dr;
+               g += dg;
+               b += db;
+       }
+
+       /* copy the first line to the other lines */
+       for (i=1; i<height; i++)
+       {
+               memcpy (&(pixels[i*rowstride]), pixels, rowstride);
+       }
+    
+       return buffer;
+}
+
+static GdkPixbuf*
+internal_create_vertical_gradient_image_buffer (gint width, gint height,
+                                               GdkColor *from,
+                                               GdkColor *to)
+{
+       gint i, j, max_block, last_block;
+       long r, g, b, dr, dg, db;
+       GdkPixbuf *buffer;
+       
+       guchar *ptr;
+       guchar point[4];
+
+       guchar r0, g0, b0;
+       guchar rf, gf, bf;
+
+       gint rowstride;
+       guchar *pixels;
+  
+       buffer = internal_image_buffer_new (width, height);
+
+       if (buffer == NULL)
+               return NULL;
+    
+       pixels = gdk_pixbuf_get_pixels (buffer);
+       rowstride = gdk_pixbuf_get_rowstride (buffer);
+  
+       internal_color_get_as_uchars(from, &r0, &g0, &b0);
+       internal_color_get_as_uchars(to, &rf, &gf, &bf);
+
+       r = r0<<16;
+       g = g0<<16;
+       b = b0<<16;
+
+       dr = ((rf-r0)<<16)/height;
+       dg = ((gf-g0)<<16)/height;
+       db = ((bf-b0)<<16)/height;
+
+       max_block = width/2;
+
+       for (i=0; i < height; i++)
+       {
+               ptr = pixels + i * rowstride;
+      
+               ptr[0] = r>>16;
+               ptr[1] = g>>16;
+               ptr[2] = b>>16;
+               
+               if (width > 1)
+               {
+                       last_block = 0;
+
+                       for (j=1; j <= max_block; j *= 2)
+                       {
+                               memcpy (&(ptr[j*3]), ptr, j*3);
+
+                               if ((j*2) >= max_block)
+                               {
+                                       last_block = j*2;
+                               }
+                       }
+
+                       if ((last_block < width) && (last_block > 0))
+                       {
+                               memcpy (&(ptr[last_block*3]), ptr, (width - last_block)*3);
+                       }
+               }
+
+               r += dr;
+               g += dg;
+               b += db;
+       }
+       
+       return buffer;
+}
+
+void
+draw_vgradient (GdkDrawable *drawable, GdkGC *gc, GtkStyle *style,
+                int x, int y, int width, int height,
+                GdkColor *left_color, GdkColor *right_color)
+{
+       #ifndef ALWAYS_DITHER_GRADIENTS
+       gboolean dither = ((style->depth > 0) && (style->depth <= 16));
+       #endif
+
+       if ((width <= 0) || (height <= 0))
+               return;
+
+       if ( left_color == NULL || right_color == NULL )
+       {
+               gdk_draw_rectangle (drawable, gc, TRUE, x, y, width, height);
+               return;
+       }
+
+       #ifndef ALWAYS_DITHER_GRADIENTS
+       if (dither)
+       #endif
+       {
+               GdkPixbuf *image_buffer = NULL;
+                               
+               image_buffer = internal_create_horizontal_gradient_image_buffer (width, height, left_color, right_color);
+       
+               if (image_buffer)
+               {
+                       gdk_draw_pixbuf(drawable, gc, image_buffer, 0, 0, x, y, width, height, GDK_RGB_DITHER_MAX, 0, 0);
+
+                       g_object_unref(image_buffer);
+               }       
+       }
+       #ifndef ALWAYS_DITHER_GRADIENTS
+       else
+       {
+               int i;
+               GdkColor col;
+               int dr, dg, db;
+               GdkGCValues old_values;
+
+               gdk_gc_get_values (gc, &old_values);
+       
+               if (left_color == right_color )
+               {
+                       col = *left_color;
+                       gdk_rgb_find_color (style->colormap, &col);
+                       gdk_gc_set_foreground (gc, &col);
+                       gdk_draw_rectangle (drawable, gc, TRUE, x, y, width, height);
+                       gdk_gc_set_foreground (gc, &old_values.foreground);
+                       return;
+               }
+       
+               col = *left_color;
+               dr = (right_color->red - left_color->red) / width;
+               dg = (right_color->green - left_color->green) / width;
+               db = (right_color->blue - left_color->blue) / width;
+
+               for (i = 0; i < width; i++)
+               {
+                       gdk_rgb_find_color (style->colormap, &col);
+       
+                       gdk_gc_set_foreground (gc, &col);
+                       gdk_draw_line (drawable, gc, x + i, y, x + i, y + height - 1);
+               
+                       col.red += dr;
+                       col.green += dg;
+                       col.blue += db;
+               }
+
+               gdk_gc_set_foreground (gc, &old_values.foreground);
+       }
+       #endif
+}
+
+void
+draw_hgradient (GdkDrawable *drawable, GdkGC *gc, GtkStyle *style,
+                int x, int y, int width, int height,
+                GdkColor *top_color, GdkColor *bottom_color)
+{      
+       #ifndef ALWAYS_DITHER_GRADIENTS
+       gboolean dither = ((style->depth > 0) && (style->depth <= 16));
+       #endif
+       
+       if ((width <= 0) || (height <= 0))
+               return;
+
+       #ifndef ALWAYS_DITHER_GRADIENTS
+       if (dither)
+       #endif
+       {
+               GdkPixbuf *image_buffer = NULL;
+                               
+               image_buffer = internal_create_vertical_gradient_image_buffer (width, height, top_color, bottom_color);
+       
+               if (image_buffer)
+               {
+                       gdk_draw_pixbuf(drawable, gc, image_buffer, 0, 0, x, y, width, height, GDK_RGB_DITHER_MAX, 0, 0);
+
+                       g_object_unref(image_buffer);
+               }       
+       }
+       #ifndef ALWAYS_DITHER_GRADIENTS
+       else
+       {
+               int i;
+               GdkColor col;
+               int dr, dg, db;
+               GdkGCValues old_values;
+       
+               gdk_gc_get_values (gc, &old_values);
+
+               if (top_color == bottom_color )
+               {
+                               col = *top_color;
+                               gdk_rgb_find_color (style->colormap, &col);
+                               gdk_gc_set_foreground (gc, &col);
+                               gdk_draw_rectangle (drawable, gc, TRUE, x, y, width, height);
+                               gdk_gc_set_foreground (gc, &old_values.foreground);
+                               return;
+               }
+
+               col = *top_color;
+               dr = (bottom_color->red - top_color->red) / height;
+               dg = (bottom_color->green - top_color->green) / height;
+               db = (bottom_color->blue - top_color->blue) / height;
+       
+               for (i = 0; i < height; i++)
+               {
+                       gdk_rgb_find_color (style->colormap, &col);
+       
+                       gdk_gc_set_foreground (gc, &col);
+                       gdk_draw_line (drawable, gc, x, y + i, x + width - 1, y + i);
+               
+                       col.red += dr;
+                       col.green += dg;
+                       col.blue += db;
+               }
+
+               gdk_gc_set_foreground (gc, &old_values.foreground);
+       }
+       #endif
+}
+
+void blend (GdkColormap *colormap,
+                       GdkColor *a, GdkColor *b, GdkColor *c, int alpha)
+{
+       int inAlpha = 100-alpha;
+       c->red   = (a->red   * alpha + b->red   * inAlpha) / 100;
+       c->green = (a->green * alpha + b->green * inAlpha) / 100;
+       c->blue  = (a->blue  * alpha + b->blue  * inAlpha) / 100;
+       
+       gdk_rgb_find_color (colormap, c);
+}
+
+GtkWidget *get_parent_window (GtkWidget *widget)
+{
+        GtkWidget *parent = widget->parent;
+
+        while (parent && GTK_WIDGET_NO_WINDOW (parent))
+                parent = parent->parent;
+
+        return parent;
+}
+
+GdkColor *get_parent_bgcolor (GtkWidget *widget)
+{
+        GtkWidget *parent = get_parent_window (widget);
+
+        if (parent && parent->style)
+                return &parent->style->bg[GTK_STATE_NORMAL];
+
+        return NULL;
+}
+
+GtkWidget *
+find_combo_box_widget (GtkWidget * widget)
+{
+       GtkWidget *result = NULL;
+       
+       if (widget && !GTK_IS_COMBO_BOX_ENTRY (widget))
+       {
+               if (GTK_IS_COMBO_BOX (widget))
+                       result = widget;
+               else
+                       result = find_combo_box_widget(widget->parent);
+       }
+       
+       return result;
+}
+
+gboolean
+is_combo_box (GtkWidget * widget)
+{
+       return (find_combo_box_widget(widget) != NULL);
+}
diff --git a/libs/clearlooks/support.h b/libs/clearlooks/support.h
new file mode 100644 (file)
index 0000000..a1430b4
--- /dev/null
@@ -0,0 +1,110 @@
+#include <gtk/gtk.h>
+#include <math.h>
+#include <string.h>
+
+/* GTK 2.2 compatibility */
+#ifndef GTK_IS_COMBO_BOX_ENTRY
+       #define GTK_IS_COMBO_BOX_ENTRY(x) 0
+#endif
+#ifndef GTK_IS_COMBO_BOX
+       #define GTK_IS_COMBO_BOX(x) 0
+#endif
+
+#define RADIO_SIZE 13
+#define CHECK_SIZE 13
+
+GtkTextDirection
+get_direction (GtkWidget *widget);
+
+GdkPixbuf *
+generate_bit (unsigned char alpha[],
+              GdkColor *color,
+              double mult);
+
+GdkPixbuf *
+colorize_bit (unsigned char *bit,
+              unsigned char *alpha,
+              GdkColor  *new_color);
+
+GdkPixmap *
+pixbuf_to_pixmap (GtkStyle  *style,
+                  GdkPixbuf *pixbuf,
+                  GdkScreen *screen);
+
+gboolean
+sanitize_size (GdkWindow      *window,
+               gint           *width,
+               gint           *height);
+
+void
+rgb_to_hls (gdouble *r,
+            gdouble *g,
+            gdouble *b);
+
+void
+hls_to_rgb (gdouble *h,
+            gdouble *l,
+            gdouble *s);
+
+void
+shade (GdkColor * a, GdkColor * b, float k);
+
+void
+draw_hgradient (GdkDrawable *drawable, GdkGC *gc, GtkStyle *style,
+                int x, int y, int width, int height,
+                GdkColor *top_color, GdkColor *bottom_color);
+
+void
+draw_vgradient (GdkDrawable *drawable, GdkGC *gc, GtkStyle *style,
+                int x, int y, int width, int height,
+                GdkColor *left_color, GdkColor *right_color);
+
+void
+arrow_draw_hline (GdkWindow     *window,
+                  GdkGC         *gc,
+                  int            x1,
+                  int            x2,
+                  int            y,
+                  gboolean       last);
+
+void
+arrow_draw_vline (GdkWindow     *window,
+                  GdkGC         *gc,
+                  int            y1,
+                  int            y2,
+                  int            x,
+                  gboolean       last);
+
+void
+draw_arrow (GdkWindow     *window,
+            GdkGC         *gc,
+            GdkRectangle  *area,
+            GtkArrowType   arrow_type,
+            gint           x,
+            gint           y,
+            gint           width,
+            gint           height);
+
+void
+calculate_arrow_geometry (GtkArrowType  arrow_type,
+                          gint         *x,
+                          gint         *y,
+                          gint         *width,
+                          gint         *height);
+                                                 
+GtkWidget *special_get_ancestor(GtkWidget * widget,
+                                      GType widget_type);
+                                          
+void blend (GdkColormap *colormap,
+            GdkColor *a, GdkColor *b, GdkColor *c, int alpha);
+                       
+GtkWidget *get_parent_window (GtkWidget *widget);
+
+GdkColor *get_parent_bgcolor (GtkWidget *widget);
+
+gboolean is_combo_box (GtkWidget * widget);
+
+GtkWidget *find_combo_box_widget (GtkWidget * widget);
+
+void gtk_clist_get_header_index (GtkCList *clist, GtkWidget *button,
+                                 gint *column_index, gint *columns);
index 2cbfb94a9f68372b5b59e705d2a16f9dbd0862b1..771de86dc8a65e3c3fd3ee1fb2e209fdbf6f1396 100644 (file)
@@ -2,6 +2,7 @@
 
 import os
 import os.path
+import sys
 import glob
 
 fst_src = glob.glob('*.c')
@@ -22,7 +23,12 @@ c = fst.Object ('vstwin', 'vstwin.c')
 d = fst.Object ('vsti', 'vsti.c')
 
 if fst['VST']:
-    Default([hackSDK,a,b,c,d])
+    if os.access ('vst/aeffectx.h', os.F_OK):
+        Default([hackSDK,a,b,c,d])
+    else:
+        print 'You have not installed the VST SDK in the correct location.'
+        print 'Please see http://ardour.org/building_vst_support for more information'
+        sys.exit (1)
     
 env.Alias('tarball', env.Distribute (env['DISTTREE'],
                                      fst_src + ['SConscript',
index cf513eb5a1b7a77b05e099a576af12cc549f12a2..e654b6cb521843a6c019b7f1aa1f09401d5416f4 100644 (file)
@@ -55,7 +55,7 @@ utils.cc
 version.cc
 """)
 
-gtkmm2ext.VersionBuild(['version.cc','gtkmm2ext/version.h'], 'SConscript')
+gtkmm2ext.VersionBuild(['version.cc','gtkmm2ext/version.h'], [])
 
 gtkmm2ext.Append(CCFLAGS="-D_REENTRANT")
 gtkmm2ext.Append(CCFLAGS="-DLOCALEDIR=\\\""+final_prefix+"/share/locale\\\"")
index eefe6ca843295125fc1fd33cb6d8266efc08718c..734c4b77e283874204884d5b6f6fda2a35acd482 100644 (file)
@@ -423,6 +423,7 @@ BarController::switch_to_spinner ()
        remove ();
        add (spinner);
        spinner.show ();
+       spinner.select_region (0, spinner.get_text_length());
        spinner.grab_focus ();
 
        switching = false;
index efce988c2938237127a0987c3b606474c563c9b1..3ab7ea883cf3607c390c48e3d7cc5b0f19e52bd0 100644 (file)
@@ -38,17 +38,18 @@ ClickBox::ClickBox (Gtk::Adjustment *adjp, const string &name, bool round_to_ste
        twidth = 0;
        theight = 0;
 
-       set_name (name);
+
        add_events (Gdk::BUTTON_RELEASE_MASK|
                    Gdk::BUTTON_PRESS_MASK|
                    Gdk::ENTER_NOTIFY_MASK|
                    Gdk::LEAVE_NOTIFY_MASK);
-       set_label ();
 
        get_adjustment().signal_value_changed().connect (mem_fun (*this, &ClickBox::set_label));
-
+       signal_style_changed().connect (mem_fun (*this, &ClickBox::style_changed));
        signal_button_press_event().connect (mem_fun (*this, &ClickBox::button_press_handler));
        signal_button_release_event().connect (mem_fun (*this, &ClickBox::button_release_handler));
+       set_name (name);
+       set_label ();
 }
 
 ClickBox::~ClickBox ()
@@ -102,6 +103,14 @@ ClickBox::set_label ()
        queue_draw ();
 }
 
+void
+ClickBox::style_changed (const Glib::RefPtr<Gtk::Style>& ignored)
+{
+
+       layout->context_changed (); 
+       layout->get_pixel_size (twidth, theight);
+}
+
 bool
 ClickBox::on_expose_event (GdkEventExpose *ev)
 {
@@ -136,7 +145,7 @@ ClickBox::on_expose_event (GdkEventExpose *ev)
                win->draw_rectangle (bg_gc, true, draw_rect.x, draw_rect.y, draw_rect.width, draw_rect.height);
 
                if (twidth && theight) {
-                       win->draw_layout (fg_gc, width - (twidth + 2), (height - theight) + 2, layout);
+                 win->draw_layout (fg_gc, (width - twidth) / 2, (height - theight) / 2, layout);
                }
        }
 
index c6f2922f3f33b8cefe8bbf5d0479e3cde1c05ed5..e4aee36ebebd36be65447e53f6ee92ea8b98a125 100644 (file)
@@ -54,6 +54,7 @@ class ClickBox : public Gtk::DrawingArea, public AutoSpin
        int theight;
 
        void set_label ();
+       void style_changed (const Glib::RefPtr<Gtk::Style> &);
        bool button_press_handler (GdkEventButton *);
        bool button_release_handler (GdkEventButton *);
 
index 14af137680577d4cf3508277c01a33c5aae0a67a..a692e64c9c36df5e817b958d18c082fb8f0635e1 100644 (file)
@@ -101,6 +101,8 @@ class UI : public Receiver, public AbstractUI<UIRequest>
 
        bool caller_is_ui_thread ();
 
+       static pthread_t thread_id() { return gui_thread; }
+
        /* Gtk-UI specific interfaces */
 
        bool running ();
index 529cca15e3e9dd4905785505c0fb4dadb76624d9..e4a9207195275d83db075d8105149a49df856d76 100644 (file)
@@ -109,7 +109,7 @@ TearOff::tearoff_click (GdkEventButton* ev)
        own_window.show_all ();
        hide ();
        Detach ();
-       return TRUE;
+       return true;
 }
 
 gint
@@ -121,19 +121,25 @@ TearOff::close_click (GdkEventButton* ev)
        own_window.hide ();
        show_all ();
        Attach ();
-       return TRUE;
+       return true;
 }              
 
 gint
 TearOff::window_button_press (GdkEventButton* ev)
 {
+       if (dragging) {
+               dragging = false;
+               own_window.remove_modal_grab();
+               return true;
+       }
+
        dragging = true;
        drag_x = ev->x_root;
        drag_y = ev->y_root;
 
        own_window.add_modal_grab();
 
-       return TRUE;
+       return true;
 }
 
 gint
@@ -141,7 +147,7 @@ TearOff::window_button_release (GdkEventButton* ev)
 {
        dragging = false;
        own_window.remove_modal_grab();
-       return TRUE;
+       return true;
 }
 
 gint
@@ -163,7 +169,7 @@ TearOff::window_motion (GdkEventMotion* ev)
        own_window.get_pointer (mx, my);
 
        if (!dragging) {
-               return TRUE;
+               return true;
        }
 
        x_delta = ev->x_root - drag_x;
@@ -175,7 +181,7 @@ TearOff::window_motion (GdkEventMotion* ev)
        drag_x = ev->x_root;
        drag_y = ev->y_root;
        
-       return TRUE;
+       return true;
 }
 
 bool
index b1c29e54876d5fa10390bd7299ad672844bd7f2c..f8e9fc5ecbbe379b9a93889c66ac19922186f1c5 100644 (file)
@@ -25,7 +25,7 @@ if conf.CheckCHeader('/System/Library/Frameworks/CoreServices.framework/Headers/
 
 sndfile = conf.Finish()
 
-libsndfile = sndfile.SharedLibrary('sndfile', sndfile_files)
+libsndfile = sndfile.SharedLibrary('sndfile-ardour', sndfile_files)
 
 sndfile_h = sndfile.Command('src/sndfile.h', ['src/sndfile.h.in'], 'cd libs/libsndfile && ./configure && cd -', ENV=os.environ)
 
index 65d0882dcefc0561ffb4826b396befe0792e80e9..477d49c6caa34648c40b825af8eb1fb0ac129334 100644 (file)
@@ -51,7 +51,7 @@ elif env['SYSMIDI'] == 'CoreMIDI':
 midi2.Append(CCFLAGS="-D_REENTRANT -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE")
 midi2.Append(CCFLAGS="-DLIBSIGC_DISABLE_DEPRECATED")
 
-midi2.VersionBuild(['version.cc','midi++/version.h'], 'SConscript')
+midi2.VersionBuild(['version.cc','midi++/version.h'],  [])
 
 libmidi2 = midi2.SharedLibrary('midi++', [ sources, sysdep_src ])
 
index e29d7543f82f4ebb052ff219b09e0414714d3e8b..1d5c7e0b30ca6a8916b6a40db1255256ff9a689b 100644 (file)
@@ -30,9 +30,8 @@ namespace MIDI {
 class PortFactory {
   public:
        Port *create_port (PortRequest &req, void* data);
-       
-       static void add_port_request (std::vector<PortRequest *> &reqs,
-                                     const std::string &reqstr);
+
+       static bool ignore_duplicate_devices (Port::Type);
 };
 
 } // namespace MIDI
index d8119e362eefcddfc6af3f5e39145298f856b9bc..de4a246bcf0ab5b3e35d8084f414f2c557051484 100644 (file)
@@ -89,20 +89,28 @@ PortFactory::create_port (PortRequest &req, void* data)
        return port;
 }
 
-void
-PortFactory::add_port_request (vector<PortRequest *> &reqs, 
-                                  const string &str)
-       
+bool 
+PortFactory::ignore_duplicate_devices (Port::Type type)
 {
-       PortRequest *req;
+       bool ret = false;
 
-       req = new PortRequest;
-       req->devname = strdup (str.c_str());
-       req->tagname = strdup (str.c_str());
+       switch (type) {
+#ifdef WITH_ALSA
+       case Port::ALSA_Sequencer:
+               ret = true;
+               break;
+#endif // WITH_ALSA
 
-       req->mode = O_RDWR;
-       req->type = Port::ALSA_RawMidi;
+#if WITH_COREMIDI
+       case Port::CoreMidi_MidiPort:
+               ret = true;
+               break;
+#endif // WITH_COREMIDI
+
+       default:
+               break;
+       }
 
-       reqs.push_back (req);
+       return ret;
 }
 
index bfe8f147b68874b5964169ac0b47420806d81c5f..970674232dae5a7b33141750634dcdaf09ee23db 100644 (file)
@@ -66,41 +66,43 @@ Manager::add_port (PortRequest &req)
        PortMap::iterator existing;
        pair<string, Port *> newpair;
 
-       if ((existing = ports_by_device.find (req.devname)) !=
-           ports_by_device.end()) {
-               
-               port = (*existing).second;
-               if (port->mode() == req.mode) {
+       if (!PortFactory::ignore_duplicate_devices (req.type)) {
+
+               if ((existing = ports_by_device.find (req.devname)) != ports_by_device.end()) {
+                       
+                       port = (*existing).second;
+                       
+                       if (port->mode() == req.mode) {
+                               
+                               /* Same mode - reuse the port, and just
+                                  create a new tag entry.
+                               */
+                               
+                               newpair.first = req.tagname;
+                               newpair.second = port;
+                               
+                               ports_by_tag.insert (newpair);
+                               return port;
+                       }
                        
-                       /* Same mode - reuse the port, and just
-                          create a new tag entry.
+                       /* If the existing is duplex, and this request
+                          is not, then fail, because most drivers won't
+                          allow opening twice with duplex and non-duplex
+                          operation.
                        */
-
-                       newpair.first = req.tagname;
-                       newpair.second = port;
-
-                       ports_by_tag.insert (newpair);
-                       return port;
-               }
-
-               /* If the existing is duplex, and this request
-                  is not, then fail, because most drivers won't
-                  allow opening twice with duplex and non-duplex
-                  operation.
-               */
-               
-               if ((req.mode == O_RDWR && port->mode() != O_RDWR) ||
-                   (req.mode != O_RDWR && port->mode() == O_RDWR)) {
-                       error << "MIDIManager: port tagged \""
-                             << req.tagname
-                             << "\" cannot be opened duplex and non-duplex"
-                             << endmsg;
-                       return 0;
+                       
+                       if ((req.mode == O_RDWR && port->mode() != O_RDWR) ||
+                           (req.mode != O_RDWR && port->mode() == O_RDWR)) {
+                               error << "MIDIManager: port tagged \""
+                                     << req.tagname
+                                     << "\" cannot be opened duplex and non-duplex"
+                                     << endmsg;
+                               return 0;
+                       }
+                       
+                       /* modes must be different or complementary */
                }
-
-               /* modes must be different or complementary */
        }
-                       
        port = factory.create_port (req, api_data);
        
        if (port == 0) {
index 4b15dd70d12889be24eb8046220a3352918f3373..f474834fd8eef7863cd03bf80dce7b5e38e40497 100644 (file)
@@ -55,7 +55,7 @@ pbd.Merge ([ libraries['sigc2'],
              libraries['glibmm2'],
              libraries['glib2'] ])
 
-pbd.VersionBuild(['version.cc','pbd/version.h'], 'SConscript')
+pbd.VersionBuild(['version.cc','pbd/version.h'], [])
 
 libpbd = pbd.SharedLibrary('pbd', pbd_files)
 Default(libpbd)
index 80c6811e6aed84be96ec20fb8c1f1c375fda648b..2264a955ae1accfda27633482b812beea5f0de35 100644 (file)
@@ -6,7 +6,7 @@
 
 using namespace PBD;
 
-sigc::signal<void,Controllable*> Controllable::GoingAway;
+sigc::signal<void,Controllable*> Controllable::Destroyed;
 sigc::signal<bool,Controllable*> Controllable::StartLearning;
 sigc::signal<void,Controllable*> Controllable::StopLearning;
 
index 60d39c91e2d675eff6825a3fd9931b9b2cf35c92..832c54acd84c186eb1cc21b55c01b87ee51cb2f3 100644 (file)
 
 #include <cmath>
 #include <stdint.h>
+#ifndef __STDC_FORMAT_MACROS
+#define __STDC_FORMAT_MACROS
+#endif
+#include <inttypes.h>
 
 #include "pbd/convert.h"
 
@@ -106,12 +110,12 @@ atof (const string& s)
 }
 
 vector<string>
-internationalize (const char **array)
+internationalize (const char *package_name, const char **array)
 {
        vector<string> v;
 
        for (uint32_t i = 0; array[i]; ++i) {
-               v.push_back (_(array[i]));
+               v.push_back (dgettext(package_name, array[i]));
        }
 
        return v;
@@ -190,23 +194,44 @@ url_decode (string& url)
        }
 }
 
+#if 0
 string
 length2string (const int32_t frames, const float sample_rate)
 {
-    int secs = (int) (frames / sample_rate);
-    int hrs =  secs / 3600;
+    int32_t secs = (int32_t) (frames / sample_rate);
+    int32_t hrs =  secs / 3600;
     secs -= (hrs * 3600);
-    int mins = secs / 60;
+    int32_t mins = secs / 60;
     secs -= (mins * 60);
 
-    int total_secs = (hrs * 3600) + (mins * 60) + secs;
-    int frames_remaining = (int) floor (frames - (total_secs * sample_rate));
+    int32_t total_secs = (hrs * 3600) + (mins * 60) + secs;
+    int32_t frames_remaining = (int) floor (frames - (total_secs * sample_rate));
     float fractional_secs = (float) frames_remaining / sample_rate;
 
     char duration_str[32];
-    sprintf (duration_str, "%02d:%02d:%05.2f", hrs, mins, (float) secs + fractional_secs);
+    sprintf (duration_str, "%02" PRIi32 ":%02" PRIi32 ":%05.2f", hrs, mins, (float) secs + fractional_secs);
 
     return duration_str;
 }
+#endif
+
+string
+length2string (const int64_t frames, const double sample_rate)
+{
+       int64_t secs = (int64_t) floor (frames / sample_rate);
+       int64_t hrs =  secs / 3600LL;
+       secs -= (hrs * 3600LL);
+       int64_t mins = secs / 60LL;
+       secs -= (mins * 60LL);
+       
+       int64_t total_secs = (hrs * 3600LL) + (mins * 60LL) + secs;
+       int64_t frames_remaining = (int64_t) floor (frames - (total_secs * sample_rate));
+       float fractional_secs = (float) frames_remaining / sample_rate;
+       
+       char duration_str[64];
+       sprintf (duration_str, "%02" PRIi64 ":%02" PRIi64 ":%05.2f", hrs, mins, (float) secs + fractional_secs);
+       
+       return duration_str;
+}
 
 } // namespace PBD
index 7c367e7462598f501cd7263662905ef52db79568..8044b51a83cd7cd7f8e6f04275e0cce78c1b0737 100644 (file)
 #ifndef __lib_pbd_command_h__
 #define __lib_pbd_command_h__
 
-#include <pbd/stateful.h>
-#include <pbd/destructible.h>
+#include <pbd/statefuldestructible.h>
 
-class Command : public Stateful, public PBD::Destructible
+class Command : public PBD::StatefulDestructible
 {
     public:
        virtual ~Command() {}
index ff8f8a9b52004a1b8342bdf67fed3d526a28da19..c88eb298bcca4193dc57a5408d3a35d3fc2dcd31 100644 (file)
@@ -6,17 +6,16 @@
 #include <sigc++/trackable.h>
 #include <sigc++/signal.h>
 
-#include <pbd/stateful.h>
-#include <pbd/id.h>
+#include <pbd/statefuldestructible.h>
 
 class XMLNode;
 
 namespace PBD {
 
-class Controllable : public virtual sigc::trackable, public Stateful {
+class Controllable : public PBD::StatefulDestructible {
   public:
        Controllable (std::string name);
-       virtual ~Controllable() { GoingAway (this); }
+       virtual ~Controllable() { Destroyed (this); }
 
        virtual void set_value (float) = 0;
        virtual float get_value (void) const = 0;
@@ -25,11 +24,11 @@ class Controllable : public virtual sigc::trackable, public Stateful {
 
        sigc::signal<void> LearningFinished;
 
-       static sigc::signal<void,Controllable*> GoingAway;
-
        static sigc::signal<bool,PBD::Controllable*> StartLearning;
        static sigc::signal<void,PBD::Controllable*> StopLearning;
 
+       static sigc::signal<void,Controllable*> Destroyed;
+
        sigc::signal<void> Changed;
 
        int set_state (const XMLNode&);
index 12e63ba6fc3c2034886226bf13f8bc573d655ac4..55006529aedc383e4a4dc0201bf3dcbe4bfd12a4 100644 (file)
@@ -31,9 +31,10 @@ int    atoi (const std::string&);
 double atof (const std::string&);
 void   url_decode (std::string&);
 
-std::string length2string (const int32_t frames, const float sample_rate);
+// std::string length2string (const int32_t frames, const float sample_rate);
+std::string length2string (const int64_t frames, const double sample_rate);
 
-std::vector<std::string> internationalize (const char **);
+std::vector<std::string> internationalize (const char *, const char **);
 
 } //namespace PBD
 
diff --git a/libs/pbd/pbd/crossthread.h b/libs/pbd/pbd/crossthread.h
new file mode 100644 (file)
index 0000000..413dea0
--- /dev/null
@@ -0,0 +1,38 @@
+#ifndef __pbd__crossthread_h__
+#define __pbd__crossthread_h__
+
+#include <pbd/abstract_ui.h>
+#include <sigc++/sigc++.h>
+#include <pthread.h>
+
+template<class RequestType> 
+void 
+call_slot_from_thread_or_dispatch_it (pthread_t thread_id, AbstractUI<RequestType>& ui, sigc::slot<void> theSlot)
+{
+       /* when called, this function will determine whether the calling thread
+          is the same as thread specified by the first argument. if it is,
+          the we execute the slot. if not, we ask the interface given by the second
+          argument to call the slot.
+       */
+
+       if (pthread_self() == thread_id) {
+               theSlot ();
+       } else {
+               ui.call_slot (theSlot);
+       }
+}
+
+template<class RequestType> 
+sigc::slot<void>
+crossthread_safe (pthread_t thread_id, AbstractUI<RequestType>& ui, sigc::slot<void> theSlot)
+{
+       /* this function returns a slot that will ensure that theSlot is either
+          called by the specified thread or passed to the interface via 
+          AbstractUI::call_slot().
+       */
+          
+       return sigc::bind (sigc::ptr_fun (call_slot_from_thread_or_dispatch_it<RequestType>), 
+                          thread_id, ui, theSlot);
+}
+
+#endif /* __pbd__crossthread_h__ */
index 6692ff564c742d3fb7a9109501feb2ab520b2fa2..7c5080633489dd7ce2050dc25d99d39aea2d4ea9 100644 (file)
@@ -5,14 +5,22 @@
 
 namespace PBD {
 
-class Destructible : public virtual sigc::trackable {
-  public:
-       Destructible() {}
-       virtual ~Destructible () {}
+/* be very very careful using this class. it does not inherit from sigc::trackable and thus
+   should only be used in multiple-inheritance situations involving another type
+   that does inherit from sigc::trackable (or sigc::trackable itself)
+*/
 
+class ThingWithGoingAway {
+  public:
+       virtual ~ThingWithGoingAway () {}
        sigc::signal<void> GoingAway;
+};
 
+class Destructible : public sigc::trackable, public ThingWithGoingAway {
+  public:
+       virtual ~Destructible () {}
        void drop_references () const { GoingAway(); }
+
 };
 
 }
index d42972d54627b5da0d6e8daa9d3e433f92f63da9..fe1aa8e7d049dd827fbdf4b784a980935bcc01b0 100644 (file)
@@ -28,19 +28,11 @@ using std::endl;
 #include <pbd/command.h>
 #include <pbd/stacktrace.h>
 #include <pbd/xml++.h>
+#include <pbd/shiva.h>
+
 #include <sigc++/slot.h>
 #include <typeinfo>
 
-/* grrr, strict C++ says that static member functions are not C functions, but we also want
-   to be able to pack this into a sigc::ptr_fun and not sigc::mem_fun, so we have to make
-   it a genuine function rather than a member.
-*/
-
-static void object_death (Command* mc) {
-       cerr << "\n\n\n---> OBJECT DEATH FIRED FOR " << mc << endl;
-       delete mc;
-}
-
 /** This command class is initialized with before and after mementos 
  * (from Stateful::get_state()), so undo becomes restoring the before
  * memento, and redo is restoring the after memento.
@@ -55,8 +47,8 @@ class MementoCommand : public Command
                        XMLNode *after
                        ) 
             : obj(object), before(before), after(after) {
-               cerr << "MC @ " << this << " is a " << typeid (obj_T).name() << endl;
-               obj.GoingAway.connect (sigc::bind (sigc::ptr_fun (object_death), static_cast<Command*>(this)));
+               /* catch destruction of the object */
+               new PBD::Shiva<obj_T,MementoCommand<obj_T> > (object, *this);
        }
 
        ~MementoCommand () {
index e81db8ba8717108d9cb8dcf110bb2fee219c4a74..a8f3cdd5bc72e5e5b23026ddcc7a6a9013b7736e 100644 (file)
@@ -17,7 +17,7 @@ class RCUManager
  
        virtual ~RCUManager() { delete m_rcu_value; }
  
-        boost::shared_ptr<T> reader () const { return *((boost::shared_ptr<T> *) g_atomic_pointer_get (&m_rcu_value)); }
+        boost::shared_ptr<T> reader () const { return *((boost::shared_ptr<T> *) g_atomic_pointer_get (the_pointer())); }
  
        virtual boost::shared_ptr<T> write_copy () = 0;
        virtual bool update (boost::shared_ptr<T> new_value) = 0;
index 5110f483324b950485c4e8517edaa817fc8ba504..53b613ea2b0cc14e1f66e1a096a477d31145b5f6 100644 (file)
@@ -5,28 +5,96 @@
 
 namespace PBD {
 
-template<typename ObjectWithGoingAway, typename ObjectToBeDestroyed>
-
 /* named after the Hindu god Shiva, The Destroyer */
 
+template<typename ObjectWithGoingAway, typename ObjectToBeDestroyed>
 class Shiva {
   public:
        Shiva (ObjectWithGoingAway& emitter, ObjectToBeDestroyed& receiver) {
 
                /* if the emitter goes away, destroy the receiver */
 
-               _connection1 = emitter.GoingAway.connect 
+               _connection = emitter.GoingAway.connect 
                        (sigc::bind (sigc::mem_fun 
                                     (*this, &Shiva<ObjectWithGoingAway,ObjectToBeDestroyed>::destroy),
                                     &receiver));
+       }
+
+       ~Shiva() { 
+               forget ();
+       }
+
+  private:
+       sigc::connection _connection;
+
+       void destroy (ObjectToBeDestroyed* obj) {
+               delete obj;
+               forget ();
+       }
+
+       void forget () {
+               _connection.disconnect ();
+       }
+                       
+};
+
+template<typename ObjectWithGoingAway, typename ObjectToBeDestroyed>
+class ProxyShiva {
+  public:
+       ProxyShiva (ObjectWithGoingAway& emitter, ObjectToBeDestroyed& receiver, void (*callback)(ObjectToBeDestroyed*, ObjectWithGoingAway*)) {
+
+               /* if the emitter goes away, destroy the receiver */
+
+               _callback = callback;
+               _callback_argument1 = &receiver;
+               _callback_argument2 = &emitter;
+
+               _connection = emitter.GoingAway.connect 
+                       (sigc::bind (sigc::mem_fun 
+                                    (*this, &ProxyShiva<ObjectWithGoingAway,ObjectToBeDestroyed>::destroy),
+                                    &receiver));
+       }
+
+       ~ProxyShiva() { 
+               forget ();
+       }
+
+  private:
+       sigc::connection _connection;
+       void (*_callback) (ObjectToBeDestroyed*, ObjectWithGoingAway*);
+       ObjectToBeDestroyed* _callback_argument1;
+       ObjectWithGoingAway* _callback_argument2;
+
+       void destroy (ObjectToBeDestroyed* obj) {
+               /* callback must destroy obj if appropriate, not done here */
+               _callback (obj, _callback_argument2);
+               forget ();
+       }
+
+       void forget () {
+               _connection.disconnect ();
+       }
+};
+
+template<typename ObjectWithGoingAway, typename ObjectToBeDestroyed>
+class PairedShiva {
+  public:
+       PairedShiva (ObjectWithGoingAway& emitter, ObjectToBeDestroyed& receiver) {
+
+               /* if the emitter goes away, destroy the receiver */
+
+               _connection1 = emitter.GoingAway.connect 
+                       (sigc::bind (sigc::mem_fun 
+                                    (*this, &PairedShiva<ObjectWithGoingAway,ObjectToBeDestroyed>::destroy),
+                                    &receiver));
 
                /* if the receiver goes away, forget all this nonsense */
 
                _connection2 = receiver.GoingAway.connect 
-                       (sigc::mem_fun (*this, &Shiva<ObjectWithGoingAway,ObjectToBeDestroyed>::forget));
+                       (sigc::mem_fun (*this, &PairedShiva<ObjectWithGoingAway,ObjectToBeDestroyed>::forget));
        }
 
-       ~Shiva() { 
+       ~PairedShiva() { 
                forget ();
        }
 
index e78cc4bdaa2cf0ad819900f73f92c640696f1903..708c10fc8e513d5066159a45ca34888fb1a631ba 100644 (file)
@@ -5,9 +5,21 @@
 #include <pbd/destructible.h>
 
 namespace PBD {
+
 class StatefulDestructible : public Stateful, public Destructible 
 {
 };
+
+/* be very very careful using this class. it does not inherit from sigc::trackable and thus
+   should only be used in multiple-inheritance situations involving another type
+   that does inherit from sigc::trackable (or sigc::trackable itself)
+*/
+
+class StatefulThingWithGoingAway : public Stateful, public ThingWithGoingAway
+{
+};
+
 }
 
+
 #endif /* __pbd_stateful_destructible_h__ */
index 943c115af2a1f9a6e913fe1833192ae9b76ae4d1..eb46750e4ffb160c4f0aa224f8d7865377d33934 100644 (file)
@@ -70,9 +70,11 @@ class UndoTransaction : public Command
        struct timeval        _timestamp;
        std::string           _name;
        bool                  _clearing;
+
+       friend void command_death (UndoTransaction*, Command *);
 };
 
-class UndoHistory
+class UndoHistory : public sigc::trackable
 {
   public:
        UndoHistory();
@@ -95,6 +97,8 @@ class UndoHistory
         XMLNode &get_state();
         void save_state();
 
+       sigc::signal<void> Changed;
+
   private:
        bool _clearing;
        std::list<UndoTransaction*> UndoList;
index 5dcb4f084aa5e9ea9a1a575c2006b8b6f10cce89..70e231e71765e67fa32622542634bfb203c06233 100644 (file)
@@ -87,9 +87,10 @@ public:
   const string & set_content (const string &);
   XMLNode *add_content(const string & = string());
 
-  const XMLNodeList & children (const string & = string()) const;
+  const XMLNodeList & children (const string& str = string()) const;
   XMLNode *add_child (const char *);
   XMLNode *add_child_copy (const XMLNode&);
+  XMLNode *child (const char*) const;
   void add_child_nocopy (XMLNode&);
 
   const XMLPropertyList & properties() const { return _proplist; };
index af408a24a4a9eaf9ac5f2b507d2682e795aa4d03..277b83bfced06c3897421356ba6b5b89c719c3d8 100644 (file)
 
 #include <pbd/undo.h>
 #include <pbd/xml++.h>
+#include <pbd/shiva.h>
 
 #include <sigc++/bind.h>
 
 using namespace std;
 using namespace sigc;
 
-/* grrr, strict C++ says that static member functions are not C functions, but we also want
-   to be able to pack this into a sigc::ptr_fun and not sigc::mem_fun, so we have to make
-   it a genuine function rather than a member.
-*/
-
-static void command_death (UndoTransaction* ut, Command* c)
-{
-       if (ut->clearing()) {
-               return;
-       }
-
-       ut->remove_command (c);
-
-       if (ut->empty()) {
-               delete ut;
-       }
-}
-
-
 UndoTransaction::UndoTransaction ()
 {
        _clearing = false;
@@ -68,6 +50,20 @@ UndoTransaction::~UndoTransaction ()
        clear ();
 }
 
+void 
+command_death (UndoTransaction* ut, Command* c)
+{
+       if (ut->clearing()) {
+               return;
+       }
+
+       ut->remove_command (c);
+
+       if (ut->empty()) {
+               delete ut;
+       }
+}
+
 UndoTransaction& 
 UndoTransaction::operator= (const UndoTransaction& rhs)
 {
@@ -81,7 +77,8 @@ UndoTransaction::operator= (const UndoTransaction& rhs)
 void
 UndoTransaction::add_command (Command *const action)
 {
-       action->GoingAway.connect (bind (sigc::ptr_fun (command_death), this, const_cast<Command*>(action)));
+       /* catch death */
+       new PBD::ProxyShiva<Command,UndoTransaction> (*action, *this, &command_death);
        actions.push_back (action);
 }
 
@@ -160,6 +157,8 @@ UndoHistory::add (UndoTransaction* const ut)
        UndoList.push_back (ut);
 
        /* we are now owners of the transaction */
+
+       Changed (); /* EMIT SIGNAL */
 }
 
 void
@@ -171,6 +170,8 @@ UndoHistory::remove (UndoTransaction* const ut)
 
        UndoList.remove (ut);
        RedoList.remove (ut);
+
+       Changed (); /* EMIT SIGNAL */
 }
 
 void
@@ -185,6 +186,8 @@ UndoHistory::undo (unsigned int n)
                ut->undo ();
                RedoList.push_back (ut);
        }
+
+       Changed (); /* EMIT SIGNAL */
 }
 
 void
@@ -199,6 +202,8 @@ UndoHistory::redo (unsigned int n)
                ut->redo ();
                UndoList.push_back (ut);
        }
+
+       Changed (); /* EMIT SIGNAL */
 }
 
 void
@@ -207,6 +212,9 @@ UndoHistory::clear_redo ()
        _clearing = true;
        RedoList.clear ();
        _clearing = false;
+
+       Changed (); /* EMIT SIGNAL */
+
 }
 
 void
@@ -215,6 +223,8 @@ UndoHistory::clear_undo ()
        _clearing = true;
        UndoList.clear ();
        _clearing = false;
+
+       Changed (); /* EMIT SIGNAL */
 }
 
 void
@@ -222,6 +232,8 @@ UndoHistory::clear ()
 {
        clear_undo ();
        clear_redo ();
+
+       Changed (); /* EMIT SIGNAL */
 }
 
 XMLNode & UndoHistory::get_state()
index e35a8a8c0ea872ec7696cc51e459ca31ebaeacea..53616133ade362f96c87e2778d1b38b7892fdb93 100644 (file)
@@ -11,6 +11,10 @@ strip_whitespace_edges (string& str)
                                    
     len = str.length();
 
+    if (len == 1) {
+           return;
+    }
+
     /* strip front */
                                        
     for (i = 0; i < len; ++i) {
@@ -19,12 +23,21 @@ strip_whitespace_edges (string& str)
         }
     }
 
+    if (i == len) {
+           /* its all whitespace, not much we can do */
+           return;
+    }
+
     /* strip back */
     
     if (len > 1) {
     
            s = i;
            i = len - 1;
+
+           if (s == i) {
+                   return;
+           }
            
            do {
                    if (isgraph (str[i]) || i == 0) {
index 03fa11627976ca6bff3fa26ad1fcec849acaf8b6..8d783d59f2da5616ede495ef4908b31326d5c2f6 100644 (file)
@@ -110,7 +110,7 @@ XMLTree::write(void) const
        doc = xmlNewDoc((xmlChar *) "1.0");
        xmlSetDocCompressMode(doc, _compression);
        writenode(doc, _root, doc->children, 1);
-       result = xmlSaveFormatFile(_filename.c_str(), doc, 1);
+       result = xmlSaveFormatFileEnc(_filename.c_str(), doc, "UTF-8", 1);
        xmlFreeDoc(doc);
        
        if (result == -1) {
@@ -216,13 +216,35 @@ XMLNode::set_content(const string & c)
        return _content;
 }
 
+XMLNode*
+XMLNode::child (const char *name) const
+{
+       /* returns first child matching name */
+
+       XMLNodeConstIterator cur;
+       
+       if (name == 0) {
+               return 0;
+       }
+           
+       for (cur = _children.begin(); cur != _children.end(); ++cur) {
+               if ((*cur)->name() == name) {
+                       return *cur;
+               }
+       }
+           
+       return 0;
+}
+
 const XMLNodeList & 
-XMLNode::children(const string & n) const
+XMLNode::children(const string& n) const
 {
+       /* returns all children matching name */
+
        static XMLNodeList retval;
        XMLNodeConstIterator cur;
        
-       if (n.length() == 0) {
+       if (n.empty()) {
                return _children;
        }
            
index ce59b1c67c8aabaf93c695d8616576906b3b7fd9..88aeeda376c6b3deef62d0927898dad52e71ff34 100644 (file)
@@ -33,6 +33,7 @@ cp.Append(CXXFLAGS="-DLOCALEDIR=\\\""+final_prefix+"/share/locale\\\"")
 
 cp.Merge ([
     libraries['ardour'],
+    libraries['sndfile-ardour'],
     libraries['sigc2'],
     libraries['pbd'],
     libraries['midi++2'],
index 07e000ab201d3dfb2332f727513724b0b3c67b14..e6642d3394cdf6f30fd45bae00094856500aa978 100644 (file)
@@ -55,7 +55,7 @@ BasicUI::register_thread (std::string name)
 void
 BasicUI::loop_toggle () 
 {
-       if (Config->get_auto_loop()) {
+       if (session->get_play_loop()) {
                session->request_play_loop (false);
        } else {
                session->request_play_loop (true);
@@ -107,7 +107,7 @@ BasicUI::transport_play (bool from_last_start)
 {
        bool rolling = session->transport_rolling ();
 
-       if (Config->get_auto_loop()) {
+       if (session->get_play_loop()) {
                session->request_play_loop (false);
        } 
 
index 2e2d9432443965ac84ba8b512ff3d43b35c69c7d..ea85a32a778076b36b7a0afe55ef754c1b1df9e1 100644 (file)
@@ -718,7 +718,7 @@ TranzportControlProtocol::update_state ()
 
        /* global */
 
-       if (Config->get_auto_loop()) {
+       if (session->get_play_loop()) {
                pending_lights[LightLoop] = true;
        } else {
                pending_lights[LightLoop] = false;
@@ -760,6 +760,14 @@ TranzportControlProtocol::update_state ()
                }
        }
 
+       if (pending_lights[LightTrackrec] != lights[LightTrackrec]) {
+               if (pending_lights[LightTrackrec]) {
+                       light_on (LightTrackrec);
+               } else {
+                       light_off (LightTrackrec);
+               }
+       }
+
        if (pending_lights[LightTrackmute] != lights[LightTrackmute]) {
                if (pending_lights[LightTrackmute]) {
                        light_on (LightTrackmute);
diff --git a/svn_revision.h b/svn_revision.h
new file mode 100644 (file)
index 0000000..77f7296
--- /dev/null
@@ -0,0 +1,4 @@
+#ifndef __ardour_svn_revision_h__
+#define __ardour_svn_revision_h__
+static const char* ardour_svn_revision = "1137";
+#endif
index fb739a94b7ec54a7aef1f6a73b76b57dd30f2d89..4731120349cfb146a2432b163d4b704e85e7a0cb 100644 (file)
@@ -85,6 +85,8 @@ style "default_base" = "medium_text"
   GtkButton::default_outside_border = { 0, 0, 0, 0 }
   GtkTreeView::vertical-padding = 0
   GtkTreeView::horizontal-padding = 0
+  GtkTreeView::even-row-color = { 0, 0, 0.12 }
+  GtkTreeView::odd-row-color = { 0, 0, 0 }
   
   fg[NORMAL] = { 0.80, 0.80, 0.80 }    
   fg[ACTIVE] = { 0.80, 0.80, 0.80 }    
@@ -92,8 +94,8 @@ style "default_base" = "medium_text"
   fg[INSENSITIVE] = { 0.80, 0.80, 0.80 }       
   fg[SELECTED] = { 0.80, 0.80, 0.80 }  
   
-  bg[NORMAL] = { 0.40, 0.40, 0.40 }
-  bg[ACTIVE] = { 0.40, 0.40, 0.40 }
+  bg[NORMAL] = { 0.35, 0.35, 0.40 }
+  bg[ACTIVE] = { 0.35, 0.35, 0.40 }
   bg[PRELIGHT] = "#565690"
   bg[INSENSITIVE] = { 0.10, 0.10, 0.10 }
   bg[SELECTED] = { 0, 0.40, 0.60 }
@@ -104,24 +106,25 @@ style "default_base" = "medium_text"
   text[INSENSITIVE] = { 0.80, 0.80, 0.80}      
   text[SELECTED] = { 1.0, 1.0, 1.0 }
   
-  base[ACTIVE]     = "#2f272f"
-  base[NORMAL]      =  "#1c1e21"
+  base[ACTIVE]     = "#272a2f"
+  base[NORMAL]      =  "#1a1e20"
   base[PRELIGHT]     = { 0.20, 0.20, 0.20 }
   base[INSENSITIVE]  = "#4c5159"
   base[SELECTED]     = { 0.25, 0.25, 0.25 }
-  
-  engine "clearlooks"  {
+
+  engine "clearlooks" 
+  {
     menubarstyle      = 2       # 0 = flat, 1 = sunken, 2 = flat gradient
     menuitemstyle     = 1       # 0 = flat, 1 = 3d-ish (gradient), 2 = 3d-ish (button)
     listviewitemstyle = 1       # 0 = flat, 1 = 3d-ish (gradient)
-    progressbarstyle  = 0       # 0 = candy bar, 1 = flat
+    progressbarstyle  = 1       # 0 = candy bar, 1 = fancy candy bar, 2 = flat
   }
 }
 
 style "base_frame"
 {
        fg[NORMAL] = { 0.80, 0.80, 0.80 }
-       bg[NORMAL] = { 0.40, 0.40, 0.40 }
+       bg[NORMAL] = { 0.35, 0.35, 0.40 }
 }
 
 style "transport_base" = "medium_bold_text"
@@ -145,11 +148,11 @@ style "default_buttons_menus"
   font_name = "sans 11"
   fg[ACTIVE] = { 1.0, 1.0, 1.0 }
   
-  bg[NORMAL] = { 0.35, 0.35, 0.35 }
+  bg[NORMAL] = { 0.30, 0.30, 0.35 }
   bg[ACTIVE] = "#565690"
-  bg[PRELIGHT] = { 0.20, 0.20, 0.20 }
-  bg[INSENSITIVE] = { 0.20, 0.20, 0.20 }
-  bg[SELECTED] = { 0.20, 0.20, 0.20 }  
+  bg[PRELIGHT] = { 0.15, 0.15, 0.20 }
+  bg[INSENSITIVE] = { 0.15, 0.15, 0.20 }
+  bg[SELECTED] = { 0.15, 0.15, 0.20 }  
 }
 
 style "very_small_button" = "default_buttons_menus"
@@ -218,6 +221,15 @@ style "mute_button" = "small_button"
        bg[ACTIVE] = { 1.0, 0.98, 0.53 }
        
        fg[PRELIGHT] = { 0, 0, 0 }
+       fg[ACTIVE] = { 0, 0, 0 }
+}
+
+
+style "multiline_combo" = "small_button"
+{
+       font_name = "sans 8"
+       xthickness = 0
+       ythickness = 0
 }
 
 style "mixer_mute_button" = "mute_button"
@@ -239,8 +251,8 @@ style "mixer_red_active_button" = "very_small_button"
        fg[ACTIVE] = { 0, 1.0, 1.0 }
        bg[ACTIVE] = { 0.7, 0, 0 }
 
-       base[INSENSITIVE] = { 0.21, 0.21, 0.21 }
-       bg[INSENSITIVE] = { 0.21, 0.21, 0.21 }
+       base[INSENSITIVE] = { 0.16, 0.16, 0.21 }
+       bg[INSENSITIVE] = { 0.16, 0.16, 0.21 }
 }
 
 style "time_button" = "default_buttons_menus"
@@ -274,9 +286,9 @@ style "shuttle_control" = "very_small_text"
        fg[SELECTED] = { 0.85, 0.92, 0.98 }
        fg[INSENSITIVE] = { 0.85, 0.92, 0.98 }
 
-       bg[NORMAL] = { 0.31, 0.31, 0.31 }
-       bg[PRELIGHT] = { 0.31, 0.31, 0.31 }
-       bg[INSENSITIVE] = { 0.31, 0.31, 0.31 }
+       bg[NORMAL] = { 0.26, 0.26, 0.31 }
+       bg[PRELIGHT] = { 0.26, 0.26, 0.31 }
+       bg[INSENSITIVE] = { 0.26, 0.26, 0.31 }
        bg[ACTIVE] = { 0.50, 1.0, 0.50 }
        bg[SELECTED] = { 1.0, 0.04, 0.04 }
 }
@@ -306,16 +318,16 @@ style "option_entry"  = "default_base"
        fg[ACTIVE] = { 0.50, 1.0, 1.0 }
        fg[INSENSITIVE] = { 0.80, 0.80, 0.80 }
        
-       base[INSENSITIVE] = { 0.12, 0.12, 0.12 }
+       base[INSENSITIVE] = { 0.07, 0.07, 0.12 }
        
-       bg[NORMAL] = { 0.40, 0.40, 0.40 }
-       bg[ACTIVE] = { 0.40, 0.40, 0.40 }
+       bg[NORMAL] = { 0.35, 0.35, 0.40 }
+       bg[ACTIVE] = { 0.35, 0.35, 0.40 }
 }
 
 style "red_when_active" = "medium_text"
 {
        fg[NORMAL] = { 0.80, 0.80, 0.80 }
-       bg[NORMAL] = { 0.31, 0.31, 0.31 }
+       bg[NORMAL] = { 0.26, 0.26, 0.31 }
 
        fg[ACTIVE] = { 0.80, 0.80, 0.80 }
        bg[ACTIVE] = { 1.0, 0, 0}
@@ -335,13 +347,13 @@ style "xrun_warn"
        bg[ACTIVE] = { 0.09, 1.0, 0.46 }
 }
 
-style "menu_bar_base"
+style "menu_bar_base" = "default_base"
 {
-  bg[NORMAL] = { 0, 0, 0 }     
-  bg[ACTIVE] = { 0, 0, 0 }
-  bg[PRELIGHT] = { 0, 0, 0 }
-  bg[INSENSITIVE] = { 0, 0, 0 }
-  bg[SELECTED] = { 0, 0, 0 }
+       bg[NORMAL] = { 0.2, 0.2, 0.3 }
+       bg[ACTIVE] = { 0, 0, 0 }
+       bg[PRELIGHT] = { 0, 0, 0 }
+       bg[INSENSITIVE] = { 0, 0, 0 }
+       bg[SELECTED] = { 0, 0, 0 }
 }
 
 style "fatal_message" = "medium_text"
@@ -390,7 +402,7 @@ style "medium_entry" = "medium_text"
        fg[ACTIVE] = { 0.50, 1.0, 1.0 }
        fg[SELECTED] = { 0.50, 1.0, 0.50 }
        
-       bg[NORMAL] = { 0.40, 0.40, 0.40 }
+       bg[NORMAL] = { 0.35, 0.35, 0.40 }
        
        base[NORMAL] = { 0, 0, 0 }
        base[ACTIVE] = { 0, 0, 0 }
@@ -412,7 +424,7 @@ style "medium_bold_entry"  = "medium_bold_text"
        fg[NORMAL] = { 0.50, 1.0, 1.0 }
        fg[ACTIVE] = { 0.50, 1.0, 1.0 }
        
-       bg[NORMAL] = { 0.40, 0.40, 0.40 }
+       bg[NORMAL] = { 0.35, 0.35, 0.40 }
        
        base[NORMAL] = { 0, 0, 0 }
        base[ACTIVE] = { 0, 0, 0 }
@@ -441,7 +453,7 @@ style "small_bold_entry" = "small_bold_text"
        fg[NORMAL] = { 0.50, 1.0, 1.0 }
        fg[ACTIVE] = { 0.50, 1.0, 1.0 }
        
-       bg[NORMAL] = { 0.40, 0.40, 0.40 }
+       bg[NORMAL] = { 0.35, 0.35, 0.40 }
        
        base[NORMAL] = { 0, 0, 0 }
        base[ACTIVE] = { 0, 0, 0 }
@@ -513,7 +525,7 @@ style "audio_track_base" = "default_base"
 {
   font_name = "sans 8"
   fg[NORMAL] = { 0.77, 0.77, 0.72 }    
-  bg[NORMAL] = { 0.18, 0.18, 0.22 }
+  bg[NORMAL] = { 0.18, 0.19, 0.22 }
   bg[ACTIVE] = { 0.20, 0.20, 0.20 }    
   bg[PRELIGHT] = { 0.20, 0.20, 0.20 }
   bg[INSENSITIVE] = { 0.20, 0.20, 0.20 }
@@ -526,7 +538,7 @@ style "audio_bus_base"
   fg[NORMAL] = { 0.77, 0.77, 0.72 }    
   fg[NORMAL] = { 0.7, 0.8, 0.2 }       
   #bg[NORMAL] = {0, 0.36, 0.40 }
-  bg[NORMAL] = "#464666"
+  bg[NORMAL] = "#444466"       
 }
 
 style "track_name_display"
@@ -550,7 +562,7 @@ style "active_track_name_display"
 
 style "track_separator"
 {
-       bg[NORMAL] = { 0.40, 0.40, 0.40 }
+       bg[NORMAL] = { 0.35, 0.35, 0.40 }
 }
 
 #
@@ -618,11 +630,11 @@ style "region_list_display" = "small_bold_text"
 
 style "main_canvas_area"
 {
-       bg[NORMAL] = { 0.38, 0.38, 0.38 }
-       bg[ACTIVE] = { 0.38, 0.38, 0.38 }
-       bg[INSENSITIVE] = { 0.38, 0.38, 0.38 }
-       bg[SELECTED] = { 0.38, 0.38, 0.38 }
-       bg[PRELIGHT] = { 0.38, 0.38, 0.38 }
+       bg[NORMAL] = { 0.32, 0.32, 0.36 }
+       bg[ACTIVE] = { 0.38, 0.38, 0.42 }
+       bg[INSENSITIVE] = { 0.38, 0.38, 0.42 }
+       bg[SELECTED] = { 0.38, 0.38, 0.42 }
+       bg[PRELIGHT] = { 0.38, 0.38, 0.42 }
 }
 
 style "track_controls_inactive"
@@ -665,7 +677,7 @@ style "plugin_slider"
 
        fg[NORMAL] = { 0.37, 0.43, 0.52 }
        fg[ACTIVE] = { 0.37, 0.43, 0.52 }
-       fg[INSENSITIVE] = {0.40, 0.40, 0.40 } # matches default_base
+       fg[INSENSITIVE] = {0.35, 0.35, 0.40 } # matches default_base
        fg[SELECTED] = { 0.37, 0.43, 0.52 }
        fg[PRELIGHT] = { 0.37, 0.43, 0.52 }
 
@@ -748,12 +760,6 @@ style "pan_zone" = "default_base"
        fg[ACTIVE] = { 0.95, 0.48, 0.11 }
 }
 
-style "wall_clock" = "medium_bold_text"
-{
-       fg[NORMAL] = { 1.0, 1.0, 1.0 }
-       bg[NORMAL] = { 0, 0, 0 }
-}
-
 style "paler_red_when_active" = "medium_text"
 {
        fg[NORMAL] = { 0.80, 0.80, 0.80 }
@@ -792,26 +798,78 @@ style "selected_strip_frame"
 style "flashing_alert" = "very_small_text"
 {
        fg[NORMAL] = { 0.80, 0.80, 0.80 }
-       bg[NORMAL] = { 0.31, 0.31, 0.31 }
+       bg[NORMAL] = { 0.26, 0.26, 0.31 }
 
        fg[ACTIVE] = { 0.80, 0.80, 0.80 }
        bg[ACTIVE] = { 1.0, 0, 0}
 }
 
-style "selected_io_selector_port_list" = "medium_text"
+style "selected_io_selector_port_list" = "medium_bold_text"
 {
-       fg[NORMAL] = { 0.50, 1.0, 1.0 }
-       fg[SELECTED] = { 0.50, 1.0, 1.0 }
-       base[NORMAL] = { 0, 0, 0 }
-       base[SELECTED] = { 0, 0, 0 }
+       GtkTreeView::even-row-color = { 0.64, 0.68, 0.54 }
+       GtkTreeView::odd-row-color = { 0.64, 0.68, 0.54 }
+
+# fg is used to color the fg (text) of the column header button
+
+       fg[NORMAL] = { 0.80, 0.80, 0.70 }
+       fg[SELECTED] = { 0.80, 0.80, 0.70 }
+       fg[ACTIVE] = { 0.80, 0.80, 0.70 }
+       fg[PRELIGHT] = { 0.80, 0.80, 0.70 }
+       fg[INSENSITIVE] = { 0.80, 0.80, 0.70 }
+
+# bg is used used to color the background of the column header button
+
+       bg[NORMAL] = { 0.30, 0.30, 0.35 }
+       bg[ACTIVE] = { 0.30, 0.30, 0.35 }
+       bg[PRELIGHT] = { 0.30, 0.30, 0.35 }
+       bg[INSENSITIVE] = { 0.30, 0.30, 0.35 }
+       bg[SELECTED] = { 0.30, 0.30, 0.35 }
+
+# text is used to color the treeview row text
+
+       text[NORMAL] = { 0.80, 0.80, 0.70 }
+       text[SELECTED] = { 0.80, 0.80, 0.70 }
+
+# base is used to color a treeview with no rows
+
+       base[NORMAL] = { 0.64, 0.68, 0.54 }
+       base[ACTIVE] = { 0.64, 0.68, 0.54 }
+       base[PRELIGHT] = { 0.64, 0.68, 0.54 }
+       base[INSENSITIVE] = { 0.64, 0.68, 0.54 }
+       base[SELECTED] = { 0.64, 0.68, 0.54 }
 }
 
 style "io_selector_port_list" = "medium_text"
 {
-       fg[NORMAL] = {0.80, 0.80, 0.70 }
-       fg[SELECTED] = {0.80, 0.80, 0.70 }
-       base[NORMAL] = { 0.26, 0.26, 0.26 }
-       base[SELECTED] = { 0.26, 0.26, 0.26 }
+
+# fg is used to color the fg (text) of the column header button
+
+       fg[NORMAL] = { 0.80, 0.80, 0.70 }
+       fg[SELECTED] = { 0.80, 0.80, 0.70 }
+       fg[ACTIVE] = { 0.80, 0.80, 0.70 }
+       fg[PRELIGHT] = { 0.80, 0.80, 0.70 }
+       fg[INSENSITIVE] = { 0.80, 0.80, 0.70 }
+
+# bg is used used to color the background of the column header button
+
+       bg[NORMAL] = { 0.30, 0.30, 0.35 }
+       bg[ACTIVE] = { 0.30, 0.30, 0.35 }
+       bg[PRELIGHT] = { 0.30, 0.30, 0.35 }
+       bg[INSENSITIVE] = { 0.30, 0.30, 0.35 }
+       bg[SELECTED] = { 0.30, 0.30, 0.35 }
+
+# text is used to color the treeview row text
+
+       text[NORMAL] = { 0.80, 0.80, 0.70 }
+       text[SELECTED] = { 0.80, 0.80, 0.70 }
+
+# base is used to color a treeview with no rows
+
+       base[NORMAL] = { 0, 0, 0 }
+       base[ACTIVE] = { 0, 0, 0 }
+       base[PRELIGHT] = { 0, 0, 0 }
+       base[INSENSITIVE] = { 0, 0, 0 }
+       base[SELECTED] = { 0, 0, 0 }
 }
 
 style "io_selector_notebook" = "default_base"
@@ -945,6 +1003,7 @@ 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"
@@ -1089,8 +1148,6 @@ widget "*MixerTrackDisplayList" style "track_list_display"
 widget "*MixerSnapshotDisplayList" style "track_list_display"
 widget "*MixerAuxDisplayList" style "track_list_display"
 widget "*MixerGroupList" style "track_list_display"
-widget "*WallClock" style "wall_clock"
-widget "*CPULoad" style "wall_clock"
 widget "*RegionEditorLabel" style "medium_text"
 widget "*RegionEditorSmallLabel" style "small_text"
 widget "*RegionEditorEntry" style "medium_entry"
@@ -1124,7 +1181,9 @@ 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"
index 988a386de337315d02cb9ed8197ab10a762fd658..2a4d492f8a6b5ff676cbc768e3760583a29dc4dd 100644 (file)
@@ -35,7 +35,7 @@ ardour_vst.Merge ([
     libraries['libgnomecanvas2'],
     libraries['libgnomecanvasmm'],
     libraries['sysmidi'],
-    libraries['sndfile'],
+    libraries['sndfile-ardour'],
     libraries['flac'],
     libraries['lrdf'],
     libraries['glibmm2'],
index 286f951b0068b8e4e9bd568b81566ee26e658e06..093c4b72da3d048c089d9a631c094ff9a8f03eea 100755 (executable)
@@ -1,4 +1,5 @@
 #!/bin/sh      
-export ARDOUR_PATH=../gtk2_ardour/glade:../gtk2_ardour/pixmaps:../gtk2_ardour
+export ARDOUR_PATH=../gtk2_ardour/icons:../gtk2_ardour/pixmaps:../gtk2_ardour
 export LD_LIBRARY_PATH=../gtk2_ardour:../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 GTK_PATH=$PWD/../libs/clearlooks:~/.ardour2
 exec wine ./ardour_vst.exe.so "$@"