diff options
author | Robin Gareus <robin@gareus.org> | 2015-06-26 22:35:40 +0200 |
---|---|---|
committer | Robin Gareus <robin@gareus.org> | 2015-06-26 22:35:54 +0200 |
commit | 02be98b3d614bbb156351f83dbd164d7d2fe071a (patch) | |
tree | a27a6613a96849b3d26012136e1ee9d546feb730 /gtk2_ardour/ardour_ui_dialogs.cc | |
parent | 7bc9d8aa90031046cfce233dd171b19d0deab6df (diff) |
Alternative approach for show/hide Meterbridge #6386
* no more on-top (transient to editor)
* similar approach as toggle editor/mixer
see also 0cd1db76f04
Diffstat (limited to 'gtk2_ardour/ardour_ui_dialogs.cc')
-rw-r--r-- | gtk2_ardour/ardour_ui_dialogs.cc | 56 |
1 files changed, 49 insertions, 7 deletions
diff --git a/gtk2_ardour/ardour_ui_dialogs.cc b/gtk2_ardour/ardour_ui_dialogs.cc index d1efb4d7de..6556238240 100644 --- a/gtk2_ardour/ardour_ui_dialogs.cc +++ b/gtk2_ardour/ardour_ui_dialogs.cc @@ -393,19 +393,61 @@ ARDOUR_UI::toggle_mixer_window () void ARDOUR_UI::toggle_meterbridge () { - Glib::RefPtr<Action> act = ActionManager::get_action (X_("Common"), X_("toggle-meterbridge")); - if (!act) { + if (!editor || !meterbridge) { + /* can this really happen? + * keyboard shortcut during session close, maybe? + */ +#ifndef NDEBUG + /* one way to find out: */ + printf("ARDOUR_UI::toggle_meterbridge: Editor: %p MB: %p\n", editor, meterbridge); + PBD::stacktrace (std::cerr, 20); + assert (0); +#endif return; } - Glib::RefPtr<ToggleAction> tact = Glib::RefPtr<ToggleAction>::cast_dynamic (act); + bool show = false; + bool obscuring = false; - if (tact->get_active()) { + if (meterbridge->not_visible ()) { + show = true; + } + else if (editor->get_screen() == meterbridge->get_screen()) { + gint ex, ey, ew, eh; + gint mx, my, mw, mh; + + editor->get_position (ex, ey); + editor->get_size (ew, eh); + meterbridge->get_position (mx, my); + meterbridge->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)) { + obscuring = true; + } + } + + if (obscuring && editor->property_has_toplevel_focus()) { + show = true; + } + + if (show) { meterbridge->show_window (); meterbridge->present (); - if (editor) { - meterbridge->set_transient_for (*editor); - } + meterbridge->raise (); } else { meterbridge->hide_window (NULL); } |