Changeset View
Changeset View
Standalone View
Standalone View
effects/screenshot/screenshot.cpp
Show First 20 Lines • Show All 52 Lines • ▼ Show 20 Line(s) | |||||
53 | 53 | | |||
54 | bool ScreenShotEffect::supported() | 54 | bool ScreenShotEffect::supported() | ||
55 | { | 55 | { | ||
56 | return effects->compositingType() == XRenderCompositing || | 56 | return effects->compositingType() == XRenderCompositing || | ||
57 | (effects->isOpenGLCompositing() && GLRenderTarget::supported()); | 57 | (effects->isOpenGLCompositing() && GLRenderTarget::supported()); | ||
58 | } | 58 | } | ||
59 | 59 | | |||
60 | ScreenShotEffect::ScreenShotEffect() | 60 | ScreenShotEffect::ScreenShotEffect() | ||
61 | : m_scheduledScreenshot(0) | 61 | : m_scheduledScreenshot(nullptr) | ||
62 | { | 62 | { | ||
63 | connect(effects, &EffectsHandler::windowClosed, this, &ScreenShotEffect::windowClosed); | 63 | connect(effects, &EffectsHandler::windowClosed, this, &ScreenShotEffect::windowClosed); | ||
64 | QDBusConnection::sessionBus().registerObject(QStringLiteral("/Screenshot"), this, QDBusConnection::ExportScriptableContents); | 64 | QDBusConnection::sessionBus().registerObject(QStringLiteral("/Screenshot"), this, QDBusConnection::ExportScriptableContents); | ||
65 | } | 65 | } | ||
66 | 66 | | |||
67 | ScreenShotEffect::~ScreenShotEffect() | 67 | ScreenShotEffect::~ScreenShotEffect() | ||
68 | { | 68 | { | ||
69 | QDBusConnection::sessionBus().unregisterObject(QStringLiteral("/Screenshot")); | 69 | QDBusConnection::sessionBus().unregisterObject(QStringLiteral("/Screenshot")); | ||
▲ Show 20 Lines • Show All 159 Lines • ▼ Show 20 Line(s) | 218 | if (effects->isOpenGLCompositing()) { | |||
229 | 229 | | |||
230 | // copy content from framebuffer into image | 230 | // copy content from framebuffer into image | ||
231 | img = QImage(QSize(width, height), QImage::Format_ARGB32); | 231 | img = QImage(QSize(width, height), QImage::Format_ARGB32); | ||
232 | glReadnPixels(0, 0, width, height, GL_RGBA, GL_UNSIGNED_BYTE, img.sizeInBytes(), (GLvoid*)img.bits()); | 232 | glReadnPixels(0, 0, width, height, GL_RGBA, GL_UNSIGNED_BYTE, img.sizeInBytes(), (GLvoid*)img.bits()); | ||
233 | GLRenderTarget::popRenderTarget(); | 233 | GLRenderTarget::popRenderTarget(); | ||
234 | ScreenShotEffect::convertFromGLImage(img, width, height); | 234 | ScreenShotEffect::convertFromGLImage(img, width, height); | ||
235 | } | 235 | } | ||
236 | #ifdef KWIN_HAVE_XRENDER_COMPOSITING | 236 | #ifdef KWIN_HAVE_XRENDER_COMPOSITING | ||
237 | xcb_image_t *xImage = NULL; | 237 | xcb_image_t *xImage = nullptr; | ||
238 | if (effects->compositingType() == XRenderCompositing) { | 238 | if (effects->compositingType() == XRenderCompositing) { | ||
239 | setXRenderOffscreen(true); | 239 | setXRenderOffscreen(true); | ||
240 | effects->drawWindow(m_scheduledScreenshot, mask, QRegion(0, 0, width, height), d); | 240 | effects->drawWindow(m_scheduledScreenshot, mask, QRegion(0, 0, width, height), d); | ||
241 | if (xRenderOffscreenTarget()) { | 241 | if (xRenderOffscreenTarget()) { | ||
242 | img = xPictureToImage(xRenderOffscreenTarget(), QRect(0, 0, width, height), &xImage); | 242 | img = xPictureToImage(xRenderOffscreenTarget(), QRect(0, 0, width, height), &xImage); | ||
243 | } | 243 | } | ||
244 | setXRenderOffscreen(false); | 244 | setXRenderOffscreen(false); | ||
245 | } | 245 | } | ||
Show All 25 Lines | 258 | } else if (m_windowMode == WindowMode::FileDescriptor) { | |||
271 | m_fd = -1; | 271 | m_fd = -1; | ||
272 | } | 272 | } | ||
273 | #ifdef KWIN_HAVE_XRENDER_COMPOSITING | 273 | #ifdef KWIN_HAVE_XRENDER_COMPOSITING | ||
274 | if (xImage) { | 274 | if (xImage) { | ||
275 | xcb_image_destroy(xImage); | 275 | xcb_image_destroy(xImage); | ||
276 | } | 276 | } | ||
277 | #endif | 277 | #endif | ||
278 | } | 278 | } | ||
279 | m_scheduledScreenshot = NULL; | 279 | m_scheduledScreenshot = nullptr; | ||
280 | } | 280 | } | ||
281 | 281 | | |||
282 | if (!m_scheduledGeometry.isNull()) { | 282 | if (!m_scheduledGeometry.isNull()) { | ||
283 | if (!m_cachedOutputGeometry.isNull()) { | 283 | if (!m_cachedOutputGeometry.isNull()) { | ||
284 | // special handling for per-output geometry rendering | 284 | // special handling for per-output geometry rendering | ||
285 | const QRect intersection = m_scheduledGeometry.intersected(m_cachedOutputGeometry); | 285 | const QRect intersection = m_scheduledGeometry.intersected(m_cachedOutputGeometry); | ||
286 | if (intersection.isEmpty()) { | 286 | if (intersection.isEmpty()) { | ||
287 | // doesn't intersect, not going onto this screenshot | 287 | // doesn't intersect, not going onto this screenshot | ||
▲ Show 20 Lines • Show All 80 Lines • ▼ Show 20 Line(s) | 361 | { | |||
368 | EffectWindowList order = effects->stackingOrder(); | 368 | EffectWindowList order = effects->stackingOrder(); | ||
369 | EffectWindowList::const_iterator it = order.constEnd(), first = order.constBegin(); | 369 | EffectWindowList::const_iterator it = order.constEnd(), first = order.constBegin(); | ||
370 | while( it != first ) { | 370 | while( it != first ) { | ||
371 | m_scheduledScreenshot = *(--it); | 371 | m_scheduledScreenshot = *(--it); | ||
372 | if (m_scheduledScreenshot->isOnCurrentDesktop() && | 372 | if (m_scheduledScreenshot->isOnCurrentDesktop() && | ||
373 | !m_scheduledScreenshot->isMinimized() && !m_scheduledScreenshot->isDeleted() && | 373 | !m_scheduledScreenshot->isMinimized() && !m_scheduledScreenshot->isDeleted() && | ||
374 | m_scheduledScreenshot->geometry().contains(cursor)) | 374 | m_scheduledScreenshot->geometry().contains(cursor)) | ||
375 | break; | 375 | break; | ||
376 | m_scheduledScreenshot = 0; | 376 | m_scheduledScreenshot = nullptr; | ||
377 | } | 377 | } | ||
378 | if (m_scheduledScreenshot) { | 378 | if (m_scheduledScreenshot) { | ||
379 | m_windowMode = WindowMode::Xpixmap; | 379 | m_windowMode = WindowMode::Xpixmap; | ||
380 | m_scheduledScreenshot->addRepaintFull(); | 380 | m_scheduledScreenshot->addRepaintFull(); | ||
381 | } | 381 | } | ||
382 | } | 382 | } | ||
383 | 383 | | |||
384 | void ScreenShotEffect::screenshotForWindow(qulonglong winid, int mask) | 384 | void ScreenShotEffect::screenshotForWindow(qulonglong winid, int mask) | ||
▲ Show 20 Lines • Show All 236 Lines • ▼ Show 20 Line(s) | 611 | { | |||
621 | } else { | 621 | } else { | ||
622 | glReadPixels(0, 0, img.width(), img.height(), GL_RGBA, GL_UNSIGNED_BYTE, (GLvoid*)img.bits()); | 622 | glReadPixels(0, 0, img.width(), img.height(), GL_RGBA, GL_UNSIGNED_BYTE, (GLvoid*)img.bits()); | ||
623 | } | 623 | } | ||
624 | ScreenShotEffect::convertFromGLImage(img, geometry.width(), geometry.height()); | 624 | ScreenShotEffect::convertFromGLImage(img, geometry.width(), geometry.height()); | ||
625 | } | 625 | } | ||
626 | 626 | | |||
627 | #ifdef KWIN_HAVE_XRENDER_COMPOSITING | 627 | #ifdef KWIN_HAVE_XRENDER_COMPOSITING | ||
628 | if (effects->compositingType() == XRenderCompositing) { | 628 | if (effects->compositingType() == XRenderCompositing) { | ||
629 | xcb_image_t *xImage = NULL; | 629 | xcb_image_t *xImage = nullptr; | ||
630 | img = xPictureToImage(effects->xrenderBufferPicture(), geometry, &xImage); | 630 | img = xPictureToImage(effects->xrenderBufferPicture(), geometry, &xImage); | ||
631 | if (xImage) { | 631 | if (xImage) { | ||
632 | xcb_image_destroy(xImage); | 632 | xcb_image_destroy(xImage); | ||
633 | } | 633 | } | ||
634 | } | 634 | } | ||
635 | #endif | 635 | #endif | ||
636 | 636 | | |||
637 | if (m_captureCursor) { | 637 | if (m_captureCursor) { | ||
▲ Show 20 Lines • Show All 41 Lines • ▼ Show 20 Line(s) | 668 | } else { | |||
679 | } | 679 | } | ||
680 | 680 | | |||
681 | } | 681 | } | ||
682 | img = img.mirrored(); | 682 | img = img.mirrored(); | ||
683 | } | 683 | } | ||
684 | 684 | | |||
685 | bool ScreenShotEffect::isActive() const | 685 | bool ScreenShotEffect::isActive() const | ||
686 | { | 686 | { | ||
687 | return (m_scheduledScreenshot != NULL || !m_scheduledGeometry.isNull()) && !effects->isScreenLocked(); | 687 | return (m_scheduledScreenshot != nullptr || !m_scheduledGeometry.isNull()) && !effects->isScreenLocked(); | ||
688 | } | 688 | } | ||
689 | 689 | | |||
690 | void ScreenShotEffect::windowClosed( EffectWindow* w ) | 690 | void ScreenShotEffect::windowClosed( EffectWindow* w ) | ||
691 | { | 691 | { | ||
692 | if (w == m_scheduledScreenshot) { | 692 | if (w == m_scheduledScreenshot) { | ||
693 | m_scheduledScreenshot = NULL; | 693 | m_scheduledScreenshot = nullptr; | ||
694 | screenshotWindowUnderCursor(m_type); | 694 | screenshotWindowUnderCursor(m_type); | ||
695 | } | 695 | } | ||
696 | } | 696 | } | ||
697 | 697 | | |||
698 | bool ScreenShotEffect::isTakingScreenshot() const | 698 | bool ScreenShotEffect::isTakingScreenshot() const | ||
699 | { | 699 | { | ||
700 | if (!m_scheduledGeometry.isNull()) { | 700 | if (!m_scheduledGeometry.isNull()) { | ||
701 | return true; | 701 | return true; | ||
Show All 11 Lines |