diff --git a/include/SubWindow.h b/include/SubWindow.h index 3db78124df9..8c97d07c52a 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 fc61a248441..eb128855625 100644 --- a/plugins/vestige/vestige.cpp +++ b/plugins/vestige/vestige.cpp @@ -100,8 +100,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..63dcb662529 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 (gui->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 dc273a6a32f..03e0a670ede 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 (gui->mainWindow()->workspace()) + { + parentWidget()->hide(); + _ce->ignore(); + } + else + { + hide(); + _ce->ignore(); + } emit closed(); } diff --git a/src/gui/FxMixerView.cpp b/src/gui/FxMixerView.cpp index 54bbff70f9d..82181dcd477 100644 --- a/src/gui/FxMixerView.cpp +++ b/src/gui/FxMixerView.cpp @@ -553,16 +553,21 @@ void FxMixerView::keyPressEvent(QKeyEvent * e) void FxMixerView::closeEvent( QCloseEvent * _ce ) - { - if( parentWidget() ) +{ + if (windowFlags().testFlag(Qt::Window)) + { + _ce->accept(); + } + else if (gui->mainWindow()->workspace()) { parentWidget()->hide(); + _ce->ignore(); } else { hide(); + _ce->ignore(); } - _ce->ignore(); } diff --git a/src/gui/SubWindow.cpp b/src/gui/SubWindow.cpp index 12163b7b652..9de174acc71 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 83f582cfaf9..e712636a54c 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 (gui->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 7fc35b446a6..de1320d8ce1 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 (gui->mainWindow()->workspace()) { parentWidget()->hide(); + _ce->ignore(); } else { hide(); + _ce->ignore(); } - _ce->ignore(); } diff --git a/src/tracks/InstrumentTrack.cpp b/src/tracks/InstrumentTrack.cpp index b44d1b4fa63..c166a6ccb79 100644 --- a/src/tracks/InstrumentTrack.cpp +++ b/src/tracks/InstrumentTrack.cpp @@ -1682,15 +1682,19 @@ void InstrumentTrackWindow::toggleVisibility( bool on ) void InstrumentTrackWindow::closeEvent( QCloseEvent* event ) { - event->ignore(); - - if( gui->mainWindow()->workspace() ) + if (windowFlags().testFlag(Qt::Window)) + { + event->accept(); + } + else if (gui->mainWindow()->workspace()) { parentWidget()->hide(); + event->ignore(); } else { hide(); + event->ignore(); } m_itv->m_tlb->setFocus(); diff --git a/src/tracks/SampleTrack.cpp b/src/tracks/SampleTrack.cpp index 72f63bb05b5..c86db80aecd 100644 --- a/src/tracks/SampleTrack.cpp +++ b/src/tracks/SampleTrack.cpp @@ -1158,15 +1158,19 @@ void SampleTrackWindow::toggleVisibility(bool on) void SampleTrackWindow::closeEvent(QCloseEvent* ce) { - ce->ignore(); - - if(gui->mainWindow()->workspace()) + if (windowFlags().testFlag(Qt::Window)) + { + ce->accept(); + } + else if (gui->mainWindow()->workspace()) { parentWidget()->hide(); + ce->ignore(); } else { hide(); + ce->ignore(); } m_stv->m_tlb->setFocus();