Created
September 15, 2017 04:43
-
-
Save anonymous/5c7afe24d6d4cb512c9d0940c91d5ac4 to your computer and use it in GitHub Desktop.
stdin
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
bool QWidget::restoreGeometry(const QByteArray &geometry) | |
{ | |
if (geometry.size() < 4) | |
return false; | |
QDataStream stream(geometry); | |
stream.setVersion(QDataStream::Qt_4_0); | |
const quint32 magicNumber = 0x1D9D0CB; | |
quint32 storedMagicNumber; | |
stream >> storedMagicNumber; | |
if (storedMagicNumber != magicNumber) | |
return false; | |
const quint16 currentMajorVersion = 2; | |
quint16 majorVersion = 0; | |
quint16 minorVersion = 0; | |
stream >> majorVersion >> minorVersion; | |
if (majorVersion > currentMajorVersion) | |
return false; | |
// (Allow all minor versions.) | |
QRect restoredFrameGeometry; | |
QRect restoredNormalGeometry; | |
qint32 restoredScreenNumber; | |
quint8 maximized; | |
quint8 fullScreen; | |
qint32 restoredScreenWidth = 0; | |
stream >> restoredFrameGeometry | |
>> restoredNormalGeometry | |
>> restoredScreenNumber | |
>> maximized | |
>> fullScreen; | |
if (majorVersion > 1) | |
stream >> restoredScreenWidth; | |
const QDesktopWidget * const desktop = QApplication::desktop(); | |
if (restoredScreenNumber >= desktop->numScreens()) | |
restoredScreenNumber = desktop->primaryScreen(); | |
const qreal screenWidthF = qreal(desktop->screenGeometry(restoredScreenNumber).width()); | |
// Sanity check bailing out when large variations of screen sizes occur due to | |
// high DPI scaling or different levels of DPI awareness. | |
if (restoredScreenWidth) { | |
const qreal factor = qreal(restoredScreenWidth) / screenWidthF; | |
if (factor < 0.8 || factor > 1.25) | |
return false; | |
} else { | |
// Saved by Qt 5.3 and earlier, try to prevent too large windows | |
// unless the size will be adapted by maximized or fullscreen. | |
if (!maximized && !fullScreen && qreal(restoredFrameGeometry.width()) / screenWidthF > 1.5) | |
return false; | |
} | |
const int frameHeight = 20; | |
if (!restoredFrameGeometry.isValid()) | |
restoredFrameGeometry = QRect(QPoint(0,0), sizeHint()); | |
if (!restoredNormalGeometry.isValid()) | |
restoredNormalGeometry = QRect(QPoint(0, frameHeight), sizeHint()); | |
if (!restoredNormalGeometry.isValid()) { | |
// use the widget's adjustedSize if the sizeHint() doesn't help | |
restoredNormalGeometry.setSize(restoredNormalGeometry | |
.size() | |
.expandedTo(d_func()->adjustedSize())); | |
} | |
const QRect availableGeometry = desktop->availableGeometry(restoredScreenNumber); | |
// Modify the restored geometry if we are about to restore to coordinates | |
// that would make the window "lost". This happens if: | |
// - The restored geometry is completely oustside the available geometry | |
// - The title bar is outside the available geometry. | |
// - (Mac only) The window is higher than the available geometry. It must | |
// be possible to bring the size grip on screen by moving the window. | |
#ifdef Q_DEAD_CODE_FROM_QT4_MAC | |
restoredFrameGeometry.setHeight(qMin(restoredFrameGeometry.height(), availableGeometry.height())); | |
restoredNormalGeometry.setHeight(qMin(restoredNormalGeometry.height(), availableGeometry.height() - frameHeight)); | |
#endif | |
if (!restoredFrameGeometry.intersects(availableGeometry)) { | |
restoredFrameGeometry.moveBottom(qMin(restoredFrameGeometry.bottom(), availableGeometry.bottom())); | |
restoredFrameGeometry.moveLeft(qMax(restoredFrameGeometry.left(), availableGeometry.left())); | |
restoredFrameGeometry.moveRight(qMin(restoredFrameGeometry.right(), availableGeometry.right())); | |
} | |
restoredFrameGeometry.moveTop(qMax(restoredFrameGeometry.top(), availableGeometry.top())); | |
if (!restoredNormalGeometry.intersects(availableGeometry)) { | |
restoredNormalGeometry.moveBottom(qMin(restoredNormalGeometry.bottom(), availableGeometry.bottom())); | |
restoredNormalGeometry.moveLeft(qMax(restoredNormalGeometry.left(), availableGeometry.left())); | |
restoredNormalGeometry.moveRight(qMin(restoredNormalGeometry.right(), availableGeometry.right())); | |
} | |
restoredNormalGeometry.moveTop(qMax(restoredNormalGeometry.top(), availableGeometry.top() + frameHeight)); | |
if (maximized || fullScreen) { | |
// set geometry before setting the window state to make | |
// sure the window is maximized to the right screen. | |
Qt::WindowStates ws = windowState(); | |
#ifndef Q_OS_WIN | |
setGeometry(restoredNormalGeometry); | |
#else | |
if (ws & Qt::WindowFullScreen) { | |
// Full screen is not a real window state on Windows. | |
move(availableGeometry.topLeft()); | |
} else if (ws & Qt::WindowMaximized) { | |
// Setting a geometry on an already maximized window causes this to be | |
// restored into a broken, half-maximized state, non-resizable state (QTBUG-4397). | |
// Move the window in normal state if needed. | |
if (restoredScreenNumber != desktop->screenNumber(this)) { | |
setWindowState(Qt::WindowNoState); | |
setGeometry(restoredNormalGeometry); | |
} | |
} else { | |
setGeometry(restoredNormalGeometry); | |
} | |
#endif // Q_OS_WIN | |
if (maximized) | |
ws |= Qt::WindowMaximized; | |
if (fullScreen) | |
ws |= Qt::WindowFullScreen; | |
setWindowState(ws); | |
d_func()->topData()->normalGeometry = restoredNormalGeometry; | |
} else { | |
QPoint offset; | |
#ifdef Q_DEAD_CODE_FROM_QT4_X11 | |
if (isFullScreen()) | |
offset = d_func()->topData()->fullScreenOffset; | |
#endif | |
setWindowState(windowState() & ~(Qt::WindowMaximized | Qt::WindowFullScreen)); | |
move(restoredFrameGeometry.topLeft() + offset); | |
resize(restoredNormalGeometry.size()); | |
} | |
return true; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment