+
+void
+ARDOUR_UI::big_clock_realized ()
+{
+ int x, y, w, d;
+
+ set_decoration (big_clock_window, (Gdk::DECOR_BORDER|Gdk::DECOR_RESIZEH));
+ big_clock_window->get_window()->get_geometry (x, y, w, big_clock_height, d);
+
+ original_big_clock_height = big_clock_height;
+ original_big_clock_width = w;
+
+ Pango::FontDescription fd (big_clock.get_style()->get_font());
+ original_big_clock_font_size = fd.get_size ();
+
+ if (!fd.get_size_is_absolute ()) {
+ original_big_clock_font_size /= PANGO_SCALE;
+ }
+
+ /* we can't set the real size until we know the original one, with the UI rc-file-set font
+ size, so do this here.
+ */
+
+ XMLNode* node = Config->extra_xml (X_("UI"));
+
+ if (node) {
+
+ const XMLProperty* prop;
+ int w, h, x, y;
+ int have_pos = 0;
+
+ w = h = x = y = 0;
+
+ if ((prop = node->property ("big-clock-x-size")) != 0) {
+ w = atoi (prop->value());
+ }
+ if ((prop = node->property ("big-clock-y-size")) != 0) {
+ h = atoi (prop->value());
+ }
+
+ if (w && h) {
+ big_clock_window->set_default_size (w, h);
+ }
+
+ if ((prop = node->property ("big-clock-x-off")) != 0) {
+ x = atoi (prop->value());
+ have_pos++;
+ }
+ if ((prop = node->property ("big-clock-y-off")) != 0) {
+ y = atoi (prop->value());
+ have_pos++;
+ }
+
+ if (have_pos == 2) {
+ big_clock_window->move (x, y);
+ }
+ }
+}
+
+void
+ARDOUR_UI::float_big_clock (Gtk::Window* parent)
+{
+ if (big_clock_window) {
+ if (parent) {
+ big_clock_window->set_transient_for (*parent);
+ } else {
+ gtk_window_set_transient_for (big_clock_window->gobj(), (GtkWindow*) 0);
+ }
+ }
+}
+
+void
+ARDOUR_UI::big_clock_size_allocate (Gtk::Allocation& allocation)
+{
+ if (!big_clock_resize_in_progress) {
+ Glib::signal_idle().connect (sigc::bind (sigc::mem_fun (*this, &ARDOUR_UI::idle_big_clock_text_resizer), 0, 0));
+ big_clock_resize_in_progress = true;
+ }
+}
+
+bool
+ARDOUR_UI::idle_big_clock_text_resizer (int win_w, int win_h)
+{
+ big_clock_resize_in_progress = false;
+
+ Glib::RefPtr<Gdk::Window> win = big_clock_window->get_window();
+ Pango::FontDescription fd (big_clock.get_style()->get_font());
+ int current_size = fd.get_size ();
+ int x, y, w, h, d;
+
+ if (!fd.get_size_is_absolute ()) {
+ current_size /= PANGO_SCALE;
+ }
+
+ win->get_geometry (x, y, w, h, d);
+
+ double scale = min (((double) w / (double) original_big_clock_width),
+ ((double) h / (double) original_big_clock_height));
+
+ int size = (int) lrintf (original_big_clock_font_size * scale);
+
+ if (size != current_size) {
+
+ string family = fd.get_family();
+ char buf[family.length()+16];
+ snprintf (buf, family.length()+16, "%s %d", family.c_str(), size);
+
+ try {
+ Pango::FontDescription fd (buf);
+ Glib::RefPtr<Gtk::RcStyle> rcstyle = big_clock.get_modifier_style ();
+ rcstyle->set_font (fd);
+ big_clock.modify_style (rcstyle);
+ }
+
+ catch (...) {
+ /* oh well, do nothing */
+ }
+ }
+
+ return false;
+}
+
+void
+ARDOUR_UI::save_ardour_state ()
+{
+ if (!keyboard || !mixer || !editor) {
+ return;
+ }
+
+ /* XXX this is all a bit dubious. add_extra_xml() uses
+ a different lifetime model from add_instant_xml().
+ */
+
+ XMLNode* node = new XMLNode (keyboard->get_state());
+ Config->add_extra_xml (*node);
+ Config->add_extra_xml (get_transport_controllable_state());
+
+ XMLNode* window_node = new XMLNode (X_("UI"));
+
+ window_node->add_property ("show-big-clock", (big_clock_window && big_clock_window->is_visible() ? "yes" : "no"));
+
+ Glib::RefPtr<Gdk::Window> win;
+
+ if (big_clock_window && (win = big_clock_window->get_window())) {
+
+ int w, h;
+ int xoff, yoff;
+ char buf[32];
+
+ win->get_size (w, h);
+ win->get_position (xoff, yoff);
+
+ snprintf (buf, sizeof (buf), "%d", w);
+ window_node->add_property ("big-clock-x-size", buf);
+ snprintf (buf, sizeof (buf), "%d", h);
+ window_node->add_property ("big-clock-y-size", buf);
+ snprintf (buf, sizeof (buf), "%d", xoff);
+ window_node->add_property ("big-clock-x-off", buf);
+ snprintf (buf, sizeof (buf), "%d", yoff);
+ window_node->add_property ("big-clock-y-off", buf);
+ }
+
+ /* tearoffs */
+
+ XMLNode* tearoff_node = new XMLNode (X_("Tearoffs"));
+
+ if (transport_tearoff) {
+ XMLNode* t = new XMLNode (X_("transport"));
+ 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_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_state (*t);
+ tearoff_node->add_child_nocopy (*t);
+ }
+
+ window_node->add_child_nocopy (*tearoff_node);
+
+ Config->add_extra_xml (*window_node);
+
+ if (_startup && _startup->engine_control() && _startup->engine_control()->was_used()) {
+ Config->add_extra_xml (_startup->engine_control()->get_state());
+ }
+ Config->save_state();
+ ui_config->save_state ();
+
+ XMLNode enode(static_cast<Stateful*>(editor)->get_state());
+ XMLNode mnode(mixer->get_state());
+
+ if (_session) {
+ _session->add_instant_xml (enode);
+ _session->add_instant_xml (mnode);
+ } else {
+ Config->add_instant_xml (enode);
+ Config->add_instant_xml (mnode);
+ }
+
+ Keyboard::save_keybindings ();
+}
+