summaryrefslogtreecommitdiff
path: root/gtk2_ardour/ardour_ui_dialogs.cc
diff options
context:
space:
mode:
authorRobin Gareus <robin@gareus.org>2015-06-26 22:35:40 +0200
committerRobin Gareus <robin@gareus.org>2015-06-26 22:35:54 +0200
commit02be98b3d614bbb156351f83dbd164d7d2fe071a (patch)
treea27a6613a96849b3d26012136e1ee9d546feb730 /gtk2_ardour/ardour_ui_dialogs.cc
parent7bc9d8aa90031046cfce233dd171b19d0deab6df (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.cc56
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);
}