X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Futils.cc;h=fcfdbe644cffb33871c4a16526231628e99ba0a2;hb=212a4c1f8d00a65e868f8a3baad1a7c48b795c67;hp=ba151fe3499d62718b2ea080337526e49666f044;hpb=976f006cc0ead49242d37377fce0038a8716b95a;p=ardour.git diff --git a/gtk2_ardour/utils.cc b/gtk2_ardour/utils.cc index ba151fe349..fcfdbe644c 100644 --- a/gtk2_ardour/utils.cc +++ b/gtk2_ardour/utils.cc @@ -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"); } @@ -676,11 +613,14 @@ ARDOUR_UI_UTILS::get_icon_sets () } std::string -ARDOUR_UI_UTILS::get_icon_path (const char* cname, string icon_set) +ARDOUR_UI_UTILS::get_icon_path (const char* cname, string icon_set, bool is_image) { std::string data_file_path; string name = cname; - name += X_(".png"); + + if (is_image) { + name += X_(".png"); + } Searchpath spath(ARDOUR::ardour_data_search_path()); @@ -690,10 +630,13 @@ ARDOUR_UI_UTILS::get_icon_path (const char* cname, string icon_set) 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); } - if (data_file_path.empty()) { + if (is_image && data_file_path.empty()) { if (!icon_set.empty() && icon_set != _("default")) { warning << string_compose (_("icon \"%1\" not found for icon set \"%2\", fallback to default"), cname, icon_set) << endmsg; @@ -704,7 +647,7 @@ ARDOUR_UI_UTILS::get_icon_path (const char* cname, string icon_set) 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*/ } } @@ -859,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 */ @@ -875,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 */ @@ -979,27 +922,39 @@ ARDOUR_UI_UTILS::rate_as_string (float r) return buf; } - -string -ARDOUR_UI_UTILS::track_number_to_string ( - int64_t tracknumber, - std::string sep, - std::string postfix - ) +bool +ARDOUR_UI_UTILS::windows_overlap (Gtk::Window *a, Gtk::Window *b) { - string rv; - if (tracknumber > 0) { - rv = ""; - rv += PBD::to_string (tracknumber, std::dec); - rv += ""; - rv += sep; - } - else if (tracknumber < 0) { - rv = ""; - rv += PBD::to_string (-tracknumber, std::dec); - rv += ""; - rv += sep; - } - rv += Glib::Markup::escape_text(postfix); - return rv; + + 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; }