Added SubWindow class to compensate for incorrect behavior of normalGeometry() method on X11

This commit is contained in:
Colin Wallace
2015-06-14 22:47:16 +00:00
parent 8b9868e0e5
commit 7cc917cc06
3 changed files with 124 additions and 0 deletions

56
include/SubWindow.h Normal file
View File

@@ -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 <wallace.colin.a@gmail.com>
*
* 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 <QMdiSubWindow>
#include <QRect>
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

View File

@@ -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

67
src/gui/SubWindow.cpp Normal file
View File

@@ -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 <wallace.colin.a@gmail.com>
*
* 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 <QMoveEvent>
#include <QResizeEvent>
#include <QWidget>
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());
}
}