refine "Running" message.
[ardour.git] / gtk2_ardour / utils.cc
index 8011f6abfd8766a67649fef3de32afdcb9bf07eb..fcfdbe644cffb33871c4a16526231628e99ba0a2 100644 (file)
@@ -263,112 +263,6 @@ ARDOUR_UI_UTILS::get_font_for_style (string widgetname)
        return Pango::FontDescription (pfd); /* make a copy */
 }
 
-uint32_t
-ARDOUR_UI_UTILS::rgba_from_style (string style, uint32_t r, uint32_t g, uint32_t b, uint32_t a, string attr, int state, bool rgba)
-{
-       /* In GTK+2, styles aren't set up correctly if the widget is not
-          attached to a toplevel window that has a screen pointer.
-       */
-
-       static Gtk::Window* window = 0;
-
-       if (window == 0) {
-               window = new Window (WINDOW_TOPLEVEL);
-       }
-
-       Gtk::Label foo;
-
-       window->add (foo);
-
-       foo.set_name (style);
-       foo.ensure_style ();
-
-       GtkRcStyle* rc = foo.get_style()->gobj()->rc_style;
-
-       if (rc) {
-               if (attr == "fg") {
-                       r = rc->fg[state].red / 257;
-                       g = rc->fg[state].green / 257;
-                       b = rc->fg[state].blue / 257;
-
-                       /* what a hack ... "a" is for "active" */
-                       if (state == Gtk::STATE_NORMAL && rgba) {
-                               a = rc->fg[GTK_STATE_ACTIVE].red / 257;
-                       }
-               } else if (attr == "bg") {
-                       r = g = b = 0;
-                       r = rc->bg[state].red / 257;
-                       g = rc->bg[state].green / 257;
-                       b = rc->bg[state].blue / 257;
-               } else if (attr == "base") {
-                       r = rc->base[state].red / 257;
-                       g = rc->base[state].green / 257;
-                       b = rc->base[state].blue / 257;
-               } else if (attr == "text") {
-                       r = rc->text[state].red / 257;
-                       g = rc->text[state].green / 257;
-                       b = rc->text[state].blue / 257;
-               }
-       } else {
-               warning << string_compose (_("missing RGBA style for \"%1\""), style) << endl;
-       }
-
-       window->remove ();
-
-       if (state == Gtk::STATE_NORMAL && rgba) {
-               return (uint32_t) RGBA_TO_UINT(r,g,b,a);
-       } else {
-               return (uint32_t) RGBA_TO_UINT(r,g,b,255);
-       }
-}
-
-bool
-ARDOUR_UI_UTILS::rgba_p_from_style (string style, float *r, float *g, float *b, string attr, int state)
-{
-       static Gtk::Window* window = 0;
-       assert (r && g && b);
-
-       if (window == 0) {
-               window = new Window (WINDOW_TOPLEVEL);
-       }
-
-       Gtk::EventBox foo;
-
-       window->add (foo);
-
-       foo.set_name (style);
-       foo.ensure_style ();
-
-       GtkRcStyle* rc = foo.get_style()->gobj()->rc_style;
-
-       if (!rc) {
-               warning << string_compose (_("missing RGBA style for \"%1\""), style) << endl;
-               return false;
-       }
-       if (attr == "fg") {
-               *r = rc->fg[state].red / 65535.0;
-               *g = rc->fg[state].green / 65535.0;
-               *b = rc->fg[state].blue / 65535.0;
-       } else if (attr == "bg") {
-               *r = rc->bg[state].red / 65535.0;
-               *g = rc->bg[state].green / 65535.0;
-               *b = rc->bg[state].blue / 65535.0;
-       } else if (attr == "base") {
-               *r = rc->base[state].red / 65535.0;
-               *g = rc->base[state].green / 65535.0;
-               *b = rc->base[state].blue / 65535.0;
-       } else if (attr == "text") {
-               *r = rc->text[state].red / 65535.0;
-               *g = rc->text[state].green / 65535.0;
-               *b = rc->text[state].blue / 65535.0;
-       } else {
-               return false;
-       }
-
-       window->remove ();
-       return true;
-}
-
 void
 ARDOUR_UI_UTILS::set_color_from_rgb (Gdk::Color& c, uint32_t rgb)
 {
@@ -454,6 +348,64 @@ ARDOUR_UI_UTILS::emulate_key_event (Gtk::Widget* w, unsigned int keyval)
        return forward_key_press(&ev);
 }
 
+static string
+show_gdk_event_state (int state)
+{
+       string s;
+       if (state & GDK_SHIFT_MASK) {
+               s += "+SHIFT";
+       }
+       if (state & GDK_LOCK_MASK) {
+               s += "+LOCK";
+       }
+       if (state & GDK_CONTROL_MASK) {
+               s += "+CONTROL";
+       }
+       if (state & GDK_MOD1_MASK) {
+               s += "+MOD1";
+       }
+       if (state & GDK_MOD2_MASK) {
+               s += "+MOD2";
+       }
+       if (state & GDK_MOD3_MASK) {
+               s += "+MOD3";
+       }
+       if (state & GDK_MOD4_MASK) {
+               s += "+MOD4";
+       }
+       if (state & GDK_MOD5_MASK) {
+               s += "+MOD5";
+       }
+       if (state & GDK_BUTTON1_MASK) {
+               s += "+BUTTON1";
+       }
+       if (state & GDK_BUTTON2_MASK) {
+               s += "+BUTTON2";
+       }
+       if (state & GDK_BUTTON3_MASK) {
+               s += "+BUTTON3";
+       }
+       if (state & GDK_BUTTON4_MASK) {
+               s += "+BUTTON4";
+       }
+       if (state & GDK_BUTTON5_MASK) {
+               s += "+BUTTON5";
+       }
+       if (state & GDK_SUPER_MASK) {
+               s += "+SUPER";
+       }
+       if (state & GDK_HYPER_MASK) {
+               s += "+HYPER";
+       }
+       if (state & GDK_META_MASK) {
+               s += "+META";
+       }
+       if (state & GDK_RELEASE_MASK) {
+               s += "+RELEASE";
+       }
+
+       return s;
+}
 bool
 ARDOUR_UI_UTILS::key_press_focus_accelerator_handler (Gtk::Window& window, GdkEventKey* ev)
 {
@@ -463,6 +415,9 @@ ARDOUR_UI_UTILS::key_press_focus_accelerator_handler (Gtk::Window& window, GdkEv
        bool allow_activating = true;
        /* consider all relevant modifiers but not LOCK or SHIFT */
        const guint mask = (Keyboard::RelevantModifierKeyMask & ~(Gdk::SHIFT_MASK|Gdk::LOCK_MASK));
+        GdkModifierType modifier = GdkModifierType (ev->state);
+        modifier = GdkModifierType (modifier & gtk_accelerator_get_default_mod_mask());
+        Gtkmm2ext::possibly_translate_mod_to_make_legal_accelerator(modifier);
 
        if (focus) {
                if (GTK_IS_ENTRY(focus) || Keyboard::some_magic_widget_has_focus()) {
@@ -483,14 +438,15 @@ ARDOUR_UI_UTILS::key_press_focus_accelerator_handler (Gtk::Window& window, GdkEv
 #endif
 
 
-        DEBUG_TRACE (DEBUG::Accelerators, string_compose ("Win = %1 focus = %7 Key event: code = %2  state = %3 special handling ? %4 magic widget focus ? %5 allow_activation ? %6\n",
+        DEBUG_TRACE (DEBUG::Accelerators, string_compose ("Win = %1 focus = %7 (%8) Key event: code = %2  state = %3 special handling ? %4 magic widget focus ? %5 allow_activation ? %6\n",
                                                           win,
                                                           ev->keyval,
-                                                          ev->state,
+                                                         show_gdk_event_state (ev->state),
                                                           special_handling_of_unmodified_accelerators,
                                                           Keyboard::some_magic_widget_has_focus(),
                                                           allow_activating,
-                                                         focus));
+                                                         focus,
+                                                          (focus ? gtk_widget_get_name (focus) : "no focus widget")));
 
        /* This exists to allow us to override the way GTK handles
           key events. The normal sequence is:
@@ -525,6 +481,7 @@ ARDOUR_UI_UTILS::key_press_focus_accelerator_handler (Gtk::Window& window, GdkEv
 
        if (!special_handling_of_unmodified_accelerators) {
 
+
                /* XXX note that for a brief moment, the conditional above
                 * included "|| (ev->state & mask)" so as to enforce the
                 * implication of special_handling_of_UNMODIFIED_accelerators.
@@ -552,29 +509,9 @@ ARDOUR_UI_UTILS::key_press_focus_accelerator_handler (Gtk::Window& window, GdkEv
                        DEBUG_TRACE (DEBUG::Accelerators, string_compose ("\tactivate (was %1 now %2) without special hanlding of unmodified accels\n",
                                                                          ev->keyval, fakekey));
 
-                       GdkModifierType mod = GdkModifierType (ev->state);
-
-                       mod = GdkModifierType (mod & gtk_accelerator_get_default_mod_mask());
-#ifdef GTKOSX
-                       /* GTK on OS X is currently (February 2012) setting both
-                          the Meta and Mod2 bits in the event modifier state if 
-                          the Command key is down.
-
-                          gtk_accel_groups_activate() does not invoke any of the logic
-                          that gtk_window_activate_key() will that sorts out that stupid
-                          state of affairs, and as a result it fails to find a match
-                          for the key event and the current set of accelerators.
-
-                          to fix this, if the meta bit is set, remove the mod2 bit
-                          from the modifier. this assumes that our bindings use Primary
-                          which will have set the meta bit in the accelerator entry.
-                       */
-                       if (mod & GDK_META_MASK) {
-                               mod = GdkModifierType (mod & ~GDK_MOD2_MASK);
-                       }
-#endif
-
-                       if (allow_activating && gtk_accel_groups_activate(G_OBJECT(win), fakekey, mod)) {
+                       DEBUG_TRACE (DEBUG::Accelerators, string_compose ("\tmodified modifier was %1\n", show_gdk_event_state (modifier)));
+                       
+                       if (allow_activating && gtk_accel_groups_activate(G_OBJECT(win), fakekey, modifier)) {
                                DEBUG_TRACE (DEBUG::Accelerators, "\taccel group activated by fakekey\n");
                                return true;
                        }
@@ -591,8 +528,8 @@ ARDOUR_UI_UTILS::key_press_focus_accelerator_handler (Gtk::Window& window, GdkEv
 
                if (allow_activating) {
                        DEBUG_TRACE (DEBUG::Accelerators, "\tsending to window\n");
-                       if (gtk_window_activate_key (win, ev)) {
-                               DEBUG_TRACE (DEBUG::Accelerators, "\t\thandled\n");
+                        if (gtk_accel_groups_activate (G_OBJECT(win), ev->keyval, modifier)) {
+                                DEBUG_TRACE (DEBUG::Accelerators, "\t\thandled\n");
                                return true;
                        }
                } else {
@@ -611,7 +548,7 @@ ARDOUR_UI_UTILS::key_press_focus_accelerator_handler (Gtk::Window& window, GdkEv
        if (!gtk_window_propagate_key_event (win, ev)) {
                 DEBUG_TRACE (DEBUG::Accelerators, "\tpropagation didn't handle, so activate\n");
                if (allow_activating) {
-                       return gtk_window_activate_key (win, ev);
+                       return gtk_accel_groups_activate (G_OBJECT(win), ev->keyval, modifier);
                } else {
                        DEBUG_TRACE (DEBUG::Accelerators, "\tactivation skipped\n");
                }
@@ -693,6 +630,9 @@ ARDOUR_UI_UTILS::get_icon_path (const char* cname, string icon_set, bool is_imag
                spath.add_subdirectory_to_paths ("icons");
                spath.add_subdirectory_to_paths (icon_set);
                
+               find_file (spath, name, data_file_path);
+       } else {
+               spath.add_subdirectory_to_paths ("icons");
                find_file (spath, name, data_file_path);
        }
        
@@ -707,7 +647,7 @@ ARDOUR_UI_UTILS::get_icon_path (const char* cname, string icon_set, bool is_imag
        
                if (!find_file (def, name, data_file_path)) {
                        fatal << string_compose (_("cannot find icon image for %1 using %2"), name, spath.to_string()) << endmsg;
-                       /*NOTREACHED*/
+                       abort(); /*NOTREACHED*/
                }
        }
 
@@ -862,7 +802,7 @@ ARDOUR_UI_UTILS::key_is_legal_for_numeric_entry (guint keyval)
 void
 ARDOUR_UI_UTILS::set_pango_fontsize ()
 {
-       long val = ARDOUR::Config->get_font_scale();
+       long val = ARDOUR_UI::config()->get_font_scale();
 
        /* FT2 rendering - used by GnomeCanvas, sigh */
 
@@ -878,7 +818,7 @@ ARDOUR_UI_UTILS::set_pango_fontsize ()
 void
 ARDOUR_UI_UTILS::reset_dpi ()
 {
-       long val = ARDOUR::Config->get_font_scale();
+       long val = ARDOUR_UI::config()->get_font_scale();
        set_pango_fontsize ();
        /* Xft rendering */
 
@@ -981,3 +921,40 @@ ARDOUR_UI_UTILS::rate_as_string (float r)
        }
        return buf;
 }
+
+bool
+ARDOUR_UI_UTILS::windows_overlap (Gtk::Window *a, Gtk::Window *b)
+{
+
+       if (!a || !b) {
+               return false;
+       }
+       if (a->get_screen() == b->get_screen()) {
+               gint ex, ey, ew, eh;
+               gint mx, my, mw, mh;
+
+               a->get_position (ex, ey);
+               a->get_size (ew, eh);
+               b->get_position (mx, my);
+               b->get_size (mw, mh);
+
+               GdkRectangle e;
+               GdkRectangle m;
+               GdkRectangle r;
+
+               e.x = ex;
+               e.y = ey;
+               e.width = ew;
+               e.height = eh;
+
+               m.x = mx;
+               m.y = my;
+               m.width = mw;
+               m.height = mh;
+
+               if (gdk_rectangle_intersect (&e, &m, &r)) {
+                       return true;
+               }
+       }
+       return false;
+}