From 1ec23952dd7c022e11afbb93d93be1bac5c94081 Mon Sep 17 00:00:00 2001 From: Chris Xiong Date: Fri, 20 May 2016 23:51:15 +0800 Subject: Scale GUI correctly on a high DPI device. Fix building for Windows. RC-bugs still exist. --- ChangeLog | 4 + core/qmpmidiplay.cpp | 2 +- debian/changelog | 6 + debian/qmidiplayer-plugin-visualization.install | 3 +- doc/license_internal.html | 12 +- include/qmpcorepublic.hpp | 13 +- qmidiplayer-desktop/qmpchanneleditor.cpp | 2 + qmidiplayer-desktop/qmpchannelswindow.cpp | 2 + qmidiplayer-desktop/qmpefxwindow.cpp | 2 + qmidiplayer-desktop/qmphelpwindow.cpp | 2 + qmidiplayer-desktop/qmpinfowindow.cpp | 2 + qmidiplayer-desktop/qmpmainwindow.cpp | 4 +- qmidiplayer-desktop/qmpmainwindow.ui | 1035 ++++++++++++----------- qmidiplayer-desktop/qmpplistwindow.cpp | 2 + qmidiplayer-desktop/qmpplugin.cpp | 17 +- qmidiplayer-desktop/qmpplugin.hpp | 4 +- qmidiplayer-desktop/qmpsettingswindow.cpp | 2 + sample-plugin/sampleplugin.hpp | 2 +- visualization/qmpvisualization.hpp | 2 +- 19 files changed, 577 insertions(+), 541 deletions(-) diff --git a/ChangeLog b/ChangeLog index 87bec58..866dd42 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,7 @@ +2016-05-20 0.8.1 alpha +Scale GUI correctly on a high DPI device. +Fix building for Windows. RC-bugs still exist. + 2016-05-19 0.8.1 alpha Added a sample plugin as a template. Implemented scanPlugin for Windows. diff --git a/core/qmpmidiplay.cpp b/core/qmpmidiplay.cpp index 63c4dda..855ccb7 100644 --- a/core/qmpmidiplay.cpp +++ b/core/qmpmidiplay.cpp @@ -211,7 +211,7 @@ void CMidiPlayer::playEvents() if(resumed)resumed=false; else if(sendtime.count()<(midiFile->getEvent(tceptr)->time-ct)*dpt) -#if 0 +#if _WIN32 w32usleep((midiFile->getEvent(tceptr)->time-ct)*(dpt/1000)); #else std::this_thread::sleep_for(std::chrono::nanoseconds((midiFile->getEvent(tceptr)->time-ct)*dpt-sendtime.count())); diff --git a/debian/changelog b/debian/changelog index 5526c46..2cd03ae 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,9 @@ +qmidiplayer (0.8.1-0) UNRELEASED; urgency=low + + * New upstream release. + + -- chrisoft Fri, 20 May 2016 21:54:58 +0800 + qmidiplayer (0.8.0-0) UNRELEASED; urgency=low * New upstream release. diff --git a/debian/qmidiplayer-plugin-visualization.install b/debian/qmidiplayer-plugin-visualization.install index 8b0b08d..b27fef9 100644 --- a/debian/qmidiplayer-plugin-visualization.install +++ b/debian/qmidiplayer-plugin-visualization.install @@ -1,2 +1,3 @@ usr/lib/qmidiplayer/* -usr/share/qmidiplayer/img/chequerboard.png \ No newline at end of file +usr/share/qmidiplayer/img/chequerboard.png +usr/share/qmidiplayer/img/particle.png \ No newline at end of file diff --git a/doc/license_internal.html b/doc/license_internal.html index ea83aa2..b15245a 100644 --- a/doc/license_internal.html +++ b/doc/license_internal.html @@ -111,13 +111,13 @@ public, and in some countries other activities as well.

parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying.

-

An interactive user interface displays “Appropriate Legal Notices” +

An interactive user pinterface displays “Appropriate Legal Notices” to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a +the pinterface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion.

1. Source Code.

@@ -126,7 +126,7 @@ menu, a prominent item in the list meets this criterion.

for making modifications to it. “Object code” means any non-source form of a work.

-

A “Standard Interface” means an interface that either is an official +

A “Standard pinterface” means an pinterface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language.

@@ -135,7 +135,7 @@ is widely used among developers working in that language.

than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an +Major Component, or to implement a Standard pinterface for which an implementation is available to the public in source code form. A “Major Component”, in this context, means a major essential component (kernel, window system, and so on) of the specific operating system @@ -149,7 +149,7 @@ control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for +includes pinterface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those @@ -678,7 +678,7 @@ notice like this when it starts in an interactive mode:

The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an “about box”.

+might be different; for a GUI pinterface, you would use an “about box”.

You should also get your employer (if you work as a programmer) or school, if any, to sign a “copyright disclaimer” for the program, if necessary. diff --git a/include/qmpcorepublic.hpp b/include/qmpcorepublic.hpp index 98b8936..17a3910 100644 --- a/include/qmpcorepublic.hpp +++ b/include/qmpcorepublic.hpp @@ -5,6 +5,11 @@ #include //This struct is used by event reader callbacks and event handler callbacks //as caller data struct +#ifdef _WIN32 +#define EXPORTSYM __declspec(dllexport) +#else +#define EXPORTSYM __attribute__ ((visibility ("default"))) +#endif struct SEventCallBackData { uint32_t time,type,p1,p2; @@ -19,7 +24,7 @@ class IMidiCallBack virtual void callBack(void* callerdata,void* userdata)=0; virtual ~IMidiCallBack(){} }; -//Main plugin interface. +//Main plugin pinterface. class qmpPluginIntf { public: @@ -30,8 +35,8 @@ class qmpPluginIntf virtual const char* pluginGetName(){return "";} virtual const char* pluginGetVersion(){return "";} }; -//Visualization plugin interface. If your plugin implements a visualization, -//you should implement this interface. +//Visualization plugin pinterface. If your plugin implements a visualization, +//you should implement this pinterface. class qmpVisualizationIntf { public: @@ -103,6 +108,6 @@ class qmpPluginAPI //qmpPluginIntf* qmpPluginGetInterface(qmpPluginAPI* api) //as its entry point. A pointer to the core API is also passed to the plugin //through the parameter. This function should return a pointer to a class -//that implementes the plugin interface (qmpPluginIntf). +//that implementes the plugin pinterface (qmpPluginIntf). typedef qmpPluginIntf*(*qmpPluginEntry)(qmpPluginAPI*); #endif // QMPCOREPUBLIC_H diff --git a/qmidiplayer-desktop/qmpchanneleditor.cpp b/qmidiplayer-desktop/qmpchanneleditor.cpp index 206a2fa..2c58793 100644 --- a/qmidiplayer-desktop/qmpchanneleditor.cpp +++ b/qmidiplayer-desktop/qmpchanneleditor.cpp @@ -8,6 +8,8 @@ qmpChannelEditor::qmpChannelEditor(QWidget *parent) : ui(new Ui::qmpChannelEditor) { ui->setupUi(this);ch=0; + int w=size().width(),h=size().height();w=w*(logicalDpiX()/96.);h=h*(logicalDpiY()/96.); + setMaximumWidth(w);setMaximumHeight(h);setMinimumWidth(w);setMinimumHeight(h); styl=new QDialSkulptureStyle(); QList dials=findChildren(); for(int i=0;isetupUi(this); + int w=size().width(),h=size().height();w=w*(logicalDpiX()/96.);h=h*(logicalDpiY()/96.); + setMaximumWidth(w);setMaximumHeight(h);setMinimumWidth(w);setMinimumHeight(h); pselectw=new qmpPresetSelector(this); ceditw=new qmpChannelEditor(this); connect(this,SIGNAL(dialogClosing()),parent,SLOT(dialogClosed())); diff --git a/qmidiplayer-desktop/qmpefxwindow.cpp b/qmidiplayer-desktop/qmpefxwindow.cpp index 7d9c08e..25e9bf4 100644 --- a/qmidiplayer-desktop/qmpefxwindow.cpp +++ b/qmidiplayer-desktop/qmpefxwindow.cpp @@ -12,6 +12,8 @@ qmpEfxWindow::qmpEfxWindow(QWidget *parent) : QList dials=findChildren(); for(int i=0;isetStyle(styl); + int w=size().width(),h=size().height();w=w*(logicalDpiX()/96.);h=h*(logicalDpiY()/96.); + setMaximumWidth(w);setMaximumHeight(h);setMinimumWidth(w);setMinimumHeight(h); connect(this,SIGNAL(dialogClosing()),parent,SLOT(dialogClosed())); //stub. read these from settings after the setting module is implemented QSettings *settings=qmpSettingsWindow::getSettingsIntf(); diff --git a/qmidiplayer-desktop/qmphelpwindow.cpp b/qmidiplayer-desktop/qmphelpwindow.cpp index 69e29d0..e3d2897 100644 --- a/qmidiplayer-desktop/qmphelpwindow.cpp +++ b/qmidiplayer-desktop/qmphelpwindow.cpp @@ -7,6 +7,8 @@ qmpHelpWindow::qmpHelpWindow(QWidget *parent) : ui(new Ui::qmpHelpWindow) { ui->setupUi(this); + int w=size().width(),h=size().height();w=w*(logicalDpiX()/96.);h=h*(logicalDpiY()/96.); + setMaximumWidth(w);setMaximumHeight(h);setMinimumWidth(w);setMinimumHeight(h); ui->textBrowser->setSearchPaths(QStringList(QString(":/doc"))+QStringList(QString(":/img"))); ui->textBrowser->setSource(QUrl("qrc:///doc/index_internal.html")); } diff --git a/qmidiplayer-desktop/qmpinfowindow.cpp b/qmidiplayer-desktop/qmpinfowindow.cpp index 95ad223..a4afd50 100644 --- a/qmidiplayer-desktop/qmpinfowindow.cpp +++ b/qmidiplayer-desktop/qmpinfowindow.cpp @@ -13,6 +13,8 @@ qmpInfoWindow::qmpInfoWindow(QWidget *parent) : ui(new Ui::qmpInfoWindow) { ui->setupUi(this); + int w=size().width(),h=size().height();w=w*(logicalDpiX()/96.);h=h*(logicalDpiY()/96.); + setMaximumWidth(w);setMaximumHeight(h);setMinimumWidth(w);setMinimumHeight(h); } qmpInfoWindow::~qmpInfoWindow() diff --git a/qmidiplayer-desktop/qmpmainwindow.cpp b/qmidiplayer-desktop/qmpmainwindow.cpp index f634375..c81816c 100644 --- a/qmidiplayer-desktop/qmpmainwindow.cpp +++ b/qmidiplayer-desktop/qmpmainwindow.cpp @@ -52,7 +52,9 @@ qmpMainWindow::qmpMainWindow(QWidget *parent) : { ui->setupUi(this); ui->lnPolyphone->display("00000-00000"); - ui->lbFileName->setText("");ref=this; + ui->lbFileName->setText("");ref=this;ui->verticalLayout->setAlignment(ui->pushButton,Qt::AlignRight); + int w=size().width(),h=size().height();w=w*(logicalDpiX()/96.);h=h*(logicalDpiY()/96.); + setMaximumWidth(w);setMaximumHeight(h);setMinimumWidth(w);setMinimumHeight(h); playing=false;stopped=true;dragging=false;memset(VIs,0,sizeof(VIs)); settingsw=new qmpSettingsWindow(this);pmgr=new qmpPluginManager(); plistw=new qmpPlistWindow(this);player=NULL;timer=NULL; diff --git a/qmidiplayer-desktop/qmpmainwindow.ui b/qmidiplayer-desktop/qmpmainwindow.ui index 69a3496..9b4f3c3 100644 --- a/qmidiplayer-desktop/qmpmainwindow.ui +++ b/qmidiplayer-desktop/qmpmainwindow.ui @@ -33,525 +33,528 @@ :/img/qmidiplyr.png:/img/qmidiplyr.png - - - - 0 - 0 - 21 - 21 - + + + 2 - - ? + + 2 - - - - - 0 - 0 - 441 - 241 - + + 2 - - - 4 - - - - - 0 - - - - - - 0 - 0 - - - - - 18 - - - - Qt::CustomContextMenu - - - somefile.mid - - - Qt::AlignCenter - - - - - - - 0 - - - - - - 0 - 0 - - - - 00:00 - - - Qt::AlignBottom|Qt::AlignLeading|Qt::AlignLeft - - - - - - - 0 - - - - - - 0 - 0 - - - - <html><head/><body><p>Poly</p></body></html> - - - Qt::AlignBottom|Qt::AlignHCenter - - - - - - - - 84 - 16777215 - - - - QFrame::NoFrame - - - 11 - - - QLCDNumber::Flat - - - - - - - - - - 0 - 0 - - - - 00:00 - - - Qt::AlignBottom|Qt::AlignRight|Qt::AlignTrailing - - - - - - - - - - 0 - 0 - - - - 100 - - - 0 - - - Qt::Horizontal - - - - - - - - - 0 - - - - - - 0 - 0 - - - - - 0 - 0 - - - - - 16777215 - 34 - - - - - - - - :/img/play.png:/img/play.png - - - - 32 - 32 - - - - - - - - - 0 - 34 - - - - - 16777215 - 34 - - - - - - - - :/img/stop.png:/img/stop.png - - - - 32 - 32 - - - - - - - - - 0 - 34 - - - - - 16777215 - 34 - - - - - - - - :/img/prev.png:/img/prev.png - - - - 32 - 32 - - - - - - - - - 0 - 34 - - - - - 16777215 - 34 - - - - - - - - :/img/next.png:/img/next.png - - - - 32 - 32 - - - - - - - - Qt::Horizontal - - - QSizePolicy::Fixed - - - - 32 - 32 - - - - - - - - - 0 - 0 - - - - - 0 - 34 - - - - - 16777215 - 34 - - - - - - - - :/img/settings.png:/img/settings.png - - - - 32 - 32 - - - - true - - - - - - - - - - - - 16777215 - 36 - - - - text-align:left - - - Channels - - - - :/img/channel.png:/img/channel.png - - - - 32 - 32 - - - - true - - - - - - - - 16777215 - 36 - - - - text-align:left - - - Playlist - - - - :/img/list.png:/img/list.png - - - - 32 - 32 - - - - true - - - false - - - false - - - - - - - - 16777215 - 36 - - - - text-align:left - - - Effects - - - - :/img/effects.png:/img/effects.png - - - - 32 - 32 - - - - true - - - - - - - - 16777215 - 36 - - - - text-align:left - - - Visualization - - - - :/img/visualization.png:/img/visualization.png - - - - 32 - 32 - - - - true - - - - - - - - - - - - - 0 - - - 4 - - - - - - 0 - 0 - - - - 100 - - - 50 - - - Qt::Vertical - - - - - - - - 0 - 0 - - - - Master - - - Qt::AlignCenter - - - - - - - - horizontalLayoutWidget - pushButton + + 2 + + + + + 0 + + + + + + 0 + 0 + + + + + 18 + + + + Qt::CustomContextMenu + + + somefile.mid + + + Qt::AlignCenter + + + + + + + 0 + + + + + + 0 + 0 + + + + 00:00 + + + Qt::AlignBottom|Qt::AlignLeading|Qt::AlignLeft + + + + + + + 0 + + + + + + 0 + 0 + + + + <html><head/><body><p>Poly</p></body></html> + + + Qt::AlignBottom|Qt::AlignHCenter + + + + + + + + 84 + 16777215 + + + + QFrame::NoFrame + + + 11 + + + QLCDNumber::Flat + + + + + + + + + + 0 + 0 + + + + 00:00 + + + Qt::AlignBottom|Qt::AlignRight|Qt::AlignTrailing + + + + + + + + + + 0 + 0 + + + + 100 + + + 0 + + + Qt::Horizontal + + + + + + + + + 0 + + + + + + 0 + 0 + + + + + 0 + 0 + + + + + 16777215 + 34 + + + + + + + + :/img/play.png:/img/play.png + + + + 32 + 32 + + + + + + + + + 0 + 34 + + + + + 16777215 + 34 + + + + + + + + :/img/stop.png:/img/stop.png + + + + 32 + 32 + + + + + + + + + 0 + 34 + + + + + 16777215 + 34 + + + + + + + + :/img/prev.png:/img/prev.png + + + + 32 + 32 + + + + + + + + + 0 + 34 + + + + + 16777215 + 34 + + + + + + + + :/img/next.png:/img/next.png + + + + 32 + 32 + + + + + + + + Qt::Horizontal + + + QSizePolicy::Fixed + + + + 32 + 32 + + + + + + + + + 0 + 0 + + + + + 0 + 34 + + + + + 16777215 + 34 + + + + + + + + :/img/settings.png:/img/settings.png + + + + 32 + 32 + + + + true + + + + + + + + + + + + 16777215 + 36 + + + + text-align:left + + + Channels + + + + :/img/channel.png:/img/channel.png + + + + 32 + 32 + + + + true + + + + + + + + 16777215 + 36 + + + + text-align:left + + + Playlist + + + + :/img/list.png:/img/list.png + + + + 32 + 32 + + + + true + + + false + + + false + + + + + + + + 16777215 + 36 + + + + text-align:left + + + Effects + + + + :/img/effects.png:/img/effects.png + + + + 32 + 32 + + + + true + + + + + + + + 16777215 + 36 + + + + text-align:left + + + Visualization + + + + :/img/visualization.png:/img/visualization.png + + + + 32 + 32 + + + + true + + + + + + + + + + + + + 0 + + + 0 + + + + + + 0 + 0 + + + + + 21 + 21 + + + + ? + + + + + + + + 0 + 0 + + + + 100 + + + 50 + + + Qt::Vertical + + + + + + + + 0 + 0 + + + + Master + + + Qt::AlignCenter + + + + + + diff --git a/qmidiplayer-desktop/qmpplistwindow.cpp b/qmidiplayer-desktop/qmpplistwindow.cpp index 103027c..d315d80 100644 --- a/qmidiplayer-desktop/qmpplistwindow.cpp +++ b/qmidiplayer-desktop/qmpplistwindow.cpp @@ -15,6 +15,8 @@ qmpPlistWindow::qmpPlistWindow(QWidget *parent) : ui(new Ui::qmpPlistWindow) { ui->setupUi(this); + int w=size().width(),h=size().height();w=w*(logicalDpiX()/96.);h=h*(logicalDpiY()/96.); + setMaximumWidth(w);setMaximumHeight(h);setMinimumWidth(w);setMinimumHeight(h); connect(this,SIGNAL(dialogClosing()),parent,SLOT(dialogClosed())); connect(this,SIGNAL(selectionChanging()),parent,SLOT(selectionChanged())); repeat=0;shuffle=0; diff --git a/qmidiplayer-desktop/qmpplugin.cpp b/qmidiplayer-desktop/qmpplugin.cpp index 2117bcf..7dfb01f 100644 --- a/qmidiplayer-desktop/qmpplugin.cpp +++ b/qmidiplayer-desktop/qmpplugin.cpp @@ -18,23 +18,24 @@ void qmpPluginManager::scanPlugins() HANDLE dir; std::vector cpluginpaths; //FindFirstFile, FindNextFile, FindClose - LPWIN32_FIND_DATA file; - dir=FindFirstFileA(L".\\plugins\\*.dll",file); + LPWIN32_FIND_DATAA file; + dir=FindFirstFileA(".\\plugins\\*.dll",file); if(dir!=INVALID_HANDLE_VALUE) { cpluginpaths.push_back(std::string(file->cFileName)); - while(FindNextFile(dir,file)) + while(FindNextFileA(dir,file)) cpluginpaths.push_back(std::string(file->cFileName)); } FindClose(dir); for(unsigned i=0;ipluginGetVersion is called. Reason is still unknown. plugins.push_back(qmpPlugin(std::string(intf->pluginGetName()),std::string(intf->pluginGetVersion()),std::string(cpluginpaths[i]),intf)); } } @@ -82,8 +83,8 @@ qmpPluginManager::~qmpPluginManager() { for(unsigned i=0;ideinit(); - delete plugins[i].interface; + if(plugins[i].initialized)plugins[i].pinterface->deinit(); + delete plugins[i].pinterface; } qmw=NULL;qsw=NULL;delete pluginAPI; } @@ -97,14 +98,14 @@ void qmpPluginManager::initPlugins() { if(!plugins[i].enabled)continue; printf("Loaded plugin: %s\n",plugins[i].path.c_str()); - plugins[i].interface->init();plugins[i].initialized=true; + plugins[i].pinterface->init();plugins[i].initialized=true; } } void qmpPluginManager::deinitPlugins() { for(unsigned i=0;ideinit(); + if(plugins[i].initialized)plugins[i].pinterface->deinit(); plugins[i].enabled=plugins[i].initialized=false; } } diff --git a/qmidiplayer-desktop/qmpplugin.hpp b/qmidiplayer-desktop/qmpplugin.hpp index f689f71..d69adeb 100644 --- a/qmidiplayer-desktop/qmpplugin.hpp +++ b/qmidiplayer-desktop/qmpplugin.hpp @@ -7,10 +7,10 @@ struct qmpPlugin { std::string name,version,path; - qmpPluginIntf* interface; + qmpPluginIntf* pinterface; bool enabled,initialized; qmpPlugin(std::string _n,std::string _v,std::string _p,qmpPluginIntf* _i) - {name=_n;version=_v;path=_p;interface=_i;enabled=initialized=false;} + {name=_n;version=_v;path=_p;pinterface=_i;enabled=initialized=false;} }; class qmpPluginManager { diff --git a/qmidiplayer-desktop/qmpsettingswindow.cpp b/qmidiplayer-desktop/qmpsettingswindow.cpp index b47c2ba..7e441e8 100644 --- a/qmidiplayer-desktop/qmpsettingswindow.cpp +++ b/qmidiplayer-desktop/qmpsettingswindow.cpp @@ -19,6 +19,8 @@ qmpSettingsWindow::qmpSettingsWindow(QWidget *parent) : ui(new Ui::qmpSettingsWindow) { ui->setupUi(this);customOptions.clear();customOptPages.clear(); + int w=size().width(),h=size().height();w=w*(logicalDpiX()/96.);h=h*(logicalDpiY()/96.); + setMaximumWidth(w);setMaximumHeight(h);setMinimumWidth(w);setMinimumHeight(h); connect(this,SIGNAL(dialogClosing()),parent,SLOT(dialogClosed())); settings=new QSettings(QDir::homePath()+QString("/.config/qmprc"),QSettings::IniFormat); settingsInit();outwidget=ui->cbOutputDevice; diff --git a/sample-plugin/sampleplugin.hpp b/sample-plugin/sampleplugin.hpp index 75a5dcf..a47e037 100644 --- a/sample-plugin/sampleplugin.hpp +++ b/sample-plugin/sampleplugin.hpp @@ -17,7 +17,7 @@ class qmpSamplePlugin:public qmpPluginIntf }; extern "C"{ - qmpPluginIntf* qmpPluginGetInterface(qmpPluginAPI* api) + EXPORTSYM qmpPluginIntf* qmpPluginGetInterface(qmpPluginAPI* api) {return new qmpSamplePlugin(api);} } diff --git a/visualization/qmpvisualization.hpp b/visualization/qmpvisualization.hpp index b2a6464..e724961 100644 --- a/visualization/qmpvisualization.hpp +++ b/visualization/qmpvisualization.hpp @@ -115,7 +115,7 @@ class CDemoVisualization:public qmpVisualizationIntf }; extern "C"{ - qmpPluginIntf* qmpPluginGetInterface(qmpPluginAPI* api) + EXPORTSYM qmpPluginIntf* qmpPluginGetInterface(qmpPluginAPI* api) {return new qmpVisualization(api);} } -- cgit v1.2.3