diff options
-rw-r--r-- | SConstruct | 15 | ||||
-rw-r--r-- | gtk2_ardour/ardour2_ui_dark.rc.in | 2 | ||||
-rw-r--r-- | gtk2_ardour/ardour2_ui_light.rc.in | 2 | ||||
-rw-r--r-- | gtk2_ardour/au_pluginui.mm | 9 | ||||
-rw-r--r-- | gtk2_ardour/generic_pluginui.cc | 1 | ||||
-rw-r--r-- | gtk2_ardour/icons/computer_keyboard.png | bin | 0 -> 1536 bytes | |||
-rw-r--r-- | gtk2_ardour/icons/computer_keyboard_active.png | bin | 0 -> 1686 bytes | |||
-rw-r--r-- | gtk2_ardour/keyboard.cc | 2 | ||||
-rw-r--r-- | gtk2_ardour/plugin_ui.cc | 47 | ||||
-rw-r--r-- | gtk2_ardour/plugin_ui.h | 8 | ||||
-rw-r--r-- | libs/gtkmm2ext/gtk_ui.cc | 14 | ||||
-rw-r--r-- | libs/gtkmm2ext/gtkmm2ext/gtk_ui.h | 6 |
12 files changed, 101 insertions, 5 deletions
diff --git a/SConstruct b/SConstruct index 49eb08a459..f0d1122fce 100644 --- a/SConstruct +++ b/SConstruct @@ -1307,6 +1307,21 @@ if not conf.CheckFunc('posix_memalign'): env = conf.Finish() +# Which GTK tooltips API + +gtktestenv = env.Clone () +gtktestenv.Merge ([ + libraries['gtk2'] + ]) + +conf = gtktestenv.Configure () + +if conf.CheckFunc('gtk_widget_set_tooltip_text'): + env.Append (CXXFLAGS='-DGTK_NEW_TOOLTIP_API') + +conf.Finish () + + # generate the per-user and system rc files from the same source sysrcbuild = env.SubstInFile ('ardour_system.rc','ardour.rc.in', SUBST_DICT = subst_dict) diff --git a/gtk2_ardour/ardour2_ui_dark.rc.in b/gtk2_ardour/ardour2_ui_dark.rc.in index 0f171058af..34c6942e21 100644 --- a/gtk2_ardour/ardour2_ui_dark.rc.in +++ b/gtk2_ardour/ardour2_ui_dark.rc.in @@ -1476,6 +1476,8 @@ widget "*HWMonitorButton" style:highest "red_when_active" widget "*HWMonitorButton*" style:highest "red_when_active" widget "*BypassButton" style:highest "red_when_active" widget "*BypassButton*" style:highest "red_when_active" +widget "*FocusButton" style:highest "red_when_active" +widget "*FocusButton*" style:highest "red_when_active" widget "*TransportSoloAlert" style:highest "flashing_alert" widget "*TransportSoloAlert.*" style:highest "flashing_alert" widget "*TransportAuditioningAlert" style:highest "flashing_alert" diff --git a/gtk2_ardour/ardour2_ui_light.rc.in b/gtk2_ardour/ardour2_ui_light.rc.in index 72e30d6471..d9d0907de7 100644 --- a/gtk2_ardour/ardour2_ui_light.rc.in +++ b/gtk2_ardour/ardour2_ui_light.rc.in @@ -1479,6 +1479,8 @@ widget "*HWMonitorButton" style:highest "red_when_active" widget "*HWMonitorButton*" style:highest "red_when_active" widget "*BypassButton" style:highest "red_when_active" widget "*BypassButton*" style:highest "red_when_active" +widget "*FocusButton" style:highest "red_when_active" +widget "*FocusButton*" style:highest "red_when_active" widget "*TransportSoloAlert" style:highest "flashing_alert" widget "*TransportSoloAlert.*" style:highest "flashing_alert" widget "*TransportAuditioningAlert" style:highest "flashing_alert" diff --git a/gtk2_ardour/au_pluginui.mm b/gtk2_ardour/au_pluginui.mm index c6eeb03563..fcaeced301 100644 --- a/gtk2_ardour/au_pluginui.mm +++ b/gtk2_ardour/au_pluginui.mm @@ -67,6 +67,7 @@ AUPluginUI::AUPluginUI (boost::shared_ptr<PluginInsert> insert) top_box.set_spacing (6); top_box.set_border_width (6); + top_box.pack_end (focus_button, false, true); top_box.pack_end (bypass_button, false, true); top_box.pack_end (automation_mode_selector, false, false); top_box.pack_end (automation_mode_label, false, false); @@ -624,16 +625,16 @@ create_au_gui (boost::shared_ptr<PluginInsert> plugin_insert, VBox** box) bool AUPluginUI::on_focus_in_event (GdkEventFocus* ev) { - cerr << "au plugin focus in\n"; - Keyboard::magic_widget_grab_focus (); + //cerr << "au plugin focus in\n"; + //Keyboard::magic_widget_grab_focus (); return false; } bool AUPluginUI::on_focus_out_event (GdkEventFocus* ev) { - cerr << "au plugin focus out\n"; - Keyboard::magic_widget_drop_focus (); + //cerr << "au plugin focus out\n"; + //Keyboard::magic_widget_drop_focus (); return false; } diff --git a/gtk2_ardour/generic_pluginui.cc b/gtk2_ardour/generic_pluginui.cc index dfff196a5f..7944fd0d28 100644 --- a/gtk2_ardour/generic_pluginui.cc +++ b/gtk2_ardour/generic_pluginui.cc @@ -86,6 +86,7 @@ GenericPluginUI::GenericPluginUI (boost::shared_ptr<PluginInsert> pi, bool scrol constraint_hbox->set_spacing (5); constraint_hbox->pack_start (*smaller_hbox, true, false); + constraint_hbox->pack_end (focus_button, false, false); constraint_hbox->pack_end (bypass_button, false, false); settings_box.pack_end (*constraint_hbox, false, false); diff --git a/gtk2_ardour/icons/computer_keyboard.png b/gtk2_ardour/icons/computer_keyboard.png Binary files differnew file mode 100644 index 0000000000..9da0109378 --- /dev/null +++ b/gtk2_ardour/icons/computer_keyboard.png diff --git a/gtk2_ardour/icons/computer_keyboard_active.png b/gtk2_ardour/icons/computer_keyboard_active.png Binary files differnew file mode 100644 index 0000000000..64b704d2ea --- /dev/null +++ b/gtk2_ardour/icons/computer_keyboard_active.png diff --git a/gtk2_ardour/keyboard.cc b/gtk2_ardour/keyboard.cc index 2e2ca5e553..a1adc5e9ba 100644 --- a/gtk2_ardour/keyboard.cc +++ b/gtk2_ardour/keyboard.cc @@ -89,12 +89,14 @@ void Keyboard::magic_widget_grab_focus () { _some_magic_widget_has_focus = true; + cerr << "Grabbed magic widget docus\n"; } void Keyboard::magic_widget_drop_focus () { _some_magic_widget_has_focus = false; + cerr << "Dropped magic widget docus\n"; } bool diff --git a/gtk2_ardour/plugin_ui.cc b/gtk2_ardour/plugin_ui.cc index 4918523af3..eae9e190eb 100644 --- a/gtk2_ardour/plugin_ui.cc +++ b/gtk2_ardour/plugin_ui.cc @@ -170,6 +170,22 @@ PluginUIWindow::on_leave_notify_event (GdkEventCrossing *ev) return false; } +bool +PluginUIWindow::on_focus_in_event (GdkEventFocus *ev) +{ + Window::on_focus_in_event (ev); + //Keyboard::the_keyboard().magic_widget_grab_focus (); + return false; +} + +bool +PluginUIWindow::on_focus_out_event (GdkEventFocus *ev) +{ + Window::on_focus_out_event (ev); + //Keyboard::the_keyboard().magic_widget_drop_focus (); + return false; +} + void PluginUIWindow::on_show () { @@ -330,6 +346,17 @@ PlugUIBase::PlugUIBase (boost::shared_ptr<PluginInsert> pi) bypass_button.set_name ("PluginBypassButton"); bypass_button.signal_toggled().connect (mem_fun(*this, &PlugUIBase::bypass_toggled)); + + focus_button.signal_button_release_event().connect (mem_fun(*this, &PlugUIBase::focus_toggled)); + focus_button.add_events (Gdk::ENTER_NOTIFY_MASK|Gdk::LEAVE_NOTIFY_MASK); + + /* these images are not managed, so that we can remove them at will */ + + focus_out_image = new Image (get_icon (X_("computer_keyboard"))); + focus_in_image = new Image (get_icon (X_("computer_keyboard_active"))); + + focus_button.add (*focus_out_image); + ARDOUR_UI::instance()->set_tip (&focus_button, _("Click to focus all keyboard events on this plugin window"), ""); } void @@ -391,6 +418,26 @@ PlugUIBase::bypass_toggled () } } +bool +PlugUIBase::focus_toggled (GdkEventButton* ev) +{ + if (Keyboard::the_keyboard().some_magic_widget_has_focus()) { + Keyboard::the_keyboard().magic_widget_drop_focus(); + focus_button.remove (); + focus_button.add (*focus_out_image); + focus_out_image->show (); + ARDOUR_UI::instance()->set_tip (&focus_button, _("Click to focus all keyboard events on this plugin window"), ""); + } else { + Keyboard::the_keyboard().magic_widget_grab_focus(); + focus_button.remove (); + focus_button.add (*focus_in_image); + focus_in_image->show (); + ARDOUR_UI::instance()->set_tip (&focus_button, _("Click to remove keyboard focus from this plugin window"), ""); + } + + return true; +} + void PlugUIBase::update_presets () { diff --git a/gtk2_ardour/plugin_ui.h b/gtk2_ardour/plugin_ui.h index 4f0d92c21c..2bf55b2e0d 100644 --- a/gtk2_ardour/plugin_ui.h +++ b/gtk2_ardour/plugin_ui.h @@ -34,6 +34,7 @@ #include <gtkmm/scrolledwindow.h> #include <gtkmm/label.h> #include <gtkmm/menu.h> +#include <gtkmm/image.h> #include <gtkmm/adjustment.h> #include <gtkmm/togglebutton.h> #include <gtkmm/socket.h> @@ -85,10 +86,15 @@ class PlugUIBase : public virtual sigc::trackable Gtk::ComboBoxText preset_combo; Gtk::Button save_button; Gtk::ToggleButton bypass_button; + Gtk::EventBox focus_button; + + Gtk::Image* focus_out_image; + Gtk::Image* focus_in_image; void setting_selected(); void save_plugin_setting (void); void bypass_toggled(); + bool focus_toggled(GdkEventButton*); void redirect_active_changed (ARDOUR::Redirect* r, void* src); }; @@ -212,6 +218,8 @@ class PluginUIWindow : public Gtk::Window bool on_enter_notify_event (GdkEventCrossing*); bool on_leave_notify_event (GdkEventCrossing*); + bool on_focus_in_event (GdkEventFocus*); + bool on_focus_out_event (GdkEventFocus*); bool on_key_press_event (GdkEventKey*); bool on_key_release_event (GdkEventKey*); void on_show (); diff --git a/libs/gtkmm2ext/gtk_ui.cc b/libs/gtkmm2ext/gtk_ui.cc index cf75e59e8b..a1885a297e 100644 --- a/libs/gtkmm2ext/gtk_ui.cc +++ b/libs/gtkmm2ext/gtk_ui.cc @@ -65,6 +65,9 @@ UI::UI (string namestr, int *argc, char ***argv) : AbstractUI<UIRequest> (namestr, true) { theMain = new Main (argc, argv); +#ifndef GTK_NEW_TOOLTIP_API + tips = new Tooltips; +#endif _active = false; _auto_display_errors = true; @@ -372,7 +375,16 @@ UI::do_request (UIRequest* req) } else if (req->type == SetTip) { - /* XXX need to figure out how this works */ +#ifdef GTK_NEW_TOOLTIP_API + /* even if the installed GTK is up to date, + at present (November 2008) our included + version of gtkmm is not. so use the GTK + API that we've verified has the right function. + */ + gtk_widget_set_tooltip_text (req->widget->gobj(), req->msg); +#else + tips->set_tip (*req->widget, req->msg, ""); +#endif } else { diff --git a/libs/gtkmm2ext/gtkmm2ext/gtk_ui.h b/libs/gtkmm2ext/gtkmm2ext/gtk_ui.h index e114693aee..91b6fa48ca 100644 --- a/libs/gtkmm2ext/gtkmm2ext/gtk_ui.h +++ b/libs/gtkmm2ext/gtkmm2ext/gtk_ui.h @@ -29,6 +29,9 @@ #include <pthread.h> #include <gtkmm/widget.h> #include <gtkmm/style.h> +#ifndef GTK_NEW_TOOLTIP_API +#include <gtkmm/tooltips.h> +#endif #include <gtkmm/textbuffer.h> #include <gtkmm/main.h> #include <gdkmm/color.h> @@ -152,6 +155,9 @@ class UI : public Receiver, public AbstractUI<UIRequest> static pthread_t gui_thread; bool _active; Gtk::Main *theMain; +#ifndef GTK_NEW_TOOLTIP_API + Gtk::Tooltips *tips; +#endif TextViewer *errors; Glib::RefPtr<Gtk::TextBuffer::Tag> error_ptag; Glib::RefPtr<Gtk::TextBuffer::Tag> error_mtag; |