summaryrefslogtreecommitdiff
path: root/gtk2_ardour/meterbridge.cc
diff options
context:
space:
mode:
authorRobin Gareus <robin@gareus.org>2015-01-07 22:07:23 +0100
committerRobin Gareus <robin@gareus.org>2015-01-07 23:46:22 +0100
commit0a4038f1df44bd289fac1f767eacb1b863fb5fbe (patch)
tree800d8beb0674c59b694f261e3f326e7165c295ab /gtk2_ardour/meterbridge.cc
parenta4f7c21ec38e59281b4755b6b96651f0b310cdd2 (diff)
fix meter bridge window size issues
* no more OSX liveloop (window size < min size) * properly set min window size * re-layout metric areas when label height changes * remove ‘smart’ auto-resize (when tracks are added/removed) (it wasn’t smart enough to work on all WMs)
Diffstat (limited to 'gtk2_ardour/meterbridge.cc')
-rw-r--r--gtk2_ardour/meterbridge.cc33
1 files changed, 11 insertions, 22 deletions
diff --git a/gtk2_ardour/meterbridge.cc b/gtk2_ardour/meterbridge.cc
index 8eee194a39..08604b0620 100644
--- a/gtk2_ardour/meterbridge.cc
+++ b/gtk2_ardour/meterbridge.cc
@@ -104,9 +104,12 @@ Meterbridge::Meterbridge ()
Gdk::Geometry geom;
geom.max_width = 1<<16;
geom.max_height = max_height;
+ geom.min_width = 40;
+ geom.min_height = -1;
geom.height_inc = 16;
geom.width_inc = 1;
- set_geometry_hints(*((Gtk::Window*) this), geom, Gdk::HINT_MAX_SIZE | Gdk::HINT_RESIZE_INC);
+ assert(max_height % 16 == 0);
+ set_geometry_hints(*((Gtk::Window*) this), geom, Gdk::HINT_MIN_SIZE | Gdk::HINT_MAX_SIZE | Gdk::HINT_RESIZE_INC);
set_keep_above (true);
set_border_width (0);
@@ -325,33 +328,18 @@ Meterbridge::on_size_request (Gtk::Requisition* r)
Gtk::Requisition mr = meterarea.size_request();
geom.max_width = mr.width + metrics_left.get_width() + metrics_right.get_width();
+ geom.max_width = std::max(50, geom.max_width);
geom.max_height = max_height;
-#ifndef GTKOSX
- /* on OSX this leads to a constant live-loop: show/hide scrollbar
- * on Linux, the window is resized IFF the scrollbar was not visible
- */
- const Gtk::Scrollbar * hsc = scroller.get_hscrollbar();
- Glib::RefPtr<Gdk::Screen> screen = get_screen ();
- Gdk::Rectangle monitor_rect;
- screen->get_monitor_geometry (0, monitor_rect);
- const int scr_w = monitor_rect.get_width() - 44;
-
- if (cur_max_width < geom.max_width
- && cur_max_width < scr_w
- && !(scroller.get_hscrollbar_visible() && hsc)) {
- int h = r->height;
- *r = Gtk::Requisition();
- r->width = geom.max_width;
- r->height = h;
- }
-#endif
-
if (cur_max_width != geom.max_width) {
cur_max_width = geom.max_width;
+ /* height resizes are 'heavy' since the metric areas and meter-patterns
+ * are re-generated. limit to 16px steps. */
geom.height_inc = 16;
geom.width_inc = 1;
- set_geometry_hints(*((Gtk::Window*) this), geom, Gdk::HINT_MAX_SIZE | Gdk::HINT_RESIZE_INC);
+ geom.min_width = 40;
+ geom.min_height = -1;
+ set_geometry_hints(*((Gtk::Window*) this), geom, Gdk::HINT_MIN_SIZE | Gdk::HINT_MAX_SIZE | Gdk::HINT_RESIZE_INC);
}
}
@@ -360,6 +348,7 @@ Meterbridge::on_size_allocate (Gtk::Allocation& a)
{
const Gtk::Scrollbar * hsc = scroller.get_hscrollbar();
+ /* switch left/right edge patterns depending on horizontal scroll-position */
if (scroller.get_hscrollbar_visible() && hsc) {
if (!scroll_connection.connected()) {
scroll_connection = scroller.get_hscrollbar()->get_adjustment()->signal_value_changed().connect(sigc::mem_fun (*this, &Meterbridge::on_scroll));