From effe0bd879869db3ed8676ed873c5dd5394fc7db Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Mon, 10 Mar 2025 18:48:49 -0600 Subject: [PATCH] use Gtkmm2ext::BindingSet inside libgtkmm2ext --- libs/gtkmm2ext/bindings.cc | 18 ++++++++++++------ libs/gtkmm2ext/gtk_ui.cc | 16 ++++++++++++---- libs/gtkmm2ext/gtkmm2ext/bindings.h | 2 ++ 3 files changed, 26 insertions(+), 10 deletions(-) diff --git a/libs/gtkmm2ext/bindings.cc b/libs/gtkmm2ext/bindings.cc index a9e794f164..af5a3739c8 100644 --- a/libs/gtkmm2ext/bindings.cc +++ b/libs/gtkmm2ext/bindings.cc @@ -1158,16 +1158,22 @@ std::ostream& operator<<(std::ostream& out, Gtkmm2ext::KeyboardKey const & k) { << hex << k.state() << dec << ' ' << show_gdk_event_state (k.state()); } -void -set_widget_bindings (Gtk::Widget& w, Bindings& b, char const * const name) +static void +delete_binding_set (void* p) { - BindingSet* bs = new BindingSet; - bs->push_back (&b); - w.set_data (name, bs); + delete (BindingSet*) p; } void -set_widget_bindings (Gtk::Widget& w, BindingSet& bs, char const * const name) +Gtkmm2ext::set_widget_bindings (Gtk::Widget& w, Bindings& b, char const * const name) +{ + BindingSet* bs = new BindingSet; + bs->push_back (&b); + g_object_set_data_full (G_OBJECT(w.gobj()), name, bs, (GDestroyNotify) delete_binding_set); +} + +void +Gtkmm2ext::set_widget_bindings (Gtk::Widget& w, BindingSet& bs, char const * const name) { w.set_data (name, &bs); } diff --git a/libs/gtkmm2ext/gtk_ui.cc b/libs/gtkmm2ext/gtk_ui.cc index c22b5f47d4..6dcde22d39 100644 --- a/libs/gtkmm2ext/gtk_ui.cc +++ b/libs/gtkmm2ext/gtk_ui.cc @@ -387,17 +387,25 @@ UI::set_tip (Widget *w, const gchar *tip, const gchar *hlp) if (action) { /* get_bindings_from_widget_hierarchy */ Widget* ww = w; - Bindings* bindings = NULL; + BindingSet* binding_set = nullptr; do { - bindings = (Bindings*) ww->get_data ("ardour-bindings"); - if (bindings) { + binding_set = (BindingSet*) ww->get_data ("ardour-bindings"); + if (binding_set) { break; } ww = ww->get_parent (); } while (ww); - if (!bindings) { + Bindings* bindings; + + if (!binding_set) { bindings = global_bindings; + } else { + /* Use only the first bindings for the widget when + looking up keys. + */ + assert (!binding_set->empty()); + bindings = binding_set->front (); } if (bindings) { diff --git a/libs/gtkmm2ext/gtkmm2ext/bindings.h b/libs/gtkmm2ext/gtkmm2ext/bindings.h index 2e771e0696..1c5869a9a1 100644 --- a/libs/gtkmm2ext/gtkmm2ext/bindings.h +++ b/libs/gtkmm2ext/gtkmm2ext/bindings.h @@ -215,6 +215,8 @@ typedef std::vector BindingSet; void set_widget_bindings (Gtk::Widget&, Bindings&, char const * const name); void set_widget_bindings (Gtk::Widget&, BindingSet&, char const * const name); +static char const * const ARDOUR_BINDING_KEY = "ardour-bindings"; + } // namespace std::ostream& operator<<(std::ostream& out, Gtkmm2ext::KeyboardKey const & k);