From deeef0a263d24b5ddbe38a601f89ec99a8f19823 Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Wed, 29 Oct 2008 07:35:40 +0000 Subject: [PATCH] step 2 of keyboard focus work for plugin windows git-svn-id: svn://localhost/ardour2/branches/2.0-ongoing@4026 d708f5d6-7413-0410-9779-e7cbd77b26cf --- SConstruct | 15 ++++++ gtk2_ardour/ardour2_ui_dark.rc.in | 2 + gtk2_ardour/ardour2_ui_light.rc.in | 2 + gtk2_ardour/au_pluginui.mm | 9 ++-- gtk2_ardour/generic_pluginui.cc | 1 + gtk2_ardour/icons/computer_keyboard.png | Bin 0 -> 1536 bytes .../icons/computer_keyboard_active.png | Bin 0 -> 1686 bytes gtk2_ardour/keyboard.cc | 2 + gtk2_ardour/plugin_ui.cc | 47 ++++++++++++++++++ gtk2_ardour/plugin_ui.h | 8 +++ libs/gtkmm2ext/gtk_ui.cc | 14 +++++- libs/gtkmm2ext/gtkmm2ext/gtk_ui.h | 6 +++ 12 files changed, 101 insertions(+), 5 deletions(-) create mode 100644 gtk2_ardour/icons/computer_keyboard.png create mode 100644 gtk2_ardour/icons/computer_keyboard_active.png 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 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 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 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 new file mode 100644 index 0000000000000000000000000000000000000000..9da0109378c7c1d1d920f1ad1fc79c07fba5e3d5 GIT binary patch literal 1536 zcmV+b2LJhqP)Opco;7Nfi4Oagpd!gR?Q~qDv4u9>B2Or354Xurh?=- zCANtyjXp+mZ#U1vpRq$*(#1P);NH3S&iV1b=Nx7fDJ7rNJfAiC_W=J70N&kh93LOw z=ka(BDT>ktI6{bm*Xy0TaN)w-e*&QFR0X4>qh7->zLHXUq?CWPZTp`1rQFuX#>Rd$K0f}3kL}s$moH!TT)lc#mr^Rb+5b@m zR8{?5qtWBFZ0e5!2=Fg7;U1HAcP28S)Gz_P3k;6yka z{(+`x9ZO3~lmCS{F7UT(Hv6xS0$7&SIXF1@k8|hFwX3QMtWVO7^WA#AUYCy^JzAWZ znfWrC&3>~MU|kZ1!{J|^KYzYmRn_KUA;h}zPF|_3;5atAZc;3Mi{BqbRW)U3Xejpb z<;xM^SK9*k{r(}tFenrXIF3VGTO04*y(16^08lEGh(sc+tgPU=E{0+7;ll?sO~dE& zA%vh<{4=T4w=69Dp4QesB19LqZ6Smp6bcP&yn=N}m`EggrIeJ*WmHvVc6OFXB*L3F zZ&+AZAR3J_KR=Jp=OYjZFh4&}JRWCxdAX@TOUtiWUj7Xbpj!Pcwc0OmU6*pXOh-pY z+qM9fWwoc%>8Rs4Jb(V2d_Iq9n%uj0kCl}bip3&#@7^UC3^F}EO+KF|7z}df&K(vP z7jaz|*L4v>qgLxeN{QpdaGVfA2+HL$ot>RQ%d&d51W;A=bSjmKRI63e=`?50o~2r? za`fm?jvqfxI2>kpc$n7KR`&1T&+zatQc4B~2RU=*OcTPkZMwR;2!%paDiu1z*0)d|ZcQyeShH+HW zH0I{!NT<_innog#z_x9cmX_%2>qFBtbX}*ryBojXPdc5(wr$?NeM^6TKQCUqz~}RE z;=~E+^*T~YIy*a?`Qi0?QC0Q$CIu|Z@|`|?I##RIn4O(va&nS^fdO*498yXS95}#} zCr>aBQow{8&(2I=qbM+iYI7Ne!5g=f#6q3im0C0fBW z&5o_E;7B^1Hf-DG(4j-^O>LXgkr(RH0z zEQX>e2qCa-8`Crm%d#TbY_`}0Fbv~o@pwF3C=^I0le~KM3Pn-aw{PFZs%hG)5~og` z;{E&gl*?sGr4pG;hC-phz`y{>WRmIWX^tE@!t2+sDV0jJwY7zT9|BWN0Keb=({MP< z;^HE?T#lZe9x9azGcz*)o7(W|IF(8tr$+q?Fvec@x7hP*s(O4yDkY=pKS%b@yb@`wr%6OuCf;3?~{|0V~-y{&aA!fjpI*Q`VN literal 0 HcmV?d00001 diff --git a/gtk2_ardour/icons/computer_keyboard_active.png b/gtk2_ardour/icons/computer_keyboard_active.png new file mode 100644 index 0000000000000000000000000000000000000000..64b704d2ea9c4bd08d3388e51ec91081a912c218 GIT binary patch literal 1686 zcmV;H25I?;P)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L00}w(00}w)@MMxo00007bV*G`2iOW6 z5F`R&2Irmt00tIGL_t(o!|j(_OkBqq$A4$fp50~H3(I8}SmR~Ej!CG&30?vY#j1mm zl3J;Q)rVHSs4uRXx-SiVsUjQUheT>x%c@i?C!Z%2XD0eIu=#MsDns zxGBVjU|`q4vX?WLKCsyaUsBgecFVD!FtE51EcD;BjBzyo&*jZ*mdUkHB(c-)V6_y!wL~E37ef?{Y6K{ zFpRX;dS2L4YC#4_1M0RSuzg>m-L#BH4(vMf#I1&O+d#tMuXS55>^zz!U5-w)>5m2I?n_iRex>a1yLz9fa+&VpxKK7q|5wOLE0mT9C06vM5{38W{)cl}dr2QS z@tfI+!%LkbL!)Ci6`@tm*MIoX-YU1#i&QpB%M}|7Wh0b8C>vYmi(pzSgc3+4NM+{8 z+DrJ{0jB3K~R#6oL1Km8_UCFKCj zrl$$}YnfiSj8K9qUo}(n@8foQ@Vb0RC777KNK0KiR~9Z4^p+!)AZssS%RE+yFMO;B z%kOr_g|eAVPh*)b{_yq?5r33(m;cH;AG}3vFvi*Olla^L%1X-l%X@z&Ua^kJ)C5uq z@-k0dMFUqea~OsLtrZT#L0;rYWo8LBS`{}1=rvgM=F6WZE_-qRFdS< z4ADrPx4SQ~`i208ldg^RU4g~?Ra)a4d93Hh%x983c<;mPxbHiJe3g8+_eZP>#c5rW zU{~+5IX>9-FyH9>K9i{lv{oe3Gc-juP+l5lF+0zucn?C_%q?CaS`iCiu;GRpaEE!M zF4*AAiVW%8B71+^&#Jm8nOugKhYzr+y^DQAg8-~=YGLrXekyCr$>nprcI*{eT3QHt zLkMZ}^b30cs97Ch@89|<^?SLyem#}`h~@OL1$g;709TkcujS|T_%XT~dns{wX|8D_ zm6_%Joh31r>U8@$IcN7g~;1^ z(u--<#@F%AKQEva#Nw-&xHL|Qw}iHJ9Y`gp4z8j)P{+}8hw!>f5z?k6RL9}h4!`^R z!O=C>M&RDohJn^hI{XsuCNA!HtNq;m@Z#3O4^ zS|g;5Ep3jxaS)H&LpT&E8q$0wMQM%G*WH&0j0}y=7Xh3>dgGPr{AVXlkce&O_}J?h zhQR}ky*KsNoXGIf>0h&>{o9Nu-zAxzA-Ooi*5*e!J8^-u6`?Bs6q7B$@gjf~WNXA1WqfXopB>swEE;Dio94vXKNY-p`JvUy(xUOM27dn1 zQ#eZv+M6FhX~ome4N_9+#57HYhyO^pA;eR^+Jh%-(75_8LjH2E>7D%I3IN|4BbpT% z>Ou{CtLHJK5(p)*@5vY60c62$rILkQmsH;$EgnsY%S&7PeF(X1(V}{JUFF7b5!&na zVOVqnPXai)`x3EOH11!>rHXzolqi~sPy($L`GV2d(k3smMP+NPv89cWc5!T3C*sCM zj>E+C5c{YIYn-O#QCi`2IB^)u-sCVGNF^|29<3FY=_x`gh83G}JA?F_9@ZDn`NMWiMfcG;EpM|jP<$X3cxGg1^dGlW gmVf?h_F1?80E`g;Xs&}>d;kCd07*qoM6N<$f}x)=jQ{`u literal 0 HcmV?d00001 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 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 #include #include +#include #include #include #include @@ -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 (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 #include #include +#ifndef GTK_NEW_TOOLTIP_API +#include +#endif #include #include #include @@ -152,6 +155,9 @@ class UI : public Receiver, public AbstractUI static pthread_t gui_thread; bool _active; Gtk::Main *theMain; +#ifndef GTK_NEW_TOOLTIP_API + Gtk::Tooltips *tips; +#endif TextViewer *errors; Glib::RefPtr error_ptag; Glib::RefPtr error_mtag;