summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFriedemann Kleint <Friedemann.Kleint@qt.io>2016-11-02 15:47:02 +0100
committerFriedemann Kleint <Friedemann.Kleint@qt.io>2016-11-08 12:39:32 +0000
commitc84dcdd59af82b972b0dee115e95e8aa91b28c50 (patch)
tree8d3903f2ea76630db8a76c4ab3c62bb0797b504b
parent6e770638d20124802345fa5224c24e8c9d0f1d68 (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.cpp27
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);
}