lots of tricks & tweaks related to the monitor section and All That It Uses

git-svn-id: svn://localhost/ardour2/branches/3.0@6777 d708f5d6-7413-0410-9779-e7cbd77b26cf
This commit is contained in:
Paul Davis 2010-03-19 20:53:22 +00:00
parent 587021ac0b
commit d163021950
14 changed files with 219 additions and 174 deletions

View File

@ -1132,7 +1132,7 @@ style "flashing_alert" = "very_small_text"
{
fg[NORMAL] = { 0.80, 0.80, 0.80 }
bg[NORMAL] = { 0.26, 0.26, 0.31 }
fg[ACTIVE] = { 0.80, 0.80, 0.80 }
bg[ACTIVE] = { 1.0, 0, 0}
}
@ -1585,6 +1585,8 @@ widget "*BypassButton" style:highest "red_when_active"
widget "*BypassButton*" style:highest "red_when_active"
widget "*TransportSoloAlert" style:highest "flashing_alert"
widget "*TransportSoloAlert.*" style:highest "flashing_alert"
widget "*TransportSoloAlert-active" style:highest "flashing_alert"
widget "*TransportSoloAlert-alternate" style:highest "flashing_alert"
widget "*SendAlert" style:highest "green_flashing_alert"
widget "*SendAlert.*" style:highest "green_flashing_alert"
widget "*TransportAuditioningAlert" style:highest "flashing_alert"

View File

@ -184,6 +184,7 @@ class ARDOUR_UI : public Gtkmm2ext::UI, public ARDOUR::SessionHandlePtr
XMLNode* editor_settings() const;
XMLNode* mixer_settings () const;
XMLNode* keyboard_settings () const;
XMLNode* tearoff_settings (const char*) const;
void save_ardour_state ();
gboolean configure_handler (GdkEventConfigure* conf);
@ -455,8 +456,8 @@ class ARDOUR_UI : public Gtkmm2ext::UI, public ARDOUR::SessionHandlePtr
void auditioning_changed (bool);
void _auditioning_changed (bool);
void solo_alert_toggle ();
void audition_alert_toggle ();
bool solo_alert_press (GdkEventButton* ev);
bool audition_alert_press (GdkEventButton* ev);
void big_clock_value_changed ();
void primary_clock_value_changed ();

View File

@ -72,10 +72,6 @@ ARDOUR_UI::setup_windows ()
we_have_dependents ();
setup_clock ();
setup_transport();
build_menu_bar ();
theme_manager->signal_unmap().connect (sigc::bind (sigc::ptr_fun(&ActionManager::uncheck_toggleaction), X_("<Actions>/Common/ToggleThemeManager")));
#ifdef TOP_MENUBAR
@ -97,6 +93,10 @@ ARDOUR_UI::setup_windows ()
editor->add_toplevel_controls (top_packer);
setup_clock ();
setup_transport();
build_menu_bar ();
setup_tooltips ();
return 0;
@ -174,6 +174,22 @@ block_prelight (Gtk::Widget& w)
}
#endif
XMLNode*
ARDOUR_UI::tearoff_settings (const char* name) const
{
XMLNode* ui_node = Config->extra_xml(X_("UI"));
if (ui_node) {
XMLNode* tearoff_node = ui_node->child (X_("Tearoffs"));
if (tearoff_node) {
XMLNode* mnode = tearoff_node->child (name);
return mnode;
}
}
return 0;
}
void
ARDOUR_UI::setup_transport ()
{
@ -319,9 +335,9 @@ ARDOUR_UI::setup_transport ()
/* CANNOT sigc::bind these to clicked or toggled, must use pressed or released */
solo_alert_button.set_name ("TransportSoloAlert");
solo_alert_button.signal_pressed().connect (sigc::mem_fun(*this,&ARDOUR_UI::solo_alert_toggle));
solo_alert_button.signal_button_press_event().connect (sigc::mem_fun(*this,&ARDOUR_UI::solo_alert_press), false);
auditioning_alert_button.set_name ("TransportAuditioningAlert");
auditioning_alert_button.signal_pressed().connect (sigc::mem_fun(*this,&ARDOUR_UI::audition_alert_toggle));
auditioning_alert_button.signal_button_press_event().connect (sigc::mem_fun(*this,&ARDOUR_UI::audition_alert_press), false);
alert_box.pack_start (solo_alert_button, false, false);
alert_box.pack_start (auditioning_alert_button, false, false);
@ -435,6 +451,11 @@ ARDOUR_UI::setup_transport ()
Image* img = manage (new Image ((::get_icon (X_("sae")))));
transport_tearoff_hbox.pack_end (*img, false, false, 6);
}
XMLNode* tnode = tearoff_settings ("transport");
if (tnode) {
transport_tearoff->set_state (*tnode);
}
}
void
@ -482,20 +503,26 @@ ARDOUR_UI::auditioning_changed (bool onoff)
UI::instance()->call_slot (boost::bind (&ARDOUR_UI::_auditioning_changed, this, onoff));
}
void
ARDOUR_UI::audition_alert_toggle ()
bool
ARDOUR_UI::audition_alert_press (GdkEventButton* ev)
{
if (_session) {
_session->cancel_audition();
}
return true;
}
void
ARDOUR_UI::solo_alert_toggle ()
bool
ARDOUR_UI::solo_alert_press (GdkEventButton* ev)
{
if (_session) {
_session->set_solo (_session->get_routes(), !_session->soloing());
}
if (_session) {
if (_session->soloing()) {
_session->set_solo (_session->get_routes(), false);
} else if (_session->listening()) {
_session->set_listen (_session->get_routes(), false);
}
}
return true;
}
void
@ -505,7 +532,7 @@ ARDOUR_UI::solo_blink (bool onoff)
return;
}
if (_session->soloing()) {
if (_session->soloing() || _session->listening()) {
if (onoff) {
solo_alert_button.set_state (STATE_ACTIVE);
} else {

View File

@ -722,19 +722,19 @@ ARDOUR_UI::save_ardour_state ()
if (transport_tearoff) {
XMLNode* t = new XMLNode (X_("transport"));
transport_tearoff->add_tornoff_state (*t);
transport_tearoff->add_state (*t);
tearoff_node->add_child_nocopy (*t);
}
if (mixer && mixer->monitor_section()) {
XMLNode* t = new XMLNode (X_("monitor-section"));
mixer->monitor_section()->tearoff()->add_tornoff_state (*t);
mixer->monitor_section()->tearoff().add_state (*t);
tearoff_node->add_child_nocopy (*t);
}
if (editor && editor->mouse_mode_tearoff()) {
XMLNode* t = new XMLNode (X_("mouse-mode"));
editor->mouse_mode_tearoff ()->add_tornoff_state (*t);
editor->mouse_mode_tearoff ()->add_state (*t);
tearoff_node->add_child_nocopy (*t);
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 68 KiB

After

Width:  |  Height:  |  Size: 68 KiB

View File

@ -193,7 +193,7 @@ MixerStrip::init ()
middle_button_table.set_homogeneous (true);
middle_button_table.set_spacings (0);
middle_button_table.attach (*mute_button, 0, 1, 0, 1);
middle_button_table.attach (*solo_button, 1, 2, 0, 1);
middle_button_table.attach (*solo_button, 1, 2, 0, 1);
bottom_button_table.set_col_spacings (0);
bottom_button_table.set_homogeneous (true);
@ -338,6 +338,12 @@ MixerStrip::set_route (boost::shared_ptr<Route> rt)
set_color (unique_random_color());
}
if (route()->is_master()) {
solo_button->hide ();
} else {
solo_button->show ();
}
if (_mixer_owned && (route()->is_master() || route()->is_control())) {
if (scrollbar_height == 0) {

View File

@ -324,26 +324,16 @@ Mixer_UI::add_strip (RouteList& routes)
if (route->is_control()) {
if (!_monitor_section) {
_monitor_section = new MonitorSection (_session);
out_packer.pack_end (_monitor_section->pack_widget(), false, false);
out_packer.pack_end (_monitor_section->tearoff(), false, false);
} else {
_monitor_section->set_session (_session);
}
_monitor_section->pack_widget().show_all ();
_monitor_section->tearoff().show_all ();
XMLNode* ui_node = Config->extra_xml(X_("UI"));
if (ui_node) {
cerr << "Got UI node\n";
XMLNode* tearoff_node = ui_node->child (X_("Tearoffs"));
if (tearoff_node) {
cerr << "Got tearoff node\n";
XMLNode* mnode = tearoff_node->child (X_("monitor-section"));
if (mnode) {
cerr << "got mndeo\n";
_monitor_section->tearoff()->set_tornoff_state (*mnode);
}
}
XMLNode* mnode = ARDOUR_UI::instance()->tearoff_settings (X_("monitor-section"));
if (mnode) {
_monitor_section->tearoff().set_state (*mnode);
}
/* no regular strip shown for control out */
@ -548,7 +538,7 @@ Mixer_UI::session_going_away ()
delete (*i);
}
_monitor_section->pack_widget().hide ();
_monitor_section->tearoff().hide_visible ();
strips.clear ();
@ -614,10 +604,6 @@ Mixer_UI::fast_update_strips ()
for (list<MixerStrip *>::iterator i = strips.begin(); i != strips.end(); ++i) {
(*i)->fast_update ();
}
if (_monitor_section) {
_monitor_section->fast_update ();
}
}
}

View File

@ -30,11 +30,31 @@ Glib::RefPtr<ActionGroup> MonitorSection::monitor_actions;
Glib::RefPtr<Gdk::Pixbuf> MonitorSection::big_knob_pixbuf;
Glib::RefPtr<Gdk::Pixbuf> MonitorSection::little_knob_pixbuf;
static bool
fixup_prelight (GdkEventCrossing* /* ignored */, GtkWidget* widget)
{
GtkRcStyle* style = gtk_rc_style_copy (gtk_widget_get_modifier_style (widget));
int current = gtk_widget_get_state (widget);
style->fg[GTK_STATE_PRELIGHT] = style->fg[current];
style->bg[GTK_STATE_PRELIGHT] = style->bg[current];
gtk_widget_modify_style(widget, style);
g_object_unref(style);
return false;
}
static void
block_prelight (Gtk::Widget& w)
{
w.signal_enter_notify_event().connect (sigc::bind (sigc::ptr_fun (fixup_prelight), w.gobj()), false);
}
MonitorSection::MonitorSection (Session* s)
: AxisView (s)
, RouteUI (s)
, main_table (2, 3)
, meter (s)
, _tearoff (0)
, gain_adjustment (1.0, 0.0, 1.0, 0.01, 0.1)
, gain_control (0)
@ -42,6 +62,8 @@ MonitorSection::MonitorSection (Session* s)
, dim_control (0)
, solo_boost_adjustment (1.0, 1.0, 2.0, 0.01, 0.1)
, solo_boost_control (0)
, solo_cut_adjustment (0.0, 0.0, 1.0, 0.01, 0.1)
, solo_cut_control (0)
, solo_in_place_button (solo_model_group, _("SiP"))
, afl_button (solo_model_group, _("AFL"))
, pfl_button (solo_model_group, _("PFL"))
@ -63,35 +85,18 @@ MonitorSection::MonitorSection (Session* s)
set_session (s);
VBox* sub_knob_packer = manage (new VBox);
sub_knob_packer->set_spacing (12);
VBox* spin_packer;
Label* spin_label;
gain_control = new VolumeController (big_knob_pixbuf, &gain_adjustment, true);
gain_adjustment.signal_value_changed().connect (sigc::mem_fun (*this, &MonitorSection::gain_value_changed));
gain_control->spinner().signal_output().connect (sigc::bind (sigc::mem_fun (*this, &MonitorSection::nonlinear_gain_printer),
&gain_control->spinner()));
/* Dim */
spin_label = manage (new Label (_("Gain (dB)")));
spin_packer = manage (new VBox);
spin_packer->show ();
spin_packer->set_spacing (6);
spin_packer->pack_start (*gain_control, false, false);
spin_packer->pack_start (*spin_label, false, false);
sub_knob_packer->pack_start (*spin_packer, false, false);
dim_control = new VolumeController (little_knob_pixbuf, &dim_adjustment, true, 30, 30);
dim_control = new VolumeController (little_knob_pixbuf, &dim_adjustment, false, 30, 30);
dim_adjustment.signal_value_changed().connect (sigc::mem_fun (*this, &MonitorSection::dim_level_changed));
dim_control->spinner().signal_output().connect (sigc::bind (sigc::mem_fun (*this, &MonitorSection::linear_gain_printer),
&dim_control->spinner()));
HBox* dim_packer = manage (new HBox);
dim_packer->show ();
spin_label = manage (new Label (_("Dim Cut (dB)")));
spin_label = manage (new Label (_("Dim Cut")));
spin_packer = manage (new VBox);
spin_packer->show ();
spin_packer->set_spacing (6);
@ -99,64 +104,18 @@ MonitorSection::MonitorSection (Session* s)
spin_packer->pack_start (*spin_label, false, false);
dim_packer->set_spacing (12);
dim_packer->pack_start (*spin_packer, false, false);
dim_packer->pack_start (*spin_packer, true, true);
VBox* keep_dim_under_vertical_size_control = manage (new VBox);
keep_dim_under_vertical_size_control->pack_start (dim_all_button, true, false);
keep_dim_under_vertical_size_control->show ();
dim_all_button.set_size_request (40,40);
dim_all_button.show ();
dim_packer->pack_start (*keep_dim_under_vertical_size_control, false, false);
sub_knob_packer->pack_start (*dim_packer, false, true);
solo_boost_control = new VolumeController (little_knob_pixbuf, &solo_boost_adjustment, true, 30, 30);
solo_boost_adjustment.signal_value_changed().connect (sigc::mem_fun (*this, &MonitorSection::solo_boost_changed));
solo_boost_control->spinner().signal_output().connect (sigc::bind (sigc::mem_fun (*this, &MonitorSection::linear_gain_printer),
&solo_boost_control->spinner()));
HBox* solo_packer = manage (new HBox);
solo_packer->show ();
spin_label = manage (new Label (_("Solo Boost (dB)")));
spin_packer = manage (new VBox);
spin_packer->show ();
spin_packer->set_spacing (6);
spin_packer->pack_start (*solo_boost_control, false, false);
spin_packer->pack_start (*spin_label, false, false);
VBox* keep_rude_solo_under_vertical_size_control = manage (new VBox);
keep_rude_solo_under_vertical_size_control->show ();
keep_rude_solo_under_vertical_size_control->pack_start (rude_solo_button, true, false);
solo_packer->set_spacing (12);
solo_packer->pack_start (*spin_packer, false, false);
solo_packer->pack_start (*keep_rude_solo_under_vertical_size_control, true, false);
/* Rude Solo */
rude_solo_button.set_name ("TransportSoloAlert");
rude_solo_button.show ();
block_prelight (rude_solo_button);
ARDOUR_UI::Blink.connect (sigc::mem_fun (*this, &MonitorSection::solo_blink));
rude_solo_button.signal_button_press_event().connect (sigc::mem_fun(*this, &MonitorSection::cancel_solo));
rude_solo_button.signal_button_press_event().connect (sigc::mem_fun(*this, &MonitorSection::cancel_solo), false);
UI::instance()->set_tip (rude_solo_button, _("When active, something is soloed.\nClick to de-solo everything"));
sub_knob_packer->pack_start (*solo_packer, false, true);
knob_packer.pack_start (*sub_knob_packer, false, true);
sub_knob_packer->show ();
knob_packer.show ();
gain_control->show_all ();
dim_control->show_all ();
solo_boost_control->show_all ();
meter.set_meter (&_route->peak_meter());
meter.setup_meters (300, 5);
table_knob_packer.pack_start (main_table, true, true);
table_knob_packer.pack_start (knob_packer, false, false);
table_knob_packer.show ();
solo_model_box.set_spacing (6);
solo_model_box.pack_start (solo_in_place_button, false, false);
@ -183,7 +142,43 @@ MonitorSection::MonitorSection (Session* s)
act->connect_proxy (pfl_button);
}
/* Solo Boost */
solo_boost_control = new VolumeController (little_knob_pixbuf, &solo_boost_adjustment, false, 30, 30);
solo_boost_adjustment.signal_value_changed().connect (sigc::mem_fun (*this, &MonitorSection::solo_boost_changed));
HBox* solo_packer = manage (new HBox);
solo_packer->set_spacing (12);
solo_packer->show ();
spin_label = manage (new Label (_("Solo Boost")));
spin_packer = manage (new VBox);
spin_packer->show ();
spin_packer->set_spacing (6);
spin_packer->pack_start (*solo_boost_control, false, false);
spin_packer->pack_start (*spin_label, false, false);
solo_packer->pack_start (*spin_packer, true, true);
/* Solo (SiP) cut */
solo_cut_control = new VolumeController (little_knob_pixbuf, &solo_cut_adjustment, false, 30, 30);
// solo_cut_adjustment.signal_value_changed().connect (sigc::mem_fun (*this, &MonitorSection::solo_cut_changed));
spin_label = manage (new Label (_("SiP Cut")));
spin_packer = manage (new VBox);
spin_packer->show ();
spin_packer->set_spacing (6);
spin_packer->pack_start (*solo_cut_control, false, false);
spin_packer->pack_start (*spin_label, false, false);
solo_packer->pack_start (*spin_packer, true, true);
upper_packer.set_spacing (12);
upper_packer.pack_start (rude_solo_button, false, false);
upper_packer.pack_start (solo_model_box, false, false);
upper_packer.pack_start (*solo_packer, false, false);
act = ActionManager::get_action (X_("Monitor"), X_("monitor-cut-all"));
if (act) {
@ -203,31 +198,50 @@ MonitorSection::MonitorSection (Session* s)
cut_all_button.set_size_request (50,50);
cut_all_button.show ();
HBox* bbox = manage (new HBox);
bbox->set_spacing (12);
bbox->pack_start (mono_button, true, true);
bbox->pack_start (dim_all_button, true, true);
lower_packer.set_spacing (12);
lower_packer.pack_start (mono_button, false, false);
lower_packer.pack_start (*bbox, false, false);
lower_packer.pack_start (cut_all_button, false, false);
/* Gain */
gain_control = new VolumeController (big_knob_pixbuf, &gain_adjustment, false, 80, 80);
gain_adjustment.signal_value_changed().connect (sigc::mem_fun (*this, &MonitorSection::gain_value_changed));
spin_label = manage (new Label (_("Gain")));
spin_packer = manage (new VBox);
spin_packer->show ();
spin_packer->set_spacing (6);
spin_packer->pack_start (*gain_control, false, false);
spin_packer->pack_start (*spin_label, false, false);
lower_packer.pack_start (*spin_packer, true, true);
vpacker.set_border_width (12);
vpacker.set_spacing (12);
vpacker.pack_start (upper_packer, false, false);
vpacker.pack_start (table_knob_packer, false, false);
vpacker.pack_start (*dim_packer, false, false);
vpacker.pack_start (main_table, false, false);
vpacker.pack_start (lower_packer, false, false);
VBox* keep_meter_under_control = manage (new VBox);
keep_meter_under_control->pack_start (meter, false, false);
keep_meter_under_control->show ();
hpacker.set_border_width (12);
hpacker.set_spacing (12);
hpacker.pack_start (*keep_meter_under_control, false, false);
hpacker.pack_start (vpacker, true, true);
gain_control->show_all ();
dim_control->show_all ();
solo_boost_control->show_all ();
main_table.show ();
hpacker.show ();
upper_packer.show ();
lower_packer.show ();
vpacker.show ();
meter.show_all ();
populate_buttons ();
map_state ();
@ -266,19 +280,16 @@ MonitorSection::set_session (Session* s)
if (_route) {
/* session with control outs */
_monitor = _route->monitor_control ();
meter.set_meter (&_route->peak_meter());
} else {
/* session with no control outs */
_monitor.reset ();
_route.reset ();
meter.set_meter (0);
}
} else {
/* no session */
_monitor.reset ();
_route.reset ();
meter.set_meter (0);
}
/* both might be null */
@ -298,6 +309,11 @@ MonitorSection::ChannelButtonSet::ChannelButtonSet ()
gtk_activatable_set_use_action_appearance (GTK_ACTIVATABLE (dim.gobj()), false);
gtk_activatable_set_use_action_appearance (GTK_ACTIVATABLE (invert.gobj()), false);
gtk_activatable_set_use_action_appearance (GTK_ACTIVATABLE (solo.gobj()), false);
block_prelight (cut);
block_prelight (dim);
block_prelight (solo);
block_prelight (invert);
}
void
@ -393,12 +409,6 @@ MonitorSection::set_button_names ()
solo_button_label.set_text ("rec");
}
Widget&
MonitorSection::pack_widget () const
{
return *_tearoff;
}
void
MonitorSection::dim_all ()
{
@ -640,18 +650,12 @@ MonitorSection::solo_use_pfl ()
}
}
void
MonitorSection::fast_update ()
{
meter.update_meters ();
}
void
MonitorSection::setup_knob_images ()
{
try {
big_knob_pixbuf = ::get_icon ("knob");
big_knob_pixbuf = ::get_icon ("bigknob");
} catch (...) {
@ -843,7 +847,7 @@ MonitorSection::solo_blink (bool onoff)
rude_solo_button.set_state (STATE_NORMAL);
}
} else {
rude_solo_button.set_active (false);
// rude_solo_button.set_active (false);
rude_solo_button.set_state (STATE_NORMAL);
}
}
@ -851,8 +855,12 @@ MonitorSection::solo_blink (bool onoff)
bool
MonitorSection::cancel_solo (GdkEventButton* ev)
{
if (_session && _session->soloing()) {
_session->set_solo (_session->get_routes(), false);
if (_session) {
if (_session->soloing()) {
_session->set_solo (_session->get_routes(), false);
} else if (_session->listening()) {
_session->set_listen (_session->get_routes(), false);
}
}
return true;

View File

@ -39,12 +39,9 @@ class MonitorSection : public RouteUI
~MonitorSection ();
void set_session (ARDOUR::Session*);
Gtk::Widget& pack_widget () const;
void fast_update ();
static void setup_knob_images ();
Gtkmm2ext::TearOff* tearoff() const { return _tearoff; }
Gtkmm2ext::TearOff& tearoff() const { return *_tearoff; }
private:
Gtk::VBox vpacker;
@ -52,9 +49,6 @@ class MonitorSection : public RouteUI
Gtk::Table main_table;
Gtk::VBox upper_packer;
Gtk::VBox lower_packer;
Gtk::VBox table_knob_packer;
Gtk::HBox knob_packer;
LevelMeter meter;
Gtkmm2ext::TearOff* _tearoff;
struct ChannelButtonSet {
@ -75,6 +69,8 @@ class MonitorSection : public RouteUI
VolumeController* dim_control;
Gtk::Adjustment solo_boost_adjustment;
VolumeController* solo_boost_control;
Gtk::Adjustment solo_cut_adjustment;
VolumeController* solo_cut_control;
void populate_buttons ();
void set_button_names ();

View File

@ -4104,11 +4104,11 @@ Session::solo_control_mode_changed ()
{
/* cancel all solo or all listen when solo control mode changes */
if (Config->get_solo_control_is_listen_control()) {
set_solo (routes.reader(), false);
} else {
set_listen (routes.reader(), false);
}
if (soloing()) {
set_solo (get_routes(), false);
} else if (listening()) {
set_listen (get_routes(), false);
}
}
void

View File

@ -48,9 +48,10 @@ class TearOff : public Gtk::HBox
bool torn_off() const;
void tear_it_off ();
void put_it_back ();
void hide_visible ();
void set_tornoff_state (const XMLNode&);
void add_tornoff_state (XMLNode&) const;
void set_state (const XMLNode&);
void add_state (XMLNode&) const;
private:
Gtk::Widget& contents;

View File

@ -54,7 +54,10 @@ MotionFeedback::MotionFeedback (Glib::RefPtr<Gdk::Pixbuf> pix,
set_adjustment (adj);
}
pack_start (pixwin, false, false);
HBox* hpacker = manage (new HBox);
hpacker->pack_start (pixwin, true, false);
hpacker->show ();
pack_start (*hpacker, false, false);
pixwin.show ();
if (with_numeric_display) {

View File

@ -22,8 +22,6 @@
#include <gtkmm/main.h>
#include "pbd/stacktrace.h"
#include <gtkmm2ext/stateful_button.h>
using namespace Gtk;
@ -65,6 +63,7 @@ StateButton::set_visual_state (int n)
}
set_widget_name (name);
visual_state = n;
}
@ -110,10 +109,7 @@ StatefulToggleButton::set_widget_name (const std::string& name)
if (w) {
w->set_name (name);
} else {
cerr << "Statefull TOggle button - no child\n";
PBD::stacktrace (cerr, 20);
}
}
}
void
@ -124,8 +120,5 @@ StatefulButton::set_widget_name (const std::string& name)
if (w) {
w->set_name (name);
} else {
cerr << "Stateful button - no child\n";
PBD::stacktrace (cerr, 20);
}
}
}

View File

@ -56,24 +56,25 @@ TearOff::TearOff (Widget& c, bool allow_resize)
close_event_box.set_events (BUTTON_PRESS_MASK|BUTTON_RELEASE_MASK);
close_event_box.signal_button_release_event().connect (mem_fun (*this, &TearOff::close_click));
own_window.add_events (KEY_PRESS_MASK|KEY_RELEASE_MASK|BUTTON_PRESS_MASK|BUTTON_RELEASE_MASK|POINTER_MOTION_MASK|POINTER_MOTION_HINT_MASK);
own_window.set_resizable (allow_resize);
own_window.set_type_hint (WINDOW_TYPE_HINT_TOOLBAR);
own_window.signal_realize().connect (sigc::mem_fun (*this, &TearOff::own_window_realized));
own_window.signal_configure_event().connect (sigc::mem_fun (*this, &TearOff::own_window_configured), false);
VBox* box1;
box1 = manage (new VBox);
box1->pack_start (close_event_box, false, false, 2);
window_box.pack_end (*box1, false, false, 2);
own_window.add_events (KEY_PRESS_MASK|KEY_RELEASE_MASK|BUTTON_PRESS_MASK|BUTTON_RELEASE_MASK|POINTER_MOTION_MASK|POINTER_MOTION_HINT_MASK);
own_window.set_resizable (allow_resize);
own_window.set_type_hint (WINDOW_TYPE_HINT_TOOLBAR);
own_window.add (window_box);
own_window.signal_button_press_event().connect (mem_fun (*this, &TearOff::window_button_press));
own_window.signal_button_release_event().connect (mem_fun (*this, &TearOff::window_button_release));
own_window.signal_motion_notify_event().connect (mem_fun (*this, &TearOff::window_motion));
own_window.signal_delete_event().connect (mem_fun (*this, &TearOff::window_delete_event));
own_window.signal_realize().connect (bind (sigc::ptr_fun (Gtkmm2ext::set_decoration), &own_window, WMDecoration (DECOR_BORDER|DECOR_RESIZEH)));
own_window.signal_realize().connect (sigc::mem_fun (*this, &TearOff::own_window_realized));
own_window.signal_configure_event().connect (sigc::mem_fun (*this, &TearOff::own_window_configured), false);
tearoff_arrow.set_name ("TearOffArrow");
close_arrow.set_name ("TearOffArrow");
@ -249,7 +250,7 @@ TearOff::torn_off() const
}
void
TearOff::add_tornoff_state (XMLNode& node) const
TearOff::add_state (XMLNode& node) const
{
node.add_property ("tornoff", (own_window.is_visible() ? "yes" : "no"));
@ -268,7 +269,7 @@ TearOff::add_tornoff_state (XMLNode& node) const
}
void
TearOff::set_tornoff_state (const XMLNode& node)
TearOff::set_state (const XMLNode& node)
{
Glib::RefPtr<Gdk::Window> win;
const XMLProperty* prop;
@ -278,8 +279,10 @@ TearOff::set_tornoff_state (const XMLNode& node)
}
if (prop->value() == "yes") {
cerr << "Tearing off " << node.name() << endl;
tear_it_off ();
} else {
cerr << "Putting back " << node.name() << endl;
put_it_back ();
}
@ -296,13 +299,20 @@ TearOff::set_tornoff_state (const XMLNode& node)
sscanf (prop->value().c_str(), "%d", &own_window_ypos);
}
own_window.set_default_size (own_window_width, own_window_height);
own_window.move (own_window_xpos, own_window_ypos);
if (own_window.is_realized()) {
own_window.set_default_size (own_window_width, own_window_height);
own_window.move (own_window_xpos, own_window_ypos);
}
/* otherwise do it once the window is realized, see below */
}
void
TearOff::own_window_realized ()
{
cerr << "tearoff realized\n";
own_window.get_window()->set_decorations (WMDecoration (DECOR_BORDER|DECOR_RESIZEH));
if (own_window_width > 0) {
own_window.set_default_size (own_window_width, own_window_height);
own_window.move (own_window_xpos, own_window_ypos);
@ -323,3 +333,15 @@ TearOff::own_window_configured (GdkEventConfigure*)
return false;
}
void
TearOff::hide_visible ()
{
if (torn_off()) {
own_window.hide ();
}
hide ();
}