X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;ds=sidebyside;f=gtk2_ardour%2Feditor_rulers.cc;h=0a855d7f90efa50e4910ff5b863ad5f19a2683a6;hb=6ae4f104371ed433a79c8845de97428d964edd8b;hp=f11e584c18b3b87a1fcc215802ab0041a40b3a43;hpb=355183f1abea75d8fab0926cd7e7130796574cb0;p=ardour.git diff --git a/gtk2_ardour/editor_rulers.cc b/gtk2_ardour/editor_rulers.cc index f11e584c18..0a855d7f90 100644 --- a/gtk2_ardour/editor_rulers.cc +++ b/gtk2_ardour/editor_rulers.cc @@ -29,10 +29,13 @@ #include +#include "canvas/group.h" + #include "ardour/session.h" #include "ardour/tempo.h" #include "ardour/profile.h" -#include + +#include "gtkmm2ext/gtk_ui.h" #include "editor.h" #include "editing.h" @@ -120,7 +123,7 @@ Editor::initialize_rulers () using namespace Box_Helpers; BoxList & ruler_lab_children = ruler_label_vbox.children(); BoxList & ruler_children = time_canvas_vbox.children(); - BoxList & lab_children = time_button_vbox.children(); + BoxList & lab_children = time_bars_vbox.children(); BoxList::iterator canvaspos = ruler_children.begin(); @@ -130,6 +133,7 @@ Editor::initialize_rulers () lab_children.push_back (Element(transport_mark_label, PACK_SHRINK, PACK_START)); lab_children.push_back (Element(cd_mark_label, PACK_SHRINK, PACK_START)); lab_children.push_back (Element(mark_label, PACK_SHRINK, PACK_START)); + lab_children.push_back (Element(videotl_label, PACK_SHRINK, PACK_START)); ruler_lab_children.push_back (Element(minsec_label, PACK_SHRINK, PACK_START)); ruler_children.insert (canvaspos, Element(*minsec_ruler, PACK_SHRINK, PACK_START)); @@ -166,7 +170,6 @@ Editor::initialize_rulers () minsec_ruler->signal_scroll_event().connect (sigc::mem_fun(*this, &Editor::ruler_scroll)); visible_timebars = 0; /*this will be changed below */ - canvas_timebars_vsize = 0; } bool @@ -248,7 +251,7 @@ Editor::ruler_button_press (GdkEventButton* ev) } /* playhead cursor */ - _drags->set (new CursorDrag (this, &playhead_cursor->canvas_item, false), reinterpret_cast (ev)); + _drags->set (new CursorDrag (this, &playhead_cursor->track_canvas_item (), false), reinterpret_cast (ev)); _dragging_playhead = true; } @@ -341,7 +344,7 @@ Editor::popup_ruler_menu (framepos_t where, ItemType t) ruler_items.push_back (SeparatorElem ()); break; case RangeMarkerBarItem: - //ruler_items.push_back (MenuElem (_("New Range"))); + ruler_items.push_back (MenuElem (_("New range"), sigc::bind (sigc::mem_fun (*this, &Editor::mouse_add_new_range), where))); ruler_items.push_back (MenuElem (_("Clear all ranges"), sigc::mem_fun(*this, &Editor::clear_ranges))); ruler_items.push_back (MenuElem (_("Unhide ranges"), sigc::mem_fun(*this, &Editor::unhide_ranges))); ruler_items.push_back (SeparatorElem ()); @@ -367,6 +370,30 @@ Editor::popup_ruler_menu (framepos_t where, ItemType t) ruler_items.push_back (SeparatorElem ()); break; + case VideoBarItem: + ruler_items.push_back (MenuElem (_("Timeline height"))); + static_cast(&ruler_items.back())->set_sensitive(false); + ruler_items.push_back (CheckMenuElem (_("Large"), sigc::bind ( sigc::mem_fun(*this, &Editor::set_video_timeline_height), 6))); + if (videotl_bar_height == 6) { static_cast(&ruler_items.back())->set_active(true);} + ruler_items.push_back (CheckMenuElem (_("Normal"), sigc::bind ( sigc::mem_fun(*this, &Editor::set_video_timeline_height), 4))); + if (videotl_bar_height == 4) { static_cast(&ruler_items.back())->set_active(true);} + ruler_items.push_back (CheckMenuElem (_("Small"), sigc::bind ( sigc::mem_fun(*this, &Editor::set_video_timeline_height), 3))); + if (videotl_bar_height == 3) { static_cast(&ruler_items.back())->set_active(true);} + ruler_items.push_back (SeparatorElem ()); + + ruler_items.push_back (MenuElem (_("Align Video Track"))); + static_cast(&ruler_items.back())->set_sensitive(false); + + ruler_items.push_back (CheckMenuElem (_("Lock"))); + { + CheckMenuItem* vtl_lock = static_cast(&ruler_items.back()); + vtl_lock->set_active(is_video_timeline_locked()); + vtl_lock->signal_activate().connect (sigc::mem_fun(*this, &Editor::toggle_video_timeline_locked)); + } + + ruler_items.push_back (SeparatorElem ()); + break; + default: break; } @@ -417,6 +444,10 @@ Editor::popup_ruler_menu (framepos_t where, ItemType t) if (action) { ruler_items.push_back (MenuElem (*action->create_menu_item())); } + action = ActionManager::get_action ("Rulers", "toggle-video-ruler"); + if (action) { + ruler_items.push_back (MenuElem (*action->create_menu_item())); + } editor_ruler_menu->popup (1, gtk_get_current_event_time()); @@ -438,6 +469,7 @@ Editor::store_ruler_visibility () node->add_property (X_("rangemarker"), ruler_range_action->get_active() ? "yes": "no"); node->add_property (X_("transportmarker"), ruler_loop_punch_action->get_active() ? "yes": "no"); node->add_property (X_("cdmarker"), ruler_cd_marker_action->get_active() ? "yes": "no"); + node->add_property (X_("videotl"), ruler_video_action->get_active() ? "yes": "no"); _session->add_extra_xml (*node); _session->set_dirty (); @@ -538,6 +570,14 @@ Editor::restore_ruler_visibility () } } + if ((prop = node->property ("videotl")) != 0) { + if (string_is_affirmative (prop->value())) { + ruler_video_action->set_active (true); + } else { + ruler_video_action->set_active (false); + } + } + } no_ruler_shown_update = false; @@ -603,15 +643,16 @@ Editor::update_ruler_visibility () transport_mark_label.hide(); cd_mark_label.hide(); mark_label.hide(); + videotl_label.hide(); #endif if (ruler_meter_action->get_active()) { - old_unit_pos = meter_group->property_y(); + old_unit_pos = meter_group->position().y; if (tbpos != old_unit_pos) { - meter_group->move ( 0.0, tbpos - old_unit_pos); + meter_group->move (ArdourCanvas::Duple (0.0, tbpos - old_unit_pos)); } - old_unit_pos = meter_bar_group->property_y(); + old_unit_pos = meter_bar_group->position().y; if (tbgpos != old_unit_pos) { - meter_bar_group->move ( 0.0, tbgpos - old_unit_pos); + meter_bar_group->move (ArdourCanvas::Duple (0.0, tbgpos - old_unit_pos)); } meter_bar_group->show(); meter_group->show(); @@ -626,13 +667,13 @@ Editor::update_ruler_visibility () } if (ruler_tempo_action->get_active()) { - old_unit_pos = tempo_group->property_y(); + old_unit_pos = tempo_group->position().y; if (tbpos != old_unit_pos) { - tempo_group->move(0.0, tbpos - old_unit_pos); + tempo_group->move (ArdourCanvas::Duple (0.0, tbpos - old_unit_pos)); } - old_unit_pos = tempo_bar_group->property_y(); + old_unit_pos = tempo_bar_group->position().y; if (tbgpos != old_unit_pos) { - tempo_bar_group->move ( 0.0, tbgpos - old_unit_pos); + tempo_bar_group->move (ArdourCanvas::Duple (0.0, tbgpos - old_unit_pos)); } tempo_bar_group->show(); tempo_group->show(); @@ -647,13 +688,13 @@ Editor::update_ruler_visibility () } if (!Profile->get_sae() && ruler_range_action->get_active()) { - old_unit_pos = range_marker_group->property_y(); + old_unit_pos = range_marker_group->position().y; if (tbpos != old_unit_pos) { - range_marker_group->move (0.0, tbpos - old_unit_pos); + range_marker_group->move (ArdourCanvas::Duple (0.0, tbpos - old_unit_pos)); } - old_unit_pos = range_marker_bar_group->property_y(); + old_unit_pos = range_marker_bar_group->position().y; if (tbgpos != old_unit_pos) { - range_marker_bar_group->move (0.0, tbgpos - old_unit_pos); + range_marker_bar_group->move (ArdourCanvas::Duple (0.0, tbgpos - old_unit_pos)); } range_marker_bar_group->show(); range_marker_group->show(); @@ -669,13 +710,13 @@ Editor::update_ruler_visibility () } if (ruler_loop_punch_action->get_active()) { - old_unit_pos = transport_marker_group->property_y(); + old_unit_pos = transport_marker_group->position().y; if (tbpos != old_unit_pos) { - transport_marker_group->move ( 0.0, tbpos - old_unit_pos); + transport_marker_group->move (ArdourCanvas::Duple (0.0, tbpos - old_unit_pos)); } - old_unit_pos = transport_marker_bar_group->property_y(); + old_unit_pos = transport_marker_bar_group->position().y; if (tbgpos != old_unit_pos) { - transport_marker_bar_group->move ( 0.0, tbgpos - old_unit_pos); + transport_marker_bar_group->move (ArdourCanvas::Duple (0.0, tbgpos - old_unit_pos)); } transport_marker_bar_group->show(); transport_marker_group->show(); @@ -690,13 +731,13 @@ Editor::update_ruler_visibility () } if (ruler_cd_marker_action->get_active()) { - old_unit_pos = cd_marker_group->property_y(); + old_unit_pos = cd_marker_group->position().y; if (tbpos != old_unit_pos) { - cd_marker_group->move (0.0, tbpos - old_unit_pos); + cd_marker_group->move (ArdourCanvas::Duple (0.0, tbpos - old_unit_pos)); } - old_unit_pos = cd_marker_bar_group->property_y(); + old_unit_pos = cd_marker_bar_group->position().y; if (tbgpos != old_unit_pos) { - cd_marker_bar_group->move (0.0, tbgpos - old_unit_pos); + cd_marker_bar_group->move (ArdourCanvas::Duple (0.0, tbgpos - old_unit_pos)); } cd_marker_bar_group->show(); cd_marker_group->show(); @@ -715,13 +756,13 @@ Editor::update_ruler_visibility () } if (ruler_marker_action->get_active()) { - old_unit_pos = marker_group->property_y(); + old_unit_pos = marker_group->position().y; if (tbpos != old_unit_pos) { - marker_group->move ( 0.0, tbpos - old_unit_pos); + marker_group->move (ArdourCanvas::Duple (0.0, tbpos - old_unit_pos)); } - old_unit_pos = marker_bar_group->property_y(); + old_unit_pos = marker_bar_group->position().y; if (tbgpos != old_unit_pos) { - marker_bar_group->move ( 0.0, tbgpos - old_unit_pos); + marker_bar_group->move (ArdourCanvas::Duple (0.0, tbgpos - old_unit_pos)); } marker_bar_group->show(); marker_group->show(); @@ -735,27 +776,27 @@ Editor::update_ruler_visibility () mark_label.hide(); } - gdouble old_canvas_timebars_vsize = canvas_timebars_vsize; - canvas_timebars_vsize = (timebar_height * visible_timebars) - 1; - gdouble vertical_pos_delta = canvas_timebars_vsize - old_canvas_timebars_vsize; - vertical_adjustment.set_upper(vertical_adjustment.get_upper() + vertical_pos_delta); - full_canvas_height += vertical_pos_delta; - - if (vertical_adjustment.get_value() != 0 && (vertical_adjustment.get_value() + _canvas_height >= full_canvas_height)) { - /*if we're at the bottom of the canvas, don't move the _trackview_group*/ - vertical_adjustment.set_value (full_canvas_height - _canvas_height + 1); + if (ruler_video_action->get_active()) { + old_unit_pos = videotl_group->position().y; + if (tbpos != old_unit_pos) { + videotl_group->move (ArdourCanvas::Duple (0.0, tbpos - old_unit_pos)); + } + old_unit_pos = videotl_bar_group->position().y; + if (tbgpos != old_unit_pos) { + videotl_bar_group->move (ArdourCanvas::Duple (0.0, tbgpos - old_unit_pos)); + } + videotl_bar_group->show(); + videotl_group->show(); + videotl_label.show(); + tbpos += timebar_height * videotl_bar_height; + tbgpos += timebar_height * videotl_bar_height; + visible_timebars+=videotl_bar_height; + queue_visual_videotimeline_update(); } else { - _trackview_group->property_y () = - get_trackview_group_vertical_offset (); - _background_group->property_y () = - get_trackview_group_vertical_offset (); - _trackview_group->move (0, 0); - _background_group->move (0, 0); - last_trackview_group_vertical_offset = get_trackview_group_vertical_offset (); - } - - gdouble bottom_track_pos = vertical_adjustment.get_value() + _canvas_height - canvas_timebars_vsize; - std::pair const p = trackview_by_y_position (bottom_track_pos); - if (p.first) { - p.first->clip_to_viewport (); + videotl_bar_group->hide(); + videotl_group->hide(); + videotl_label.hide(); + update_video_timeline(true); } ruler_label_vbox.set_size_request (-1, (int)(timebar_height * visible_rulers)); @@ -817,9 +858,11 @@ Editor::update_fixed_rulers () return; } - ruler_metrics[ruler_metric_timecode].units_per_pixel = frames_per_unit; - ruler_metrics[ruler_metric_samples].units_per_pixel = frames_per_unit; - ruler_metrics[ruler_metric_minsec].units_per_pixel = frames_per_unit; + compute_fixed_ruler_scale (); + + ruler_metrics[ruler_metric_timecode].units_per_pixel = frames_per_pixel; + ruler_metrics[ruler_metric_samples].units_per_pixel = frames_per_pixel; + ruler_metrics[ruler_metric_minsec].units_per_pixel = frames_per_pixel; rightmost_frame = leftmost_frame + current_page_frames(); @@ -844,13 +887,17 @@ Editor::update_fixed_rulers () } void -Editor::update_tempo_based_rulers () +Editor::update_tempo_based_rulers (ARDOUR::TempoMap::BBTPointList::const_iterator& begin, + ARDOUR::TempoMap::BBTPointList::const_iterator& end) { if (_session == 0) { return; } - ruler_metrics[ruler_metric_bbt].units_per_pixel = frames_per_unit; + compute_bbt_ruler_scale (leftmost_frame, leftmost_frame+current_page_frames(), + begin, end); + + ruler_metrics[ruler_metric_bbt].units_per_pixel = frames_per_pixel; if (ruler_bbt_action->get_active()) { gtk_custom_ruler_set_range (GTK_CUSTOM_RULER(_bbt_ruler), leftmost_frame, leftmost_frame+current_page_frames(), @@ -1082,6 +1129,7 @@ Editor::metric_get_timecode (GtkCustomRulerMark **marks, gdouble lower, gdouble } (*marks)[n].label = g_strdup (buf); (*marks)[n].position = pos; + Timecode::increment_minutes( timecode, _session->config.get_subframes_per_frame() ); } @@ -1142,7 +1190,9 @@ Editor::metric_get_timecode (GtkCustomRulerMark **marks, gdouble lower, gdouble void -Editor::compute_bbt_ruler_scale (framepos_t lower, framepos_t upper) +Editor::compute_bbt_ruler_scale (framepos_t lower, framepos_t upper, + ARDOUR::TempoMap::BBTPointList::const_iterator begin, + ARDOUR::TempoMap::BBTPointList::const_iterator end) { if (_session == 0) { return; @@ -1220,23 +1270,31 @@ Editor::compute_bbt_ruler_scale (framepos_t lower, framepos_t upper) bbt_beat_subdivision = 32; bbt_accent_modulo = 8; break; + case SnapToBeatDiv64: + bbt_beat_subdivision = 64; + bbt_accent_modulo = 8; + break; + case SnapToBeatDiv128: + bbt_beat_subdivision = 128; + bbt_accent_modulo = 8; + break; default: bbt_beat_subdivision = 4; break; } - if (distance (current_bbt_points_begin, current_bbt_points_end) == 0) { + if (distance (begin, end) == 0) { return; } - i = current_bbt_points_end; + i = end; i--; - if ((*i).beat >= (*current_bbt_points_begin).beat) { - bbt_bars = (*i).bar - (*current_bbt_points_begin).bar; + if ((*i).beat >= (*begin).beat) { + bbt_bars = (*i).bar - (*begin).bar; } else { - bbt_bars = (*i).bar - (*current_bbt_points_begin).bar - 1; + bbt_bars = (*i).bar - (*begin).bar - 1; } - beats = distance (current_bbt_points_begin, current_bbt_points_end) - bbt_bars; + beats = distance (begin, end) - bbt_bars; /* Only show the bar helper if there aren't many bars on the screen */ if ((bbt_bars < 2) || (beats < 5)) { @@ -1267,7 +1325,7 @@ Editor::compute_bbt_ruler_scale (framepos_t lower, framepos_t upper) } gint -Editor::metric_get_bbt (GtkCustomRulerMark **marks, gdouble lower, gdouble /*upper*/, gint /*maxchars*/) +Editor::metric_get_bbt (GtkCustomRulerMark **marks, gdouble lower, gdouble upper, gint /*maxchars*/) { if (_session == 0) { return 0; @@ -1292,14 +1350,19 @@ Editor::metric_get_bbt (GtkCustomRulerMark **marks, gdouble lower, gdouble /*upp bool i_am_accented = false; bool helper_active = false; - if (distance (current_bbt_points_begin, current_bbt_points_end) == 0) { + ARDOUR::TempoMap::BBTPointList::const_iterator begin; + ARDOUR::TempoMap::BBTPointList::const_iterator end; + + compute_current_bbt_points (lower, upper, begin, end); + + if (distance (begin, end) == 0) { return 0; } switch (bbt_ruler_scale) { case bbt_show_beats: - beats = distance (current_bbt_points_begin, current_bbt_points_end); + beats = distance (begin, end); bbt_nmarks = beats + 2; *marks = (GtkCustomRulerMark *) g_malloc (sizeof(GtkCustomRulerMark) * bbt_nmarks); @@ -1308,7 +1371,7 @@ Editor::metric_get_bbt (GtkCustomRulerMark **marks, gdouble lower, gdouble /*upp (*marks)[0].position = lower; (*marks)[0].style = GtkCustomRulerMarkMicro; - for (n = 1, i = current_bbt_points_begin; n < bbt_nmarks && i != current_bbt_points_end; ++i) { + for (n = 1, i = begin; n < bbt_nmarks && i != end; ++i) { if ((*i).frame < lower && (bbt_bar_helper_on)) { snprintf (buf, sizeof(buf), "<%" PRIu32 "|%" PRIu32, (*i).bar, (*i).beat); @@ -1335,7 +1398,7 @@ Editor::metric_get_bbt (GtkCustomRulerMark **marks, gdouble lower, gdouble /*upp case bbt_show_ticks: - beats = distance (current_bbt_points_begin, current_bbt_points_end); + beats = distance (begin, end); bbt_nmarks = (beats + 2) * bbt_beat_subdivision; bbt_position_of_helper = lower + (30 * Editor::get_current_zoom ()); @@ -1345,7 +1408,7 @@ Editor::metric_get_bbt (GtkCustomRulerMark **marks, gdouble lower, gdouble /*upp (*marks)[0].position = lower; (*marks)[0].style = GtkCustomRulerMarkMicro; - for (n = 1, i = current_bbt_points_begin; n < bbt_nmarks && i != current_bbt_points_end; ++i) { + for (n = 1, i = begin; n < bbt_nmarks && i != end; ++i) { if ((*i).frame < lower && (bbt_bar_helper_on)) { snprintf (buf, sizeof(buf), "<%" PRIu32 "|%" PRIu32, (*i).bar, (*i).beat); @@ -1425,7 +1488,7 @@ Editor::metric_get_bbt (GtkCustomRulerMark **marks, gdouble lower, gdouble /*upp case bbt_show_ticks_detail: - beats = distance (current_bbt_points_begin, current_bbt_points_end); + beats = distance (begin, end); bbt_nmarks = (beats + 2) * bbt_beat_subdivision; bbt_position_of_helper = lower + (30 * Editor::get_current_zoom ()); @@ -1435,7 +1498,7 @@ Editor::metric_get_bbt (GtkCustomRulerMark **marks, gdouble lower, gdouble /*upp (*marks)[0].position = lower; (*marks)[0].style = GtkCustomRulerMarkMicro; - for (n = 1, i = current_bbt_points_begin; n < bbt_nmarks && i != current_bbt_points_end; ++i) { + for (n = 1, i = begin; n < bbt_nmarks && i != end; ++i) { if ((*i).frame < lower && (bbt_bar_helper_on)) { snprintf (buf, sizeof(buf), "<%" PRIu32 "|%" PRIu32, (*i).bar, (*i).beat); @@ -1520,7 +1583,7 @@ Editor::metric_get_bbt (GtkCustomRulerMark **marks, gdouble lower, gdouble /*upp case bbt_show_ticks_super_detail: - beats = distance (current_bbt_points_begin, current_bbt_points_end); + beats = distance (begin, end); bbt_nmarks = (beats + 2) * bbt_beat_subdivision; bbt_position_of_helper = lower + (30 * Editor::get_current_zoom ()); @@ -1530,7 +1593,7 @@ Editor::metric_get_bbt (GtkCustomRulerMark **marks, gdouble lower, gdouble /*upp (*marks)[0].position = lower; (*marks)[0].style = GtkCustomRulerMarkMicro; - for (n = 1, i = current_bbt_points_begin; n < bbt_nmarks && i != current_bbt_points_end; ++i) { + for (n = 1, i = begin; n < bbt_nmarks && i != end; ++i) { if ((*i).frame < lower && (bbt_bar_helper_on)) { snprintf (buf, sizeof(buf), "<%" PRIu32 "|%" PRIu32, (*i).bar, (*i).beat); @@ -1627,7 +1690,7 @@ Editor::metric_get_bbt (GtkCustomRulerMark **marks, gdouble lower, gdouble /*upp case bbt_show_64: bbt_nmarks = (gint) (bbt_bars / 64) + 1; *marks = (GtkCustomRulerMark *) g_malloc (sizeof(GtkCustomRulerMark) * bbt_nmarks); - for (n = 0, i = current_bbt_points_begin; i != current_bbt_points_end && n < bbt_nmarks; i++) { + for (n = 0, i = begin; i != end && n < bbt_nmarks; i++) { if ((*i).is_bar()) { if ((*i).bar % 64 == 1) { if ((*i).bar % 256 == 1) { @@ -1652,7 +1715,7 @@ Editor::metric_get_bbt (GtkCustomRulerMark **marks, gdouble lower, gdouble /*upp case bbt_show_16: bbt_nmarks = (bbt_bars / 16) + 1; *marks = (GtkCustomRulerMark *) g_malloc (sizeof(GtkCustomRulerMark) * bbt_nmarks); - for (n = 0, i = current_bbt_points_begin; i != current_bbt_points_end && n < bbt_nmarks; i++) { + for (n = 0, i = begin; i != end && n < bbt_nmarks; i++) { if ((*i).is_bar()) { if ((*i).bar % 16 == 1) { if ((*i).bar % 64 == 1) { @@ -1677,7 +1740,7 @@ Editor::metric_get_bbt (GtkCustomRulerMark **marks, gdouble lower, gdouble /*upp case bbt_show_4: bbt_nmarks = (bbt_bars / 4) + 1; *marks = (GtkCustomRulerMark *) g_malloc (sizeof(GtkCustomRulerMark) * bbt_nmarks); - for (n = 0, i = current_bbt_points_begin; i != current_bbt_points_end && n < bbt_nmarks; ++i) { + for (n = 0, i = begin; i != end && n < bbt_nmarks; ++i) { if ((*i).is_bar()) { if ((*i).bar % 4 == 1) { if ((*i).bar % 16 == 1) { @@ -1703,7 +1766,7 @@ Editor::metric_get_bbt (GtkCustomRulerMark **marks, gdouble lower, gdouble /*upp // default: bbt_nmarks = bbt_bars + 2; *marks = (GtkCustomRulerMark *) g_malloc (sizeof(GtkCustomRulerMark) * bbt_nmarks ); - for (n = 0, i = current_bbt_points_begin; i != current_bbt_points_end && n < bbt_nmarks; i++) { + for (n = 0, i = begin; i != end && n < bbt_nmarks; i++) { if ((*i).is_bar()) { if ((*i).bar % 4 == 1) { snprintf (buf, sizeof(buf), "%" PRIu32, (*i).bar);