mirror of
https://github.com/Ardour/ardour.git
synced 2025-12-17 04:06:26 +01:00
traverso-style mixer window bindings. note: messes up some bindings when mouse is not in the processor box (fix to follow); notes: m=mute, s=solo, g=gain_up ctrl-g=gain_down r=rec-enable e=show-sends KP_0=toggle processor active status (selected or pointed-at)
git-svn-id: svn://localhost/ardour2/branches/3.0@5356 d708f5d6-7413-0410-9779-e7cbd77b26cf
This commit is contained in:
parent
385635c445
commit
17bfb7cad5
8 changed files with 256 additions and 30 deletions
|
|
@ -295,7 +295,13 @@ MixerStrip::init ()
|
||||||
else
|
else
|
||||||
set_name ("AudioTrackStripBase");
|
set_name ("AudioTrackStripBase");
|
||||||
|
|
||||||
add_events (Gdk::BUTTON_RELEASE_MASK);
|
add_events (Gdk::BUTTON_RELEASE_MASK|
|
||||||
|
Gdk::ENTER_NOTIFY_MASK|
|
||||||
|
Gdk::LEAVE_NOTIFY_MASK|
|
||||||
|
Gdk::KEY_PRESS_MASK|
|
||||||
|
Gdk::KEY_RELEASE_MASK);
|
||||||
|
|
||||||
|
set_flags (get_flags() | Gtk::CAN_FOCUS);
|
||||||
|
|
||||||
SwitchIO.connect (mem_fun (*this, &MixerStrip::switch_io));
|
SwitchIO.connect (mem_fun (*this, &MixerStrip::switch_io));
|
||||||
|
|
||||||
|
|
@ -1486,3 +1492,110 @@ MixerStrip::set_button_names ()
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
MixerStrip::on_key_press_event (GdkEventKey* ev)
|
||||||
|
{
|
||||||
|
GdkEventButton fake;
|
||||||
|
fake.type = GDK_BUTTON_PRESS;
|
||||||
|
fake.button = 1;
|
||||||
|
fake.state = ev->state;
|
||||||
|
|
||||||
|
switch (ev->keyval) {
|
||||||
|
case GDK_m:
|
||||||
|
mute_press (&fake);
|
||||||
|
return true;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case GDK_s:
|
||||||
|
solo_press (&fake);
|
||||||
|
return true;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case GDK_r:
|
||||||
|
rec_enable_press (&fake);
|
||||||
|
return true;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case GDK_e:
|
||||||
|
show_sends_press (&fake);
|
||||||
|
return true;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case GDK_g:
|
||||||
|
if (ev->state & Keyboard::PrimaryModifier) {
|
||||||
|
step_gain_down ();
|
||||||
|
} else {
|
||||||
|
step_gain_up ();
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool
|
||||||
|
MixerStrip::on_key_release_event (GdkEventKey* ev)
|
||||||
|
{
|
||||||
|
GdkEventButton fake;
|
||||||
|
fake.type = GDK_BUTTON_RELEASE;
|
||||||
|
fake.button = 1;
|
||||||
|
fake.state = ev->state;
|
||||||
|
|
||||||
|
switch (ev->keyval) {
|
||||||
|
case GDK_m:
|
||||||
|
mute_release (&fake);
|
||||||
|
return true;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case GDK_s:
|
||||||
|
solo_release (&fake);
|
||||||
|
return true;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case GDK_r:
|
||||||
|
rec_enable_release (&fake);
|
||||||
|
return true;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case GDK_e:
|
||||||
|
show_sends_release (&fake);
|
||||||
|
return true;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case GDK_g:
|
||||||
|
return true;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
MixerStrip::on_enter_notify_event (GdkEventCrossing* ev)
|
||||||
|
{
|
||||||
|
Keyboard::magic_widget_grab_focus ();
|
||||||
|
grab_focus ();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
MixerStrip::on_leave_notify_event (GdkEventCrossing* ev)
|
||||||
|
{
|
||||||
|
switch (ev->detail) {
|
||||||
|
case GDK_NOTIFY_INFERIOR:
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
Keyboard::magic_widget_drop_focus ();
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -109,6 +109,11 @@ class MixerStrip : public RouteUI, public Gtk::EventBox
|
||||||
void set_selected(bool yn);
|
void set_selected(bool yn);
|
||||||
void set_stuff_from_route ();
|
void set_stuff_from_route ();
|
||||||
|
|
||||||
|
bool on_leave_notify_event (GdkEventCrossing* ev);
|
||||||
|
bool on_enter_notify_event (GdkEventCrossing* ev);
|
||||||
|
bool on_key_press_event (GdkEventKey* ev);
|
||||||
|
bool on_key_release_event (GdkEventKey* ev);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Mixer_UI& _mixer;
|
Mixer_UI& _mixer;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1475,6 +1475,12 @@ Mixer_UI::on_key_press_event (GdkEventKey* ev)
|
||||||
return key_press_focus_accelerator_handler (*this, ev);
|
return key_press_focus_accelerator_handler (*this, ev);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
Mixer_UI::on_key_release_event (GdkEventKey* ev)
|
||||||
|
{
|
||||||
|
return key_press_focus_accelerator_handler (*this, ev);
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
Mixer_UI::parameter_changed (string const & p)
|
Mixer_UI::parameter_changed (string const & p)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -115,6 +115,7 @@ class Mixer_UI : public Gtk::Window
|
||||||
void get_window_pos_and_size ();
|
void get_window_pos_and_size ();
|
||||||
|
|
||||||
bool on_key_press_event (GdkEventKey*);
|
bool on_key_press_event (GdkEventKey*);
|
||||||
|
bool on_key_release_event (GdkEventKey*);
|
||||||
|
|
||||||
void pane_allocation_handler (Gtk::Allocation&, Gtk::Paned*);
|
void pane_allocation_handler (Gtk::Allocation&, Gtk::Paned*);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -135,6 +135,7 @@ ProcessorBox::ProcessorBox (Session& sess, PluginSelector &plugsel,
|
||||||
processor_display.get_column(0)->set_sizing(TREE_VIEW_COLUMN_FIXED);
|
processor_display.get_column(0)->set_sizing(TREE_VIEW_COLUMN_FIXED);
|
||||||
processor_display.get_column(0)->set_fixed_width(48);
|
processor_display.get_column(0)->set_fixed_width(48);
|
||||||
processor_display.add_object_drag (columns.processor.index(), "processors");
|
processor_display.add_object_drag (columns.processor.index(), "processors");
|
||||||
|
processor_display.set_enable_search (false);
|
||||||
processor_display.signal_drop.connect (mem_fun (*this, &ProcessorBox::object_drop));
|
processor_display.signal_drop.connect (mem_fun (*this, &ProcessorBox::object_drop));
|
||||||
|
|
||||||
TreeViewColumn* name_col = processor_display.get_column(0);
|
TreeViewColumn* name_col = processor_display.get_column(0);
|
||||||
|
|
@ -153,9 +154,11 @@ ProcessorBox::ProcessorBox (Session& sess, PluginSelector &plugsel,
|
||||||
|
|
||||||
pack_start (processor_eventbox, true, true);
|
pack_start (processor_eventbox, true, true);
|
||||||
|
|
||||||
processor_eventbox.signal_enter_notify_event().connect (bind (
|
processor_display.signal_enter_notify_event().connect (mem_fun(*this, &ProcessorBox::enter_notify), false);
|
||||||
sigc::ptr_fun (ProcessorBox::enter_box),
|
processor_display.signal_leave_notify_event().connect (mem_fun(*this, &ProcessorBox::leave_notify), false);
|
||||||
this));
|
|
||||||
|
processor_display.signal_key_press_event().connect (mem_fun(*this, &ProcessorBox::processor_key_press_event));
|
||||||
|
processor_display.signal_key_release_event().connect (mem_fun(*this, &ProcessorBox::processor_key_release_event));
|
||||||
|
|
||||||
processor_display.signal_button_press_event().connect (
|
processor_display.signal_button_press_event().connect (
|
||||||
mem_fun(*this, &ProcessorBox::processor_button_press_event), false);
|
mem_fun(*this, &ProcessorBox::processor_button_press_event), false);
|
||||||
|
|
@ -313,6 +316,91 @@ ProcessorBox::processor_drag_end (GdkDragContext *context)
|
||||||
processor_drag_in_progress = false;
|
processor_drag_in_progress = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
ProcessorBox::enter_notify (GdkEventCrossing* ev)
|
||||||
|
{
|
||||||
|
_current_processor_box = this;
|
||||||
|
Keyboard::magic_widget_grab_focus ();
|
||||||
|
processor_display.grab_focus ();
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
ProcessorBox::leave_notify (GdkEventCrossing* ev)
|
||||||
|
{
|
||||||
|
switch (ev->detail) {
|
||||||
|
case GDK_NOTIFY_INFERIOR:
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
Keyboard::magic_widget_drop_focus ();
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
ProcessorBox::processor_key_press_event (GdkEventKey *ev)
|
||||||
|
{
|
||||||
|
/* do real stuff on key release */
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
ProcessorBox::processor_key_release_event (GdkEventKey *ev)
|
||||||
|
{
|
||||||
|
bool ret = false;
|
||||||
|
ProcSelection targets;
|
||||||
|
|
||||||
|
get_selected_processors (targets);
|
||||||
|
|
||||||
|
if (targets.empty()) {
|
||||||
|
|
||||||
|
int x, y;
|
||||||
|
TreeIter iter;
|
||||||
|
TreeModel::Path path;
|
||||||
|
TreeViewColumn* column;
|
||||||
|
int cellx;
|
||||||
|
int celly;
|
||||||
|
|
||||||
|
processor_display.get_pointer (x, y);
|
||||||
|
|
||||||
|
if (processor_display.get_path_at_pos (x, y, path, column, cellx, celly)) {
|
||||||
|
if ((iter = model->get_iter (path))) {
|
||||||
|
targets.push_back ((*iter)[columns.processor]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (targets.empty()) {
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (ev->keyval) {
|
||||||
|
case GDK_Delete:
|
||||||
|
case GDK_BackSpace:
|
||||||
|
delete_processors ();
|
||||||
|
ret = true;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case GDK_KP_0:
|
||||||
|
for (ProcSelection::iterator i = targets.begin(); i != targets.end(); ++i) {
|
||||||
|
if ((*i)->active()) {
|
||||||
|
(*i)->deactivate ();
|
||||||
|
} else {
|
||||||
|
(*i)->activate ();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ret = true;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
bool
|
bool
|
||||||
ProcessorBox::processor_button_press_event (GdkEventButton *ev)
|
ProcessorBox::processor_button_press_event (GdkEventButton *ev)
|
||||||
{
|
{
|
||||||
|
|
@ -392,10 +480,8 @@ ProcessorBox::processor_button_release_event (GdkEventButton *ev)
|
||||||
} else {
|
} else {
|
||||||
_placement = PostFader;
|
_placement = PostFader;
|
||||||
}
|
}
|
||||||
cerr << "had processor " << processor->name() << " placement = " << _placement << endl;
|
|
||||||
} else {
|
} else {
|
||||||
_placement = PostFader;
|
_placement = PostFader;
|
||||||
cerr << "no processor, postfader\n";
|
|
||||||
}
|
}
|
||||||
|
|
||||||
show_processor_menu (ev->time);
|
show_processor_menu (ev->time);
|
||||||
|
|
@ -741,10 +827,10 @@ ProcessorBox::processor_name (boost::weak_ptr<Processor> weak_processor)
|
||||||
|
|
||||||
switch (_width) {
|
switch (_width) {
|
||||||
case Wide:
|
case Wide:
|
||||||
name_display += processor->name();
|
name_display += processor->display_name();
|
||||||
break;
|
break;
|
||||||
case Narrow:
|
case Narrow:
|
||||||
name_display += PBD::short_version (processor->name(), 5);
|
name_display += PBD::short_version (processor->display_name(), 5);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -826,6 +912,7 @@ ProcessorBox::compute_processor_sort_keys ()
|
||||||
Route::ProcessorList our_processors;
|
Route::ProcessorList our_processors;
|
||||||
|
|
||||||
for (Gtk::TreeModel::Children::iterator iter = children.begin(); iter != children.end(); ++iter) {
|
for (Gtk::TreeModel::Children::iterator iter = children.begin(); iter != children.end(); ++iter) {
|
||||||
|
boost::shared_ptr<Processor> p = (*iter)[columns.processor];
|
||||||
our_processors.push_back ((*iter)[columns.processor]);
|
our_processors.push_back ((*iter)[columns.processor]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1319,23 +1406,6 @@ ProcessorBox::edit_processor (boost::shared_ptr<Processor> processor)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool
|
|
||||||
ProcessorBox::enter_box (GdkEventCrossing *ev, ProcessorBox* rb)
|
|
||||||
{
|
|
||||||
switch (ev->detail) {
|
|
||||||
case GDK_NOTIFY_INFERIOR:
|
|
||||||
break;
|
|
||||||
|
|
||||||
case GDK_NOTIFY_VIRTUAL:
|
|
||||||
/* fallthru */
|
|
||||||
|
|
||||||
default:
|
|
||||||
_current_processor_box = rb;
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
void
|
||||||
ProcessorBox::register_actions ()
|
ProcessorBox::register_actions ()
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -158,6 +158,10 @@ class ProcessorBox : public Gtk::HBox, public PluginInterestedObject
|
||||||
bool no_processor_redisplay;
|
bool no_processor_redisplay;
|
||||||
bool ignore_delete;
|
bool ignore_delete;
|
||||||
|
|
||||||
|
bool enter_notify (GdkEventCrossing *ev);
|
||||||
|
bool leave_notify (GdkEventCrossing *ev);
|
||||||
|
bool processor_key_press_event (GdkEventKey *);
|
||||||
|
bool processor_key_release_event (GdkEventKey *);
|
||||||
bool processor_button_press_event (GdkEventButton *);
|
bool processor_button_press_event (GdkEventButton *);
|
||||||
bool processor_button_release_event (GdkEventButton *);
|
bool processor_button_release_event (GdkEventButton *);
|
||||||
void redisplay_processors ();
|
void redisplay_processors ();
|
||||||
|
|
@ -208,8 +212,6 @@ class ProcessorBox : public Gtk::HBox, public PluginInterestedObject
|
||||||
void weird_plugin_dialog (ARDOUR::Plugin& p, ARDOUR::Route::ProcessorStreams streams);
|
void weird_plugin_dialog (ARDOUR::Plugin& p, ARDOUR::Route::ProcessorStreams streams);
|
||||||
|
|
||||||
static ProcessorBox* _current_processor_box;
|
static ProcessorBox* _current_processor_box;
|
||||||
static bool enter_box (GdkEventCrossing*, ProcessorBox*);
|
|
||||||
static bool leave_box (GdkEventCrossing*, ProcessorBox*);
|
|
||||||
|
|
||||||
static void rb_choose_plugin ();
|
static void rb_choose_plugin ();
|
||||||
static void rb_choose_insert ();
|
static void rb_choose_insert ();
|
||||||
|
|
|
||||||
|
|
@ -26,6 +26,7 @@
|
||||||
#include <gtkmm2ext/gtk_ui.h>
|
#include <gtkmm2ext/gtk_ui.h>
|
||||||
|
|
||||||
#include "ardour/route_group.h"
|
#include "ardour/route_group.h"
|
||||||
|
#include "ardour/dB.h"
|
||||||
#include "pbd/memento_command.h"
|
#include "pbd/memento_command.h"
|
||||||
#include "pbd/stacktrace.h"
|
#include "pbd/stacktrace.h"
|
||||||
#include "pbd/shiva.h"
|
#include "pbd/shiva.h"
|
||||||
|
|
@ -1420,3 +1421,26 @@ RouteUI::parameter_changed (string const & p)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
RouteUI::step_gain_up ()
|
||||||
|
{
|
||||||
|
_route->set_gain (dB_to_coefficient (coefficient_to_dB (_route->gain_control()->get_value()) + 0.1), this);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
RouteUI::page_gain_up ()
|
||||||
|
{
|
||||||
|
_route->set_gain (dB_to_coefficient (coefficient_to_dB (_route->gain_control()->get_value()) + 0.5), this);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
RouteUI::step_gain_down ()
|
||||||
|
{
|
||||||
|
_route->set_gain (dB_to_coefficient (coefficient_to_dB (_route->gain_control()->get_value()) - 0.1), this);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
RouteUI::page_gain_down ()
|
||||||
|
{
|
||||||
|
_route->set_gain (dB_to_coefficient (coefficient_to_dB (_route->gain_control()->get_value()) - 0.5), this);
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -114,6 +114,11 @@ class RouteUI : public virtual AxisView
|
||||||
bool show_sends_press(GdkEventButton*);
|
bool show_sends_press(GdkEventButton*);
|
||||||
bool show_sends_release(GdkEventButton*);
|
bool show_sends_release(GdkEventButton*);
|
||||||
|
|
||||||
|
void step_gain_up ();
|
||||||
|
void step_gain_down ();
|
||||||
|
void page_gain_up ();
|
||||||
|
void page_gain_down ();
|
||||||
|
|
||||||
void build_sends_menu ();
|
void build_sends_menu ();
|
||||||
void set_sends_gain_from_track ();
|
void set_sends_gain_from_track ();
|
||||||
void set_sends_gain_to_zero ();
|
void set_sends_gain_to_zero ();
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue