diff --git a/gtk2_ardour/mixer_strip.cc b/gtk2_ardour/mixer_strip.cc index f7a61898ac..dc86a27222 100644 --- a/gtk2_ardour/mixer_strip.cc +++ b/gtk2_ardour/mixer_strip.cc @@ -607,11 +607,7 @@ MixerStrip::set_route (boost::shared_ptr rt) control_slave_ui.set_sensitive(true); } - if (_mixer_owned && route()->is_master() ) { - spacer.show(); - } else { - spacer.hide(); - } + hide_master_spacer (false); if (is_track()) { monitor_input_button->show (); @@ -2675,3 +2671,13 @@ MixerStrip::set_marked_for_display (bool yn) { return RouteUI::mark_hidden (!yn); } + +void +MixerStrip::hide_master_spacer (bool yn) +{ + if (_mixer_owned && route()->is_master() && !yn) { + spacer.show(); + } else { + spacer.hide(); + } +} diff --git a/gtk2_ardour/mixer_strip.h b/gtk2_ardour/mixer_strip.h index 1510d38242..7164d15e63 100644 --- a/gtk2_ardour/mixer_strip.h +++ b/gtk2_ardour/mixer_strip.h @@ -114,6 +114,9 @@ public: return _mixer_owned; } + /* used for screenshots */ + void hide_master_spacer (bool); + void hide_things (); sigc::signal WidthChanged; diff --git a/gtk2_ardour/mixer_ui.cc b/gtk2_ardour/mixer_ui.cc index 1773c4497c..71f6bca825 100644 --- a/gtk2_ardour/mixer_ui.cc +++ b/gtk2_ardour/mixer_ui.cc @@ -3503,21 +3503,82 @@ Mixer_UI::vca_unassign (boost::shared_ptr vca) } } -void +bool Mixer_UI::screenshot (std::string const& filename) { - Gtk::OffscreenWindow osw; + if (!_session) { + return false; + } + int height = strip_packer.get_height(); + bool with_vca = vca_vpacker.is_visible (); + MixerStrip* master = strip_by_route (_session->master_out ()); + + Gtk::OffscreenWindow osw; + Gtk::HBox b; + osw.add (b); + b.show (); + + /* unpack widgets, add to OffscreenWindow */ + strip_group_box.remove (strip_packer); - osw.add (strip_packer); + b.pack_start (strip_packer, false, false); + /* hide extra elements inside strip_packer */ add_button.hide (); + scroller_base.hide (); +#ifdef MIXBUS + mb_shadow.hide(); +#endif + + if (with_vca) { + /* work around Gtk::ScrolledWindow */ + Gtk::Viewport* viewport = (Gtk::Viewport*) vca_scroller.get_child(); + viewport->remove (); // << vca_hpacker + b.pack_start (vca_hpacker, false, false); + /* hide some growing widgets */ + add_vca_button.hide (); + vca_scroller_base.hide(); + } + + if (master) { + out_packer.remove (*master); + b.pack_start (*master, false, false); + master->hide_master_spacer (true); + } + + /* prepare the OffscreenWindow for rendering */ osw.set_size_request (-1, height); - osw.show(); + osw.show (); + osw.queue_resize (); + osw.queue_draw (); osw.get_window()->process_updates (true); + + /* create screenshot */ Glib::RefPtr pb = osw.get_pixbuf (); pb->save (filename, "png"); + + /* unpack elements before destorying the Box & OffscreenWindow */ + list children = b.get_children(); + for (list::iterator child = children.begin(); child != children.end(); ++child) { + b.remove (**child); + } osw.remove (); - pb.release (); + + /* now re-pack the widgets into the main mixer window */ add_button.show (); + scroller_base.show (); +#ifdef MIXBUS + mb_shadow.show(); +#endif strip_group_box.pack_start (strip_packer); + if (with_vca) { + add_vca_button.show (); + vca_scroller_base.show(); + vca_scroller.add (vca_hpacker); + } + if (master) { + master->hide_master_spacer (false); + out_packer.pack_start (*master, false, false); + } + return true; } diff --git a/gtk2_ardour/mixer_ui.h b/gtk2_ardour/mixer_ui.h index 85197b991d..cda2d4e1bd 100644 --- a/gtk2_ardour/mixer_ui.h +++ b/gtk2_ardour/mixer_ui.h @@ -147,7 +147,7 @@ public: void showhide_mixbusses (bool on); #endif - void screenshot (std::string const&); + bool screenshot (std::string const&); protected: void set_axis_targets_for_operation ();