provide instructional hint for keyeditor; fix keybinding issues on OS X (needs current GTK patch); fix up packaging up OSX native to include VAMP plugins and put control surfaces in (mostly) the right places ; new (improved) arrow key bindings

git-svn-id: svn://localhost/ardour2/branches/2.0-ongoing@3007 d708f5d6-7413-0410-9779-e7cbd77b26cf
This commit is contained in:
Paul Davis 2008-02-04 22:37:57 +00:00
parent 3ce5933740
commit 0170a7666a
15 changed files with 108 additions and 45 deletions

View file

@ -405,13 +405,17 @@ keybindings_dict = { }
if gtkardour['GTKOSX'] and gtkardour['NATIVE_OSX_KEYS']: if gtkardour['GTKOSX'] and gtkardour['NATIVE_OSX_KEYS']:
# #
# Command(Mod1), Alt(Mod5), Ctrl, Shift # Command(Meta), Alt(Mod1), Ctrl, Shift
# **** as of february 4th 2008, OUR VERSION OF *****
# Gtk/Quartz maps:
# NSCommand (aka "Command" aka "Apple" aka "Cauliflower") -> Meta
# NSAlternate (aka "Option") -> Mod1
# #
keybindings_dict['%PRIMARY%'] = 'Mod5' keybindings_dict['%PRIMARY%'] = 'Meta'
keybindings_dict['%SECONDARY%'] = 'Alt' keybindings_dict['%SECONDARY%'] = 'Mod1'
keybindings_dict['%TERTIARY%'] = 'Shift' keybindings_dict['%TERTIARY%'] = 'Shift'
keybindings_dict['%LEVEL4%'] = 'Ctrl' keybindings_dict['%LEVEL4%'] = 'Ctrl'
keybindings_dict['%WINDOW%'] = 'Mod5' keybindings_dict['%WINDOW%'] = 'Mod1'
else: else:
# #
# Ctrl, Alt, Shift, Mod3(Meta) # Ctrl, Alt, Shift, Mod3(Meta)

View file

@ -117,13 +117,13 @@
(gtk_accel_path "<Actions>/Transport/TransitionToReverse" "<%PRIMARY%>downarrow") (gtk_accel_path "<Actions>/Transport/TransitionToReverse" "<%PRIMARY%>downarrow")
(gtk_accel_path "<Actions>/Editor/select-next-route" "<%SECONDARY%>downarrow") (gtk_accel_path "<Actions>/Editor/select-next-route" "<%SECONDARY%>downarrow")
(gtk_accel_path "<Actions>/Editor/scroll-backward" "leftarrow") (gtk_accel_path "<Actions>/Editor/playhead-to-previous-region-boundary" "leftarrow")
(gtk_accel_path "<Actions>/Transport/Rewind" "<%PRIMARY%>leftarrow") (gtk_accel_path "<Actions>/Editor/tab-to-transient-backwards" "<%PRIMARY%>leftarrow")
(gtk_accel_path "<Actions>/Editor/scroll-playhead-backward" "<%TERTIARY%>leftarrow") (gtk_accel_path "<Actions>/Editor/nudge-playhead-backward" "<%SECONDARY%>leftarrow")
(gtk_accel_path "<Actions>/Editor/scroll-forward" "rightarrow") (gtk_accel_path "<Actions>/Editor/playhead-to-next-region-boundary" "rightarrow")
(gtk_accel_path "<Actions>/Transport/Forward" "<%PRIMARY%>rightarrow") (gtk_accel_path "<Actions>/Editor/tab-to-transient-forwards" "<%PRIMARY%>rightarrow")
(gtk_accel_path "<Actions>/Editor/scroll-playhead-forward" "<%TERTIARY%>rightarrow") (gtk_accel_path "<Actions>/Editor/nudge-playhead-forward" "<%SECONDARY%>rightarrow")
(gtk_accel_path "<Actions>/Editor/scroll-tracks-down" "Page_Down") (gtk_accel_path "<Actions>/Editor/scroll-tracks-down" "Page_Down")
(gtk_accel_path "<Actions>/Editor/scroll-tracks-up" "Page_Up") (gtk_accel_path "<Actions>/Editor/scroll-tracks-up" "Page_Up")
@ -182,12 +182,9 @@
(gtk_accel_path "<Actions>/Editor/cycle-snap-choice" "3") (gtk_accel_path "<Actions>/Editor/cycle-snap-choice" "3")
(gtk_accel_path "<Actions>/Transport/ToggleAutoReturn" "4") (gtk_accel_path "<Actions>/Transport/ToggleAutoReturn" "4")
(gtk_accel_path "<Actions>/Transport/ToggleClick" "5") (gtk_accel_path "<Actions>/Transport/ToggleClick" "5")
(gtk_accel_path "<Actions>/Editor/tab-to-transient-forwards" "7")
(gtk_accel_path "<Actions>/Editor/tab-to-transient-backwards" "8")
(gtk_accel_path "<Actions>/Editor/set-tempo-from-region" "9") (gtk_accel_path "<Actions>/Editor/set-tempo-from-region" "9")
(gtk_accel_path "<Actions>/Editor/set-tempo-from-edit-range" "0") (gtk_accel_path "<Actions>/Editor/set-tempo-from-edit-range" "0")
;; ;;
;; unbound actions ;; unbound actions
;; ;;

View file

@ -46,6 +46,8 @@
<separator/> <separator/>
<menuitem action='tab-to-transient-forwards'/> <menuitem action='tab-to-transient-forwards'/>
<menuitem action='tab-to-transient-backwards'/> <menuitem action='tab-to-transient-backwards'/>
<menuitem action='nudge-playhead-forward'/>
<menuitem action='nudge-playhead-backward'/>
<separator/> <separator/>
<menuitem action='Record'/> <menuitem action='Record'/>
<separator/> <separator/>
@ -118,6 +120,8 @@
<menuitem action='edit-cursor-to-range-start'/> <menuitem action='edit-cursor-to-range-start'/>
<menuitem action='edit-cursor-to-range-end'/> <menuitem action='edit-cursor-to-range-end'/>
</menu> </menu>
<menuitem action='set-tempo-from-region'/>
<menuitem action='set-tempo-from-edit-range'/>
<menu name='KeyMouse Actions' action='KeyMouse Actions'> <menu name='KeyMouse Actions' action='KeyMouse Actions'>
<menuitem action='play-selected-regions'/> <menuitem action='play-selected-regions'/>
<menuitem action='brush-at-mouse'/> <menuitem action='brush-at-mouse'/>
@ -172,9 +176,7 @@
<menuitem action='normalize-region'/> <menuitem action='normalize-region'/>
<separator/> <separator/>
<menuitem action="nudge-forward"/> <menuitem action="nudge-forward"/>
<menuitem action="nudge-next-forward"/>
<menuitem action="nudge-backward"/> <menuitem action="nudge-backward"/>
<menuitem action="nudge-next-backward"/>
<menuitem action='split-region'/> <menuitem action='split-region'/>
<menuitem action='set-region-sync-position'/> <menuitem action='set-region-sync-position'/>
<separator/> <separator/>
@ -198,8 +200,6 @@
<menuitem action='trim-region-to-punch'/> <menuitem action='trim-region-to-punch'/>
<separator/> <separator/>
<menuitem action='pitch-shift-region'/> <menuitem action='pitch-shift-region'/>
<menuitem action='set-tempo-from-region'/>
<menuitem action='set-tempo-from-edit-range'/>
</menu> </menu>
<menu name='View' action = 'View'> <menu name='View' action = 'View'>
<menu name='ZoomFocus' action='ZoomFocus'> <menu name='ZoomFocus' action='ZoomFocus'>

View file

@ -203,6 +203,11 @@ Editor::register_actions ()
act = ActionManager::register_action (editor_actions, "nudge-next-backward", _("Nudge Next Backward"), bind (mem_fun(*this, &Editor::nudge_backward), true, false)); act = ActionManager::register_action (editor_actions, "nudge-next-backward", _("Nudge Next Backward"), bind (mem_fun(*this, &Editor::nudge_backward), true, false));
ActionManager::session_sensitive_actions.push_back (act); ActionManager::session_sensitive_actions.push_back (act);
act = ActionManager::register_action (editor_actions, "nudge-playhead-forward", _("Nudge Playhead Forward"), bind (mem_fun(*this, &Editor::nudge_forward), false, true));
ActionManager::session_sensitive_actions.push_back (act);
act = ActionManager::register_action (editor_actions, "nudge-playhead-backward", _("Nudge Playhead Backward"), bind (mem_fun(*this, &Editor::nudge_backward), false, true));
ActionManager::session_sensitive_actions.push_back (act);
act = ActionManager::register_action (editor_actions, "temporal-zoom-out", _("Zoom Out"), bind (mem_fun(*this, &Editor::temporal_zoom_step), true)); act = ActionManager::register_action (editor_actions, "temporal-zoom-out", _("Zoom Out"), bind (mem_fun(*this, &Editor::temporal_zoom_step), true));
ActionManager::session_sensitive_actions.push_back (act); ActionManager::session_sensitive_actions.push_back (act);

View file

@ -5128,6 +5128,7 @@ Editor::split_region_at_points (boost::shared_ptr<Region> r, AnalysisFeatureList
if ((*x) > pos) { if ((*x) > pos) {
break; break;
} }
++x;
} }
if (x == positions.end()) { if (x == positions.end()) {

View file

@ -183,6 +183,8 @@ void
Editor::set_selected_track (TimeAxisView& view, Selection::Operation op, bool no_remove) Editor::set_selected_track (TimeAxisView& view, Selection::Operation op, bool no_remove)
{ {
cerr << "set selected track, op = " << op << " selected ? " << selection->selected (&view) << " no remove? " << no_remove << endl;
switch (op) { switch (op) {
case Selection::Toggle: case Selection::Toggle:
if (selection->selected (&view)) { if (selection->selected (&view)) {

View file

@ -3,6 +3,7 @@
#include <ardour/profile.h> #include <ardour/profile.h>
#include <gtkmm/stock.h> #include <gtkmm/stock.h>
#include <gtkmm/label.h>
#include <gtkmm/accelkey.h> #include <gtkmm/accelkey.h>
#include <gtkmm/accelmap.h> #include <gtkmm/accelmap.h>
#include <gtkmm/uimanager.h> #include <gtkmm/uimanager.h>
@ -50,17 +51,23 @@ KeyEditor::KeyEditor ()
scroller.add (view); scroller.add (view);
scroller.set_policy (Gtk::POLICY_NEVER, Gtk::POLICY_AUTOMATIC); scroller.set_policy (Gtk::POLICY_NEVER, Gtk::POLICY_AUTOMATIC);
unbind_box.pack_start (unbind_button, false, false);
unbind_button.signal_clicked().connect (mem_fun (*this, &KeyEditor::unbind));
get_vbox()->set_spacing (6); get_vbox()->set_spacing (6);
get_vbox()->pack_start (scroller); get_vbox()->pack_start (scroller);
if (!ARDOUR::Profile->get_sae()) { if (!ARDOUR::Profile->get_sae()) {
Label* hint = manage (new Label (_("Select an action, then press the key(s) to (re)set its shortcut")));
hint->show ();
unbind_box.set_spacing (6);
unbind_box.pack_start (*hint, false, true);
unbind_box.pack_start (unbind_button, false, false);
unbind_button.signal_clicked().connect (mem_fun (*this, &KeyEditor::unbind));
get_vbox()->pack_start (unbind_box, false, false); get_vbox()->pack_start (unbind_box, false, false);
unbind_box.show (); unbind_box.show ();
unbind_button.show (); unbind_button.show ();
} }
get_vbox()->set_border_width (12); get_vbox()->set_border_width (12);
@ -248,9 +255,16 @@ KeyEditor::populate ()
#ifdef GTKOSX #ifdef GTKOSX
string label = (*k); string label = (*k);
replace_all (label, "<Mod5>", _("Command-"));
/* Gtk/Quartz maps:
NSAlternate/NSOption key to Mod1
NSCommand key to Meta
*/
replace_all (label, "<Meta>", _("Command-"));
replace_all (label, "<Alt>", _("Option-")); replace_all (label, "<Alt>", _("Option-"));
replace_all (label, "<Shift>", _("Shift-")); replace_all (label, "<Shift>", _("Shift-"));
replace_all (label, "<Control>", _("Control-"));
row[columns.binding] = label; row[columns.binding] = label;
#else #else
row[columns.binding] = (*k); row[columns.binding] = (*k);

View file

@ -123,6 +123,26 @@ fixup_bundle_environment ()
setenv ("LADSPA_PATH", path.c_str(), 1); setenv ("LADSPA_PATH", path.c_str(), 1);
cstr = getenv ("VAMP_PATH");
if (cstr) {
path = cstr;
path += ':';
}
path = dir_path;
path += "/../Frameworks";
setenv ("VAMP_PATH", path.c_str(), 1);
cstr = getenv ("ARDOUR_CONTROL_SURFACE_PATH");
if (cstr) {
path = cstr;
path += ':';
}
path = dir_path;
path += "/../Surfaces";
setenv ("ARDOUR_CONTROL_SURFACE_PATH", path.c_str(), 1);
cstr = getenv ("LV2_PATH"); cstr = getenv ("LV2_PATH");
if (cstr) { if (cstr) {
path = cstr; path = cstr;

View file

@ -1081,14 +1081,14 @@ static const struct {
#ifdef GTKOSX #ifdef GTKOSX
/* Command = Mod1 /* Command = Meta
Option/Alt = Mod5 Option/Alt = Mod1
*/ */
{ "Shift", GDK_SHIFT_MASK }, { "Shift", GDK_SHIFT_MASK },
{ "Command", GDK_MOD1_MASK }, { "Command", GDK_META_MASK },
{ "Control", GDK_CONTROL_MASK }, { "Control", GDK_CONTROL_MASK },
{ "Option", GDK_MOD5_MASK }, { "Option", GDK_MOD1_MASK },
{ "Command-Shift", GDK_MOD1_MASK|GDK_SHIFT_MASK }, { "Command-Shift", GDK_MOD1_MASK|GDK_SHIFT_MASK },
{ "Command-Option", GDK_MOD1_MASK|GDK_MOD5_MASK }, { "Command-Option", GDK_MOD1_MASK|GDK_MOD5_MASK },
{ "Shift-Option", GDK_SHIFT_MASK|GDK_MOD5_MASK }, { "Shift-Option", GDK_SHIFT_MASK|GDK_MOD5_MASK },

View file

@ -331,6 +331,8 @@ carbon_menu_item_update_accelerator (CarbonMenuItem *carbon_item,
modifiers |= kMenuShiftModifier; modifiers |= kMenuShiftModifier;
} }
/* gdk/quartz maps Alt/Option to Mod1 */
if (key->accel_mods & (GDK_MOD1_MASK)) { if (key->accel_mods & (GDK_MOD1_MASK)) {
modifiers |= kMenuOptionModifier; modifiers |= kMenuOptionModifier;
} }
@ -339,11 +341,9 @@ carbon_menu_item_update_accelerator (CarbonMenuItem *carbon_item,
modifiers |= kMenuControlModifier; modifiers |= kMenuControlModifier;
} }
if (key->accel_mods & GDK_MOD5_MASK) { /* gdk/quartz maps Command to Meta */
/* Mod5 is what ardour's binding file uses to mean "Command"
Nothing needs to be set in modifiers, but we need to notice if (key->accel_mods & GDK_META_MASK) {
that there *is* an implicit modifier
*/
use_command = 1; use_command = 1;
} }
} }

View file

@ -271,6 +271,7 @@ TimeAxisView::controls_ebox_scroll (GdkEventScroll* ev)
bool bool
TimeAxisView::controls_ebox_button_release (GdkEventButton* ev) TimeAxisView::controls_ebox_button_release (GdkEventButton* ev)
{ {
cerr << "CEB button release\n";
switch (ev->button) { switch (ev->button) {
case 1: case 1:
selection_click (ev); selection_click (ev);

View file

@ -460,42 +460,51 @@ key_press_focus_accelerator_handler (Gtk::Window& window, GdkEventKey* ev)
it does allow. it does allow.
*/ */
int fakekey = GDK_VoidSymbol;
int ret = false; int ret = false;
switch (ev->keyval) { switch (ev->keyval) {
case GDK_Tab: case GDK_Tab:
ret = gtk_accel_groups_activate(G_OBJECT(win), GDK_nabla, GdkModifierType(ev->state));
break;
// some X and/or GDK implementations do Shift-Tab -> GDK_ISO_Left_Tab
case GDK_ISO_Left_Tab: case GDK_ISO_Left_Tab:
ret = gtk_accel_groups_activate(G_OBJECT(win), GDK_nabla, GdkModifierType(ev->state)); fakekey = GDK_nabla;
break; break;
case GDK_Up: case GDK_Up:
ret = gtk_accel_groups_activate(G_OBJECT(win), GDK_uparrow, GdkModifierType(ev->state)); fakekey = GDK_uparrow;
break; break;
case GDK_Down: case GDK_Down:
ret = gtk_accel_groups_activate(G_OBJECT(win), GDK_downarrow, GdkModifierType(ev->state)); fakekey = GDK_downarrow;
break; break;
case GDK_Right: case GDK_Right:
ret = gtk_accel_groups_activate(G_OBJECT(win), GDK_rightarrow, GdkModifierType(ev->state)); fakekey = GDK_rightarrow;
break; break;
case GDK_Left: case GDK_Left:
ret = gtk_accel_groups_activate(G_OBJECT(win), GDK_leftarrow, GdkModifierType(ev->state)); fakekey = GDK_leftarrow;
break; break;
default: default:
break; break;
} }
if (ret) { if (fakekey != GDK_VoidSymbol) {
return true; ret = gtk_accel_groups_activate(G_OBJECT(win), fakekey, GdkModifierType(ev->state));
if (ret) {
return true;
}
#ifdef GTKOSX
int oldval = ev->keyval;
ev->keyval = fakekey;
if (gdk_quartz_possibly_forward ((GdkEvent*) ev)) {
return true;
}
ev->keyval = oldval;
} }
#endif
} }
/* consider all relevant modifiers but not LOCK or SHIFT */ /* consider all relevant modifiers but not LOCK or SHIFT */

View file

@ -2139,6 +2139,10 @@ Session::template_path ()
string string
Session::control_protocol_path () Session::control_protocol_path ()
{ {
char *p = getenv ("ARDOUR_CONTROL_SURFACE_PATH");
if (p && *p) {
return p;
}
return suffixed_search_path (X_("surfaces"), false); return suffixed_search_path (X_("surfaces"), false);
} }

View file

@ -1,4 +1,4 @@
#ifndef __ardour_svn_revision_h__ #ifndef __ardour_svn_revision_h__
#define __ardour_svn_revision_h__ #define __ardour_svn_revision_h__
static const char* ardour_svn_revision = "2985"; static const char* ardour_svn_revision = "2986";
#endif #endif

View file

@ -32,6 +32,7 @@ APPROOT=Ardour2.app/Contents
Frameworks=$APPROOT/Frameworks Frameworks=$APPROOT/Frameworks
Resources=$APPROOT/Resources Resources=$APPROOT/Resources
Plugins=$APPROOT/Plugins Plugins=$APPROOT/Plugins
Surfaces=$APPROOT/Surfaces
Shared=$Resources/share Shared=$Resources/share
Etc=$Resources/etc Etc=$Resources/etc
@ -60,6 +61,7 @@ echo "Building new app directory structure ..."
mkdir -p $APPROOT/MacOS mkdir -p $APPROOT/MacOS
mkdir -p $APPROOT/Resources mkdir -p $APPROOT/Resources
mkdir -p $APPROOT/Plugins mkdir -p $APPROOT/Plugins
mkdir -p $APPROOT/Surfaces
mkdir -p $Frameworks/modules mkdir -p $Frameworks/modules
mkdir -p $Shared/templates mkdir -p $Shared/templates
mkdir -p $Etc mkdir -p $Etc
@ -140,8 +142,12 @@ mkdir -p $Frameworks/clearlooks/engines
(cd $Frameworks/clearlooks/engines && ln -s ../../libclearlooks.dylib libclearlooks.dylib && ln -s ../../libclearlooks.dylib libclearlooks.so) (cd $Frameworks/clearlooks/engines && ln -s ../../libclearlooks.dylib libclearlooks.dylib && ln -s ../../libclearlooks.dylib libclearlooks.so)
# XXX STILL NEED TO DO PANNERS FOR TRUNK # XXX STILL NEED TO DO PANNERS FOR TRUNK
cp ../../libs/surfaces/*/libardour_*.dylib $Surfaces
# hack ... move libardour_cp back into Frameworks
cp $Surfaces/libardour_cp*.dylib $Frameworks
cp ../../libs/surfaces/*/libardour_*.dylib $Frameworks # VAMP plugins that we use
cp ../../libs/vamp-plugins/libardourvampplugins.dylib $Frameworks
while [ true ] ; do while [ true ] ; do
missing=false missing=false
@ -228,7 +234,7 @@ done
echo "Fixing up library names ..." echo "Fixing up library names ..."
# now do the same for all the libraries we include # now do the same for all the libraries we include
for dylib in $Frameworks/*.dylib $Frameworks/modules/*.so ; do for dylib in $Frameworks/*.dylib $Frameworks/modules/*.so $Surfaces/*.dylib ; do
# skip symlinks # skip symlinks
if test ! -L $dylib ; then if test ! -L $dylib ; then