diff options
author | Friedemann Kleint <Friedemann.Kleint@qt.io> | 2016-11-02 15:47:02 +0100 |
---|---|---|
committer | Friedemann Kleint <Friedemann.Kleint@qt.io> | 2016-11-08 12:39:32 +0000 |
commit | c84dcdd59af82b972b0dee115e95e8aa91b28c50 (patch) | |
tree | 8d3903f2ea76630db8a76c4ab3c62bb0797b504b | |
parent | 6e770638d20124802345fa5224c24e8c9d0f1d68 (diff) |
pixeltool: Check whether initial geometry is applicable
When changing primary screens of multi-monitor-setups on Windows,
out-of-screen positions might be saved which make it impossible to bring
the tool back and also cause crashes when no screen is found for grabbbing.
Check the saved position when reading the settings and check if a screen
can be obtained for grabbing.
Change-Id: I69ec677e144306290a4ee7a3e84f87dd600ff086
Reviewed-by: Morten Johan Sørvig <morten.sorvig@qt.io>
-rw-r--r-- | src/pixeltool/qpixeltool.cpp | 27 |
1 files changed, 21 insertions, 6 deletions
diff --git a/src/pixeltool/qpixeltool.cpp b/src/pixeltool/qpixeltool.cpp index b381c2e9c..8b3fe29ea 100644 --- a/src/pixeltool/qpixeltool.cpp +++ b/src/pixeltool/qpixeltool.cpp @@ -56,6 +56,18 @@ QT_BEGIN_NAMESPACE +static QPoint initialPos(const QSettings &settings, const QSize &initialSize) +{ + const QDesktopWidget *desktopWidget = QApplication::desktop(); + const QPoint defaultPos = desktopWidget->availableGeometry().topLeft(); + const QPoint savedPos = + settings.value(QLatin1String("position"), QVariant(defaultPos)).toPoint(); + const int savedScreen = desktopWidget->screenNumber(savedPos); + return savedScreen >= 0 + && desktopWidget->availableGeometry(savedScreen).intersects(QRect(savedPos, initialSize)) + ? savedPos : defaultPos; +} + QPixelTool::QPixelTool(QWidget *parent) : QWidget(parent) , m_freeze(false) @@ -75,7 +87,7 @@ QPixelTool::QPixelTool(QWidget *parent) m_zoom = settings.value(QLatin1String("zoom"), 4).toInt(); m_initialSize = settings.value(QLatin1String("initialSize"), QSize(250, 200)).toSize(); - move(settings.value(QLatin1String("position")).toPoint()); + move(initialPos(settings, m_initialSize)); setMouseTracking(true); setAttribute(Qt::WA_NoBackground); @@ -431,11 +443,14 @@ void QPixelTool::grabScreen() int x = mousePos.x() - w/2; int y = mousePos.y() - h/2; + const QBrush darkBrush = palette().color(QPalette::Dark); const QDesktopWidget *desktopWidget = QApplication::desktop(); - - QScreen *screen = QGuiApplication::screens().at(desktopWidget->screenNumber(this)); - m_buffer = screen->grabWindow(desktopWidget->winId(), x, y, w, h); - + if (QScreen *screen = QGuiApplication::screens().value(desktopWidget->screenNumber(this), Q_NULLPTR)) { + m_buffer = screen->grabWindow(desktopWidget->winId(), x, y, w, h); + } else { + m_buffer = QPixmap(w, h); + m_buffer.fill(darkBrush.color()); + } QRegion geom(x, y, w, h); QRect screenRect; for (int i = 0; i < desktopWidget->numScreens(); ++i) @@ -446,7 +461,7 @@ void QPixelTool::grabScreen() QPainter p(&m_buffer); p.translate(-x, -y); p.setPen(Qt::NoPen); - p.setBrush(palette().color(QPalette::Dark)); + p.setBrush(darkBrush); p.drawRects(rects); } |