diff --git a/include/SubWindow.h b/include/SubWindow.h index ad51780904f..d723981417c 100644 --- a/include/SubWindow.h +++ b/include/SubWindow.h @@ -76,6 +76,7 @@ public slots: void paintEvent( QPaintEvent * pe ) override; void changeEvent( QEvent * event ) override; void showEvent( QShowEvent* event ) override; + bool eventFilter( QObject * obj, QEvent * event ) override; bool isDetached() const; diff --git a/plugins/vestige/vestige.cpp b/plugins/vestige/vestige.cpp index 97af8bc43b8..98e7d639f09 100644 --- a/plugins/vestige/vestige.cpp +++ b/plugins/vestige/vestige.cpp @@ -103,8 +103,15 @@ class vstSubWin : public SubWindow { // ignore close-events - for some reason otherwise the VST GUI // remains hidden when re-opening - hide(); - e->ignore(); + if (windowFlags().testFlag(Qt::Window)) + { + e->accept(); + } + else + { + hide(); + e->ignore(); + } } }; diff --git a/src/gui/ControllerDialog.cpp b/src/gui/ControllerDialog.cpp index f854ab1b94e..8e3583f987d 100644 --- a/src/gui/ControllerDialog.cpp +++ b/src/gui/ControllerDialog.cpp @@ -27,6 +27,8 @@ #include "ControllerDialog.h" #include "Controller.h" +#include "GuiApplication.h" +#include "MainWindow.h" ControllerDialog::ControllerDialog( Controller * _controller, @@ -46,7 +48,20 @@ ControllerDialog::~ControllerDialog() void ControllerDialog::closeEvent( QCloseEvent * _ce ) { - _ce->ignore(); + if (windowFlags().testFlag(Qt::Window)) + { + _ce->accept(); + } + else if (getGUI()->mainWindow()->workspace()) + { + parentWidget()->hide(); + _ce->ignore(); + } + else + { + hide(); + _ce->ignore(); + } emit closed(); } diff --git a/src/gui/EffectControlDialog.cpp b/src/gui/EffectControlDialog.cpp index 3439835d139..f4567bed0e3 100644 --- a/src/gui/EffectControlDialog.cpp +++ b/src/gui/EffectControlDialog.cpp @@ -28,6 +28,8 @@ #include "EffectControlDialog.h" #include "EffectControls.h" +#include "GuiApplication.h" +#include "MainWindow.h" EffectControlDialog::EffectControlDialog( EffectControls * _controls ) : @@ -51,7 +53,20 @@ EffectControlDialog::~EffectControlDialog() void EffectControlDialog::closeEvent( QCloseEvent * _ce ) { - _ce->ignore(); + if (windowFlags().testFlag(Qt::Window)) + { + _ce->accept(); + } + else if (getGUI()->mainWindow()->workspace()) + { + parentWidget()->hide(); + _ce->ignore(); + } + else + { + hide(); + _ce->ignore(); + } emit closed(); } diff --git a/src/gui/InstrumentTrackWindow.cpp b/src/gui/InstrumentTrackWindow.cpp index eb6f7c410fe..d7b2826f16a 100644 --- a/src/gui/InstrumentTrackWindow.cpp +++ b/src/gui/InstrumentTrackWindow.cpp @@ -501,15 +501,19 @@ void InstrumentTrackWindow::toggleVisibility( bool on ) void InstrumentTrackWindow::closeEvent( QCloseEvent* event ) { - event->ignore(); - - if( getGUI()->mainWindow()->workspace() ) + if (windowFlags().testFlag(Qt::Window)) + { + event->accept(); + } + else if (getGUI()->mainWindow()->workspace()) { parentWidget()->hide(); + event->ignore(); } else { hide(); + event->ignore(); } m_itv->m_tlb->setFocus(); diff --git a/src/gui/MixerView.cpp b/src/gui/MixerView.cpp index 2cae9ad6f0d..2fb3964b7f3 100644 --- a/src/gui/MixerView.cpp +++ b/src/gui/MixerView.cpp @@ -554,17 +554,22 @@ void MixerView::keyPressEvent(QKeyEvent * e) void MixerView::closeEvent( QCloseEvent * _ce ) - { - if( parentWidget() ) +{ + if (windowFlags().testFlag(Qt::Window)) + { + _ce->accept(); + } + else if (getGUI()->mainWindow()->workspace()) { parentWidget()->hide(); + _ce->ignore(); } else { hide(); + _ce->ignore(); } - _ce->ignore(); - } +} diff --git a/src/gui/SampleTrackWindow.cpp b/src/gui/SampleTrackWindow.cpp index 87273461fb9..88bdd89d1c0 100644 --- a/src/gui/SampleTrackWindow.cpp +++ b/src/gui/SampleTrackWindow.cpp @@ -230,15 +230,19 @@ void SampleTrackWindow::toggleVisibility(bool on) void SampleTrackWindow::closeEvent(QCloseEvent* ce) { - ce->ignore(); - - if(getGUI()->mainWindow()->workspace()) + if (windowFlags().testFlag(Qt::Window)) + { + ce->accept(); + } + else if (getGUI()->mainWindow()->workspace()) { parentWidget()->hide(); + ce->ignore(); } else { hide(); + ce->ignore(); } m_stv->m_tlb->setFocus(); @@ -262,4 +266,4 @@ void SampleTrackWindow::loadSettings(const QDomElement& element) { m_stv->m_tlb->setChecked(true); } -} \ No newline at end of file +} diff --git a/src/gui/SubWindow.cpp b/src/gui/SubWindow.cpp index 2dc52deb0b2..d4366b86dce 100644 --- a/src/gui/SubWindow.cpp +++ b/src/gui/SubWindow.cpp @@ -260,6 +260,7 @@ void SubWindow::detach() if (isDetached()) { return; } + auto pos = mapToGlobal(widget()->pos()); widget()->setWindowFlags(Qt::Window); widget()->show(); @@ -433,3 +434,17 @@ void SubWindow::resizeEvent( QResizeEvent * event ) m_trackedNormalGeom.setSize( event->size() ); } } + +bool SubWindow::eventFilter(QObject * obj, QEvent * event) +{ + if (obj != static_cast(widget())) { + return QMdiSubWindow::eventFilter(obj, event); + } + switch (event->type()) { + case QEvent::WindowStateChange: + event->accept(); + return true; + default: + return QMdiSubWindow::eventFilter(obj, event); + } +} diff --git a/src/gui/widgets/ControllerRackView.cpp b/src/gui/widgets/ControllerRackView.cpp index 99d9241d736..8984adecb63 100644 --- a/src/gui/widgets/ControllerRackView.cpp +++ b/src/gui/widgets/ControllerRackView.cpp @@ -203,14 +203,19 @@ void ControllerRackView::addController() void ControllerRackView::closeEvent( QCloseEvent * _ce ) { - if( parentWidget() ) + if (windowFlags().testFlag(Qt::Window)) + { + _ce->accept(); + } + else if (getGUI()->mainWindow()->workspace()) { parentWidget()->hide(); + _ce->ignore(); } else { hide(); + _ce->ignore(); } - _ce->ignore(); } diff --git a/src/gui/widgets/ProjectNotes.cpp b/src/gui/widgets/ProjectNotes.cpp index 6fac7320817..cfd607d2027 100644 --- a/src/gui/widgets/ProjectNotes.cpp +++ b/src/gui/widgets/ProjectNotes.cpp @@ -398,13 +398,18 @@ void ProjectNotes::loadSettings( const QDomElement & _this ) void ProjectNotes::closeEvent( QCloseEvent * _ce ) { - if( parentWidget() ) + if (windowFlags().testFlag(Qt::Window)) + { + _ce->accept(); + } + else if (getGUI()->mainWindow()->workspace()) { parentWidget()->hide(); + _ce->ignore(); } else { hide(); + _ce->ignore(); } - _ce->ignore(); }