Skip to content

Instantly share code, notes, and snippets.

Created September 15, 2017 04:43
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save anonymous/5c7afe24d6d4cb512c9d0940c91d5ac4 to your computer and use it in GitHub Desktop.
Save anonymous/5c7afe24d6d4cb512c9d0940c91d5ac4 to your computer and use it in GitHub Desktop.
stdin
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