diff --git a/include/SubWindow.h b/include/SubWindow.h new file mode 100644 index 000000000..75e058584 --- /dev/null +++ b/include/SubWindow.h @@ -0,0 +1,56 @@ +/* + * SubWindow.h - Implementation of QMdiSubWindow that correctly tracks + * the geometry that windows should be restored to. + * Workaround for https://bugreports.qt.io/browse/QTBUG-256 + * + * Copyright (c) 2015 Colin Wallace + * + * This file is part of LMMS - http://lmms.io + * + * 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 (see COPYING); if not, write to the + * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301 USA. + * + */ + + +#ifndef SUBWINDOW_H +#define SUBWINDOW_H + + +#include +#include + + +class QMoveEvent; +class QResizeEvent; +class QWidget; + + +class SubWindow : public QMdiSubWindow +{ + Q_OBJECT +public: + SubWindow(QWidget *parent=NULL, Qt::WindowFlags windowFlags=0); + // same as QWidet::normalGeometry, but works properly under X11 (see https://bugreports.qt.io/browse/QTBUG-256) + QRect getTrueNormalGeometry() const; +protected: + // hook the QWidget move/resize events to update the tracked geometry + virtual void moveEvent(QMoveEvent * event); + virtual void resizeEvent(QResizeEvent * event); +private: + QRect m_trackedNormalGeom; +}; + +#endif \ No newline at end of file diff --git a/src/gui/CMakeLists.txt b/src/gui/CMakeLists.txt index a23c37f81..4cbf4013b 100644 --- a/src/gui/CMakeLists.txt +++ b/src/gui/CMakeLists.txt @@ -24,6 +24,7 @@ SET(LMMS_SRCS gui/PluginBrowser.cpp gui/SetupDialog.cpp gui/StringPairDrag.cpp + gui/SubWindow.cpp gui/TimeLineWidget.cpp gui/ToolPluginView.cpp gui/TrackContainerView.cpp diff --git a/src/gui/SubWindow.cpp b/src/gui/SubWindow.cpp new file mode 100644 index 000000000..cc2996253 --- /dev/null +++ b/src/gui/SubWindow.cpp @@ -0,0 +1,67 @@ +/* + * SubWindow.cpp - Implementation of QMdiSubWindow that correctly tracks + * the geometry that windows should be restored to. + * Workaround for https://bugreports.qt.io/browse/QTBUG-256 + * + * Copyright (c) 2015 Colin Wallace + * + * This file is part of LMMS - http://lmms.io + * + * 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 (see COPYING); if not, write to the + * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301 USA. + * + */ + +#include "SubWindow.h" + +#include +#include +#include + + +SubWindow::SubWindow(QWidget *parent, Qt::WindowFlags windowFlags) + : QMdiSubWindow(parent, windowFlags) +{ + // initialize the tracked geometry to whatever Qt thinks the normal geometry currently is. + // this should always work, since QMdiSubWindows will not start as maximized + m_trackedNormalGeom = normalGeometry(); +} + +QRect SubWindow::getTrueNormalGeometry() const +{ + return m_trackedNormalGeom; +} + +void SubWindow::moveEvent(QMoveEvent * event) +{ + QMdiSubWindow::moveEvent(event); + // if the window was moved and ISN'T minimized/maximized/fullscreen, + // then save the current position + if (!isMaximized() && !isMinimized() && !isFullScreen()) + { + m_trackedNormalGeom.moveTopLeft(event->pos()); + } +} + +void SubWindow::resizeEvent(QResizeEvent * event) +{ + QMdiSubWindow::resizeEvent(event); + // if the window was resized and ISN'T minimized/maximized/fullscreen, + // then save the current size + if (!isMaximized() && !isMinimized() && !isFullScreen()) + { + m_trackedNormalGeom.setSize(event->size()); + } +} \ No newline at end of file