give monitor section its own bindings
authorPaul Davis <paul@linuxaudiosystems.com>
Tue, 15 Mar 2016 16:41:14 +0000 (12:41 -0400)
committerPaul Davis <paul@linuxaudiosystems.com>
Tue, 15 Mar 2016 16:41:22 +0000 (12:41 -0400)
gtk2_ardour/monitor_section.cc
gtk2_ardour/monitor_section.h

index af2168881376f5290dcb58f7c498e9dc1f65453e..9702d7f25b85c6056fb401d2321d994c4a34889d 100644 (file)
@@ -1,19 +1,19 @@
 /*
-    Copyright (C) 2012 Paul Davis
+  Copyright (C) 2012 Paul Davis
 
-    This program is free software; you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation; either version 2 of the License, or
-    (at your option) any later version.
+  This program is free software; you can redistribute it and/or modify
+  it under the terms of the GNU General Public License as published by
+  the Free Software Foundation; either version 2 of the License, or
+  (at your option) any later version.
 
-    This program is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
+  This program is distributed in the hope that it will be useful,
+  but WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+  GNU General Public License for more details.
 
-    You should have received a copy of the GNU General Public License
-    along with this program; if not, write to the Free Software
-    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+  You should have received a copy of the GNU General Public License
+  along with this program; if not, write to the Free Software
+  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 
 */
 
@@ -65,7 +65,7 @@ MonitorSection::MonitorSection (Session* s)
        , RouteUI (s)
        , _tearoff (0)
        , channel_table_viewport (*channel_table_scroller.get_hadjustment()
-       , *channel_table_scroller.get_vadjustment ())
+                                 , *channel_table_scroller.get_vadjustment ())
        , gain_control (0)
        , dim_control (0)
        , solo_boost_control (0)
@@ -94,6 +94,7 @@ MonitorSection::MonitorSection (Session* s)
        if (!monitor_actions) {
                register_actions ();
                load_bindings ();
+               set_data ("ardour-bindings", bindings);
        }
 
        _plugin_selector = new PluginSelector (PluginManager::instance());
@@ -390,7 +391,7 @@ MonitorSection::MonitorSection (Session* s)
        mono_dim_box->pack_start (mono_button, true, true);
        mono_dim_box->pack_end (dim_all_button, true, true);
 
-       // master gain 
+       // master gain
        Label* spin_label = manage (new Label (_("Monitor")));
        VBox* spin_packer = manage (new VBox);
        spin_packer->set_spacing (PX_SCALE(2));
@@ -407,7 +408,7 @@ MonitorSection::MonitorSection (Session* s)
        lower_packer->pack_start (*mono_dim_box,        false, false, PX_SCALE(2));
        lower_packer->pack_start (cut_all_button,       false, false, PX_SCALE(2));
 
-               // output port select
+       // output port select
        VBox* out_packer = manage (new VBox);
        out_packer->set_spacing (PX_SCALE(2));
        out_packer->pack_start (*output_label, false, false);
@@ -429,6 +430,8 @@ MonitorSection::MonitorSection (Session* s)
        hpacker.set_spacing (0);
        hpacker.pack_start (vpacker, true, true);
 
+       add (hpacker);
+
        gain_control->show_all ();
        gain_display->show_all ();
        dim_control->show_all ();
@@ -457,7 +460,11 @@ MonitorSection::MonitorSection (Session* s)
        output_button->signal_button_press_event().connect (sigc::mem_fun(*this, &MonitorSection::output_press), false);
        output_button->signal_button_release_event().connect (sigc::mem_fun(*this, &MonitorSection::output_release), false);
 
-       _tearoff = new TearOff (hpacker);
+       signal_enter_notify_event().connect (sigc::mem_fun (*this, &MonitorSection::enter_handler));
+       signal_leave_notify_event().connect (sigc::mem_fun (*this, &MonitorSection::leave_handler));
+       set_flags (CAN_FOCUS);
+
+       _tearoff = new TearOff (*this);
 
        if (!UIConfiguration::instance().get_floating_monitor_section()) {
                /* if torn off, make this a normal window
@@ -503,6 +510,36 @@ MonitorSection::~MonitorSection ()
        _output_selector = 0;
 }
 
+bool
+MonitorSection::enter_handler (GdkEventCrossing* ev)
+{
+       grab_focus ();
+       return false;
+}
+
+bool
+MonitorSection::leave_handler (GdkEventCrossing* ev)
+{
+       switch (ev->detail) {
+       case GDK_NOTIFY_INFERIOR:
+               return false;
+       default:
+               break;
+       }
+
+       /* cancel focus if we're not torn off. With X11 WM's that do
+        * focus-follows-mouse, focus will be taken from us anyway.
+        */
+
+       Widget* top = get_toplevel();
+
+       if (top->is_toplevel() && top != &_tearoff->tearoff_window()) {
+               Window* win = dynamic_cast<Window*> (top);
+               gtk_window_set_focus (win->gobj(), 0);
+       }
+
+       return false;
+}
 
 void
 MonitorSection::update_processor_box ()
@@ -1630,7 +1667,7 @@ MonitorSection::port_connected_or_disconnected (boost::weak_ptr<Port> wa, boost:
 void
 MonitorSection::load_bindings ()
 {
-       bindings = Bindings::get_bindings (X_("monitor-section"), myactions);
+       bindings = Bindings::get_bindings (X_("monitor section"), myactions);
 }
 
 void
index 82d23336abb14e0cb6fffd41e1038fa3729f7ed1..a690f5c388641ab9ed9542e54aff1aebca970189 100644 (file)
@@ -19,6 +19,7 @@
 
 #include <gtkmm/box.h>
 #include <gtkmm/table.h>
+#include <gtkmm/eventbox.h>
 
 #include "gtkmm2ext/bindable_button.h"
 #include "gtkmm2ext/bindings.h"
@@ -26,7 +27,6 @@
 #include "ardour_button.h"
 #include "ardour_knob.h"
 #include "ardour_display.h"
-#include "axis_view.h"
 #include "level_meter.h"
 #include "route_ui.h"
 #include "monitor_selector.h"
@@ -39,7 +39,7 @@ namespace Gtkmm2ext {
        class TearOff;
 }
 
-class MonitorSection : public RouteUI
+class MonitorSection : public RouteUI, public Gtk::EventBox
 {
   public:
        MonitorSection (ARDOUR::Session*);
@@ -182,4 +182,6 @@ class MonitorSection : public RouteUI
        Gtkmm2ext::Bindings* bindings;
 
        void load_bindings ();
+       bool enter_handler (GdkEventCrossing*);
+       bool leave_handler (GdkEventCrossing*);
 };