X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Fvst_plugin_ui.cc;h=1055183be4ccd007a750be76e5f3a2345f498211;hb=ef636d02741bda53c533747f10b88f7ab667768c;hp=03bc2e0d5304d798de1b2753a9850d23116a7ef6;hpb=523891f8f9bb911f322b1a51e5c1e94685de9a05;p=ardour.git diff --git a/gtk2_ardour/vst_plugin_ui.cc b/gtk2_ardour/vst_plugin_ui.cc index 03bc2e0d53..1055183be4 100644 --- a/gtk2_ardour/vst_plugin_ui.cc +++ b/gtk2_ardour/vst_plugin_ui.cc @@ -1,25 +1,28 @@ /* - Copyright (C) 2000-2010 Paul Davis - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - -*/ + * Copyright (C) 2011 Carl Hetherington + * Copyright (C) 2012-2013 Paul Davis + * Copyright (C) 2014-2015 David Robillard + * Copyright (C) 2014-2019 Robin Gareus + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ #include #include "ardour/vst_plugin.h" #include "ardour/vst_types.h" +#include "ardour/plugin_insert.h" #include "vst_plugin_ui.h" #ifdef PLATFORM_WINDOWS @@ -38,15 +41,22 @@ VSTPluginUI::VSTPluginUI (boost::shared_ptr insert, boost: box->set_spacing (6); box->set_border_width (6); box->pack_end (focus_button, false, false); - box->pack_end (bypass_button, false, false, 10); + box->pack_end (bypass_button, false, false, 4); + if (insert->controls().size() > 0) { + box->pack_end (reset_button, false, false, 4); + } + if (has_descriptive_presets ()) { + box->pack_end (preset_browser_button, false, false); + } box->pack_end (delete_button, false, false); box->pack_end (save_button, false, false); box->pack_end (add_button, false, false); box->pack_end (_preset_combo, false, false); - - bypass_button.set_active (!insert->active ()); + box->pack_end (_preset_modified, false, false); + box->pack_end (pin_management_button, false, false); pack_start (*box, false, false); + box->signal_size_allocate().connect (sigc::mem_fun (*this, &VSTPluginUI::top_box_allocated)); #ifdef GDK_WINDOWING_X11 pack_start (_socket, true, true); _socket.set_border_width (0); @@ -59,12 +69,12 @@ VSTPluginUI::~VSTPluginUI () } void -VSTPluginUI::preset_selected () +VSTPluginUI::preset_selected (ARDOUR::Plugin::PresetRecord preset) { #ifdef GDK_WINDOWING_X11 _socket.grab_focus (); #endif - PlugUIBase::preset_selected (); + PlugUIBase::preset_selected (preset); } int @@ -92,7 +102,7 @@ VSTPluginUI::package (Gtk::Window& win) _vst->state()->width + _vst->state()->hoffset, _vst->state()->height + _vst->state()->voffset); #endif - + return 0; } @@ -118,6 +128,7 @@ VSTPluginUI::configure_handler (GdkEventConfigure*) XEvent event; gint x, y; GdkWindow* w; + Window xw = _vst->state()->linux_plugin_ui_window; if ((w = _socket.gobj()->plug_window) == 0) { return false; @@ -146,9 +157,133 @@ VSTPluginUI::configure_handler (GdkEventConfigure*) gdk_error_trap_push (); XSendEvent (GDK_WINDOW_XDISPLAY (w), GDK_WINDOW_XWINDOW (w), False, StructureNotifyMask, &event); + /* if the plugin does adds itself to the parent, + * but ardour re-parents it, we have a pointer to + * the socket's child and need to resize the + * child window (e.g. JUCE, u-he) + */ + if (xw) { + XMoveResizeWindow (GDK_WINDOW_XDISPLAY (w), xw, + 0, 0, _vst->state()->width, _vst->state()->height); + XMapRaised (GDK_WINDOW_XDISPLAY (w), xw); + XFlush (GDK_WINDOW_XDISPLAY (w)); + } gdk_error_trap_pop (); - #endif + return false; } +bool +VSTPluginUI::dispatch_effeditkey (GdkEventKey* gdk_key) +{ + int effopcode; + switch (gdk_key->type) { + case GDK_KEY_PRESS: + effopcode = 59; // effEditKeyDown + break; + case GDK_KEY_RELEASE: + effopcode = 60; // effEditKeyUp + break; + default: + return false; + } + + /* see https://github.com/DISTRHO/DPF/blob/master/distrho/src/DistrhoPluginVST.cpp */ + int special_key = 0; + int ascii_key = 0; + + switch (gdk_key->keyval) { + case GDK_BackSpace: + special_key = 1; + break; + case GDK_Tab: + case GDK_KP_Tab: + special_key = 2; + break; + case GDK_Return: + case GDK_KP_Enter: + special_key = 4; + break; + case GDK_Escape: + special_key = 6; + break; + case GDK_KP_Space: + special_key = 7; + break; + + case GDK_End: + case GDK_KP_End: + special_key = 9; + break; + case GDK_Home: + case GDK_KP_Home: + special_key = 10; + break; + case GDK_Left: + special_key = 11; + break; + case GDK_Up: + special_key = 12; + break; + case GDK_Right: + special_key = 13; + break; + case GDK_Down: + special_key = 14; + break; + case GDK_Page_Up: + case GDK_KP_Page_Up: + special_key = 15; + break; + case GDK_Page_Down: + /* fallthrough */ + case GDK_KP_Page_Down: + special_key = 16; + break; + case GDK_Insert: + special_key = 21; + break; + case GDK_Delete: + case GDK_KP_Delete: + special_key = 22; + break; + + case GDK_Shift_L: + case GDK_Shift_R: + special_key = 54; + break; + case GDK_Control_L: + case GDK_Control_R: + special_key = 55; + break; + case GDK_Alt_L: + case GDK_Alt_R: + special_key = 56; + break; + + case GDK_F1: special_key = 40; break; + case GDK_F2: special_key = 41; break; + case GDK_F3: special_key = 42; break; + case GDK_F4: special_key = 43; break; + case GDK_F5: special_key = 44; break; + case GDK_F6: special_key = 45; break; + case GDK_F7: special_key = 46; break; + case GDK_F8: special_key = 47; break; + case GDK_F9: special_key = 48; break; + case GDK_F10: special_key = 49; break; + case GDK_F11: special_key = 50; break; + case GDK_F12: special_key = 51; break; + + default: + ascii_key = gdk_key->keyval; + break; + } + + if (special_key > 0 || ascii_key > 0) { + VSTState* vstfx = _vst->state(); + /* expect non-zero return if key was handled */ + return 0 != vstfx->plugin->dispatcher (vstfx->plugin, effopcode, (int)ascii_key, (intptr_t)special_key, NULL, 0); + } + return false; +}