send control now has working metering, and switches back and forth between busses...
[ardour.git] / gtk2_ardour / utils.cc
index 020bc6f4d6c3ab1a636b8e6759b1ca600463e057..9378b6727c1cb4dfc9acb2bd4edf408dba1427d1 100644 (file)
 #include <gtkmm/paned.h>
 #include <gtk/gtkpaned.h>
 
-#include <pbd/file_utils.h>
+#include "pbd/file_utils.h"
 
 #include <gtkmm2ext/utils.h>
-#include <ardour/configuration.h>
-#include <ardour/configuration.h>
+#include "ardour/configuration.h"
+#include "ardour/configuration.h"
 
-#include <ardour/filesystem_paths.h>
+#include "ardour/filesystem_paths.h"
 
 #include "ardour_ui.h"
 #include "keyboard.h"
@@ -384,6 +384,61 @@ color_from_style (string widget_style_name, int state, string attr)
        return Gdk::Color ("red");
 }
 
+Glib::RefPtr<Gdk::GC>
+gc_from_style (string widget_style_name, int state, string attr)
+{
+        GtkStyle* style;
+
+        style = gtk_rc_get_style_by_paths (gtk_settings_get_default(),
+                                           widget_style_name.c_str(),
+                                           0, G_TYPE_NONE);
+
+        if (!style) {
+                error << string_compose (_("no style found for %1, using red"), style) << endmsg;
+               Glib::RefPtr<Gdk::GC> ret = Gdk::GC::create();
+               ret->set_rgb_fg_color(Gdk::Color("red"));
+                return ret;
+        }
+
+        if (attr == "fg") {
+                return Glib::wrap(style->fg_gc[state]);
+        }
+
+        if (attr == "bg") {
+                return Glib::wrap(style->bg_gc[state]);
+        }
+
+        if (attr == "light") {
+                return Glib::wrap(style->light_gc[state]);
+        }
+
+        if (attr == "dark") {
+                return Glib::wrap(style->dark_gc[state]);
+        }
+
+        if (attr == "mid") {
+                return Glib::wrap(style->mid_gc[state]);
+        }
+
+        if (attr == "text") {
+                return Glib::wrap(style->text_gc[state]);
+        }
+
+        if (attr == "base") {
+                return Glib::wrap(style->base_gc[state]);
+        }
+
+        if (attr == "text_aa") {
+                return Glib::wrap(style->text_aa_gc[state]);
+        }
+
+        error << string_compose (_("unknown style attribute %1 requested for color; using \"red\""), attr) << endmsg;
+       Glib::RefPtr<Gdk::GC> ret = Gdk::GC::create();
+       ret->set_rgb_fg_color(Gdk::Color("red"));
+        return ret;
+}
+
+
 bool 
 canvas_item_visible (ArdourCanvas::Item* item)
 {
@@ -408,10 +463,12 @@ key_press_focus_accelerator_handler (Gtk::Window& window, GdkEventKey* ev)
        GtkWindow* win = window.gobj();
        GtkWidget* focus = gtk_window_get_focus (win);
        bool special_handling_of_unmodified_accelerators = false;
+       bool allow_activating = true;
 
 #undef DEBUG_ACCELERATOR_HANDLING
 #ifdef  DEBUG_ACCELERATOR_HANDLING
-       bool debug = (getenv ("ARDOUR_DEBUG_ACCELERATOR_HANDLING") != 0);
+       //bool debug = (getenv ("ARDOUR_DEBUG_ACCELERATOR_HANDLING") != 0);
+       bool debug=true;
 #endif
        if (focus) {
                if (GTK_IS_ENTRY(focus) || Keyboard::some_magic_widget_has_focus()) {
@@ -419,10 +476,21 @@ key_press_focus_accelerator_handler (Gtk::Window& window, GdkEventKey* ev)
                } 
        } 
 
+#ifdef GTKOSX
+       /* should this be universally true? */
+       if (Keyboard::some_magic_widget_has_focus ()) {
+               allow_activating = false;
+       }
+#endif
+
 #ifdef DEBUG_ACCELERATOR_HANDLING
        if (debug) {
                cerr << "Win = " << win << " Key event: code = " << ev->keyval << " state = " << hex << ev->state << dec << " special handling ? " 
                     << special_handling_of_unmodified_accelerators
+                    << " magic widget focus ? "
+                    << Keyboard::some_magic_widget_has_focus()
+                    << " allow_activation ? "
+                    << allow_activating
                     << endl;
        }
 #endif
@@ -469,17 +537,19 @@ key_press_focus_accelerator_handler (Gtk::Window& window, GdkEventKey* ev)
                uint32_t fakekey = ev->keyval;
 
                if (possibly_translate_keyval_to_make_legal_accelerator (fakekey)) {
-                       if (gtk_accel_groups_activate(G_OBJECT(win), fakekey, GdkModifierType(ev->state))) {
+                       if (allow_activating && gtk_accel_groups_activate(G_OBJECT(win), fakekey, GdkModifierType(ev->state))) {
                                return true;
                        }
 
 #ifdef GTKOSX
-                       int oldval = ev->keyval;
-                       ev->keyval = fakekey;
-                       if (gdk_quartz_possibly_forward ((GdkEvent*) ev)) {
-                               return true;
+                       if (allow_activating) {
+                               int oldval = ev->keyval;
+                               ev->keyval = fakekey;
+                               if (gdk_quartz_possibly_forward ((GdkEvent*) ev)) {
+                                       return true;
+                               }
+                               ev->keyval = oldval;
                        }
-                       ev->keyval = oldval;
 #endif
                }
        }
@@ -497,26 +567,24 @@ key_press_focus_accelerator_handler (Gtk::Window& window, GdkEventKey* ev)
                        cerr << "\tactivate, then propagate\n";
                }
 #endif
+
+               if (allow_activating) {
 #ifdef GTKOSX
-               if (gdk_quartz_possibly_forward ((GdkEvent*) ev)) {
-                       return true;
-               }
-#endif
-               if (!gtk_window_activate_key (win, ev)) {
-#ifdef DEBUG_ACCELERATOR_HANDLING
-                       if (debug) {
-                               cerr << "\tnot accelerated, now propagate\n";
+                       if (gdk_quartz_possibly_forward ((GdkEvent*) ev)) {
+                               return true;
                        }
 #endif
-                       return gtk_window_propagate_key_event (win, ev);
-               } else {
-#ifdef DEBUG_ACCELERATOR_HANDLING
-                       if (debug) {
-                               cerr << "\taccelerated - done.\n";
+                       if (gtk_window_activate_key (win, ev)) {
+                               return true;
                        }
+               }
+
+#ifdef DEBUG_ACCELERATOR_HANDLING
+               if (debug) {
+                       cerr << "\tnot accelerated, now propagate\n";
+               }
 #endif
-                       return true;
-               } 
+               return gtk_window_propagate_key_event (win, ev);
        }
        
        /* no modifiers, propagate first */
@@ -532,12 +600,17 @@ key_press_focus_accelerator_handler (Gtk::Window& window, GdkEventKey* ev)
                        cerr << "\tpropagation didn't handle, so activate\n";
                }
 #endif
+
+               if (allow_activating) {
+                       
 #ifdef GTKOSX
-               if (gdk_quartz_possibly_forward ((GdkEvent*) ev)) {
-                       return true;
-               }
+                       if (gdk_quartz_possibly_forward ((GdkEvent*) ev)) {
+                               return true;
+                       }
 #endif
-               return gtk_window_activate_key (win, ev);
+                       return gtk_window_activate_key (win, ev);
+               } 
+                       
        } else {
 #ifdef DEBUG_ACCELERATOR_HANDLING
                if (debug) {