diff --git a/plugins/vst_base/RemoteVstPlugin.cpp b/plugins/vst_base/RemoteVstPlugin.cpp index 3a5eeed00..175c9f5c7 100644 --- a/plugins/vst_base/RemoteVstPlugin.cpp +++ b/plugins/vst_base/RemoteVstPlugin.cpp @@ -109,6 +109,7 @@ static VstHostLanguages hlang = LanguageEnglish; static bool EMBED = false; static bool EMBED_X11 = false; +static bool EMBED_WIN32 = false; class RemoteVstPlugin; @@ -567,17 +568,6 @@ bool RemoteVstPlugin::processMessage( const message & _m ) init( _m.getString() ); break; -// TODO: Drop Windows hack for Qt 4 -#ifdef LMMS_BUILD_WIN32 - case IdVstPluginWindowInformation: - { - HWND top = FindWindowEx( NULL, NULL, NULL, - _m.getString().c_str() ); - m_window = FindWindowEx( top, NULL, NULL, NULL ); - break; - } -#endif - case IdVstSetTempo: setBPM( _m.getInt() ); break; @@ -2084,21 +2074,27 @@ int main( int _argc, char * * _argv ) if ( embedMethod == "none" ) { cerr << "Starting detached." << endl; - EMBED = EMBED_X11 = false; + EMBED = EMBED_X11 = EMBED_WIN32 = false; + } + else if ( embedMethod == "win32" ) + { + cerr << "Starting using Win32-native embedding." << endl; + EMBED = EMBED_WIN32 = true; EMBED_X11= false; } else if ( embedMethod == "qt" ) { cerr << "Starting using Qt-native embedding." << endl; - EMBED = true; EMBED_X11 = false; + EMBED = true; EMBED_X11 = EMBED_WIN32 = false; } else if ( embedMethod == "xembed" ) { cerr << "Starting using X11Embed protocol." << endl; - EMBED = true; EMBED_X11 = true; + EMBED = EMBED_X11 = true; EMBED_WIN32 = false; } else { cerr << "Unknown embed method " << embedMethod << ". Starting detached instead." << endl; + EMBED = EMBED_X11 = EMBED_WIN32 = false; } } diff --git a/plugins/vst_base/VstPlugin.cpp b/plugins/vst_base/VstPlugin.cpp index 4a7bed403..cada57293 100644 --- a/plugins/vst_base/VstPlugin.cpp +++ b/plugins/vst_base/VstPlugin.cpp @@ -51,6 +51,7 @@ #ifdef LMMS_BUILD_WIN32 # include +# include #endif #include "ConfigManager.h" @@ -668,19 +669,49 @@ void VstPlugin::createUI( QWidget * parent, bool isEffect ) // TODO: Synchronize show // Tell remote that it is embedded // Wait for remote reply - } + } else +#endif + +#ifdef LMMS_BUILD_WIN32 + if (m_embedMethod == "win32" ) + { + QWidget * helper = new QWidget; + QHBoxLayout * l = new QHBoxLayout( helper ); + QWidget * target = new QWidget( helper ); + l->setSpacing( 0 ); + l->setMargin( 0 ); + l->addWidget( target ); + + // we've to call that for making sure, Qt created the windows + helper->winId(); + HWND targetHandle = (HWND)target->winId(); + HWND pluginHandle = (HWND)(intptr_t)m_pluginWindowID; + + DWORD style = GetWindowLong(pluginHandle, GWL_STYLE); + style = style & ~(WS_POPUP); + style = style | WS_CHILD; + SetWindowLong(pluginHandle, GWL_STYLE, style); + SetParent(pluginHandle, targetHandle); + + DWORD threadId = GetWindowThreadProcessId(pluginHandle, NULL); + DWORD currentThreadId = GetCurrentThreadId(); + AttachThreadInput(currentThreadId, threadId, true); + + container = helper; + RemotePlugin::showUI(); + + } else #endif #ifdef LMMS_BUILD_LINUX - else if (m_embedMethod == "xembed" ) + if (m_embedMethod == "xembed" ) { QX11EmbedContainer * embedContainer = new QX11EmbedContainer( sw ); connect(embedContainer, SIGNAL(clientIsEmbedded()), this, SLOT(handleClientEmbed())); embedContainer->embedClient( m_pluginWindowID ); container = embedContainer; - } + } else #endif - else { qCritical() << "Unknown embed method" << m_embedMethod; delete m_pluginSubWindow; diff --git a/plugins/vst_base/communication.h b/plugins/vst_base/communication.h index 3e85007e7..bacf43c1e 100644 --- a/plugins/vst_base/communication.h +++ b/plugins/vst_base/communication.h @@ -57,8 +57,6 @@ enum VstRemoteMessageIDs { // vstPlugin -> remoteVstPlugin IdVstLoadPlugin = IdUserBase, - // TODO: Drop IdVstPluginWindowInformation, Windows hack for Qt 4 - IdVstPluginWindowInformation, IdVstClosePlugin, IdVstSetTempo, IdVstSetLanguage, diff --git a/src/core/ConfigManager.cpp b/src/core/ConfigManager.cpp index 734c39c1f..8cbee6acf 100644 --- a/src/core/ConfigManager.cpp +++ b/src/core/ConfigManager.cpp @@ -199,6 +199,10 @@ QString ConfigManager::vstEmbedMethod() const } #endif +#ifdef LMMS_BUILD_WIN32 + defaultMethod = "win32"; +#endif + return value( "ui", "vstembedmethod", defaultMethod ); } diff --git a/src/gui/SetupDialog.cpp b/src/gui/SetupDialog.cpp index 550f1d93e..14355f894 100644 --- a/src/gui/SetupDialog.cpp +++ b/src/gui/SetupDialog.cpp @@ -347,6 +347,10 @@ SetupDialog::SetupDialog( ConfigTabs _tab_to_open ) : m_vstEmbedComboBox->addItem( tr( "Embed using Qt API" ), "qt" ); #endif +#ifdef LMMS_BUILD_WIN32 + m_vstEmbedComboBox->addItem( tr( "Embed using native Win32 API" ), "win32" ); +#endif + #ifdef LMMS_BUILD_LINUX if ( QX11Info::isPlatformX11() ) { m_vstEmbedComboBox->addItem( tr( "Embed using XEmbed protocol" ), "xembed" );