Clean up QScreen::grabWindow()
authoraavit <qt_aavit@ovi.com>
Fri, 17 Aug 2012 12:15:36 +0000 (14:15 +0200)
committerQt by Nokia <qt-info@nokia.com>
Sat, 18 Aug 2012 08:55:47 +0000 (10:55 +0200)
Handle 0 WId parameter as meaning "desktop window"/whole screen.
Also, re-add the default values for the grab area, both for
convenience and compatibility with QPixmap::grabWindow() in Qt4.
Update the screenshot example so it doesn't comlain about usage of
deprecated QPixmap::grabWindow().

Change-Id: I2ad229113ddb8ded0388f2ebc0e8c703c6657f1f
Reviewed-by: Gunnar Sletta <gunnar.sletta@nokia.com>
doc/src/examples/screenshot.qdoc
examples/desktop/screenshot/screenshot.cpp
src/gui/kernel/qscreen.h
src/plugins/platforms/windows/qwindowsscreen.cpp
src/plugins/platforms/xcb/qxcbscreen.cpp

index cf6e68b..4723d3d 100644 (file)
 
     \snippet examples/desktop/screenshot/screenshot.cpp 5
 
-    We take the screenshot using the static QPixmap::grabWindow()
+    Using the static function QApplication::primaryScreen(), we
+    obtain the QScreen object for the application's main screen.
+
+    We take the screenshot using the QScreen::grabWindow()
     function. The function grabs the contents of the window passed as
     an argument, makes a pixmap out of it and returns that pixmap.
-
-    We identify the argument window using the QWidget::winID()
-    function which returns the window system identifier. Here it
-    returns the identifier of the current QDesktopWidget retrieved by
-    the QApplication::desktop() function. The QDesktopWidget class
-    provides access to screen information, and inherits
-    QWidget::winID().
+    The window id can be obtained with QWidget::winId() or QWindow::winId().
+    Here, however, we just pass 0 as the window id, indicating that we
+    want to grab the entire screen.
 
     We update the screenshot preview label using the private \c
     updateScreenshotLabel() function. Then we enable the \uicontrol {New
index c9310c9..12c6bee 100644 (file)
@@ -115,7 +115,9 @@ void Screenshot::shootScreen()
     originalPixmap = QPixmap(); // clear image for low memory situations
                                 // on embedded devices.
 //! [5]
-    originalPixmap = QPixmap::grabWindow(QApplication::desktop()->winId());
+    QScreen *screen = QGuiApplication::primaryScreen();
+    if (screen)
+        originalPixmap = screen->grabWindow(0);
     updateScreenshotLabel();
 
     newScreenshotButton->setDisabled(false);
index 6c14216..2d88413 100644 (file)
@@ -129,7 +129,7 @@ public:
     bool isPortrait(Qt::ScreenOrientation orientation) const;
     bool isLandscape(Qt::ScreenOrientation orientation) const;
 
-    QPixmap grabWindow(WId window, int x, int y, int w, int h);
+    QPixmap grabWindow(WId window, int x = 0, int y = 0, int w = -1, int h = -1);
 
     qreal refreshRate() const;
 
index bb2dd57..231327e 100644 (file)
@@ -183,6 +183,8 @@ Q_GUI_EXPORT QPixmap qt_pixmapFromWinHBITMAP(HBITMAP bitmap, int hbitmapFormat =
 
 QPixmap QWindowsScreen::grabWindow(WId window, int x, int y, int width, int height) const
 {
+    // TODO: handle window==0, i.e. grab whole screen
+
     if (QWindowsContext::verboseIntegration)
         qDebug() << __FUNCTION__ << window << x << y << width << height;
     RECT r;
index 0b362c5..d92004b 100644 (file)
@@ -277,6 +277,13 @@ QPixmap QXcbScreen::grabWindow(WId window, int x, int y, int width, int height)
     if (width == 0 || height == 0)
         return QPixmap();
 
+    // TODO: handle multiple screens
+    QXcbScreen *screen = const_cast<QXcbScreen *>(this);
+    xcb_window_t root = screen->root();
+
+    if (window == 0)
+        window = root;
+
     xcb_get_geometry_cookie_t geometry_cookie = xcb_get_geometry_unchecked(xcb_connection(), window);
 
     xcb_get_geometry_reply_t *reply =
@@ -291,9 +298,6 @@ QPixmap QXcbScreen::grabWindow(WId window, int x, int y, int width, int height)
     if (height < 0)
         height = reply->height - y;
 
-    // TODO: handle multiple screens
-    QXcbScreen *screen = const_cast<QXcbScreen *>(this);
-    xcb_window_t root = screen->root();
     geometry_cookie = xcb_get_geometry_unchecked(xcb_connection(), root);
     xcb_get_geometry_reply_t *root_reply =
         xcb_get_geometry_reply(xcb_connection(), geometry_cookie, NULL);