Support for fullscreen, screen and region screenshot
Just to have something which uses the blitFramebuffer functionality.
This commit is contained in:
parent
225c362a04
commit
29e91f9042
2 changed files with 82 additions and 0 deletions
|
@ -21,6 +21,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
#include "screenshot.h"
|
#include "screenshot.h"
|
||||||
#include <kwinglutils.h>
|
#include <kwinglutils.h>
|
||||||
#include <KDE/KDebug>
|
#include <KDE/KDebug>
|
||||||
|
#include <KDE/KTemporaryFile>
|
||||||
#include <QtDBus/QDBusConnection>
|
#include <QtDBus/QDBusConnection>
|
||||||
#include <QtCore/QVarLengthArray>
|
#include <QtCore/QVarLengthArray>
|
||||||
#include <QtGui/QPainter>
|
#include <QtGui/QPainter>
|
||||||
|
@ -146,6 +147,63 @@ void ScreenShotEffect::screenshotWindowUnderCursor(int mask)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QString ScreenShotEffect::screenshotFullscreen()
|
||||||
|
{
|
||||||
|
if (!GLRenderTarget::blitSupported()) {
|
||||||
|
kDebug(1212) << "Framebuffer Blit not supported";
|
||||||
|
return QString();
|
||||||
|
}
|
||||||
|
|
||||||
|
return blitScreenshot(QRect(0, 0, displayWidth(), displayHeight()));
|
||||||
|
}
|
||||||
|
|
||||||
|
QString ScreenShotEffect::screenshotScreen(int screen)
|
||||||
|
{
|
||||||
|
if (!GLRenderTarget::blitSupported()) {
|
||||||
|
kDebug(1212) << "Framebuffer Blit not supported";
|
||||||
|
return QString();
|
||||||
|
}
|
||||||
|
|
||||||
|
return blitScreenshot(effects->clientArea(FullScreenArea, screen, 0));
|
||||||
|
}
|
||||||
|
|
||||||
|
QString ScreenShotEffect::screenshotArea(int x, int y, int width, int height)
|
||||||
|
{
|
||||||
|
if (!GLRenderTarget::blitSupported()) {
|
||||||
|
kDebug(1212) << "Framebuffer Blit not supported";
|
||||||
|
return QString();
|
||||||
|
}
|
||||||
|
|
||||||
|
return blitScreenshot(QRect(x, y, width, height));
|
||||||
|
}
|
||||||
|
|
||||||
|
QString ScreenShotEffect::blitScreenshot(const QRect &geometry)
|
||||||
|
{
|
||||||
|
#ifdef KWIN_HAVE_OPENGLES
|
||||||
|
Q_UNUSED(geometry)
|
||||||
|
return QString();
|
||||||
|
#else
|
||||||
|
GLTexture tex(geometry.width(), geometry.height());
|
||||||
|
GLRenderTarget target(&tex);
|
||||||
|
target.blitFromFramebuffer(geometry);
|
||||||
|
// copy content from framebuffer into image
|
||||||
|
tex.bind();
|
||||||
|
QImage img(geometry.size(), QImage::Format_ARGB32);
|
||||||
|
glGetTexImage(GL_TEXTURE_2D, 0, GL_RGBA, GL_UNSIGNED_BYTE, (GLvoid*)img.bits());
|
||||||
|
tex.unbind();
|
||||||
|
ScreenShotEffect::convertFromGLImage(img, geometry.width(), geometry.height());
|
||||||
|
KTemporaryFile temp;
|
||||||
|
temp.setSuffix(".png");
|
||||||
|
temp.setAutoRemove(false);
|
||||||
|
if (!temp.open()) {
|
||||||
|
return QString();
|
||||||
|
}
|
||||||
|
img.save(&temp);
|
||||||
|
temp.close();
|
||||||
|
return temp.fileName();
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
void ScreenShotEffect::grabPointerImage(QImage& snapshot, int offsetx, int offsety)
|
void ScreenShotEffect::grabPointerImage(QImage& snapshot, int offsetx, int offsety)
|
||||||
// Uses the X11_EXTENSIONS_XFIXES_H extension to grab the pointer image, and overlays it onto the snapshot.
|
// Uses the X11_EXTENSIONS_XFIXES_H extension to grab the pointer image, and overlays it onto the snapshot.
|
||||||
{
|
{
|
||||||
|
|
|
@ -45,12 +45,36 @@ public:
|
||||||
static void convertFromGLImage(QImage &img, int w, int h);
|
static void convertFromGLImage(QImage &img, int w, int h);
|
||||||
public Q_SLOTS:
|
public Q_SLOTS:
|
||||||
Q_SCRIPTABLE void screenshotWindowUnderCursor(int mask = 0);
|
Q_SCRIPTABLE void screenshotWindowUnderCursor(int mask = 0);
|
||||||
|
/**
|
||||||
|
* Saves a screenshot of all screen into a file and returns the path to the file.
|
||||||
|
* Functionality requires hardware support, if not available a null string is returned.
|
||||||
|
* @returns Path to stored screenshot, or null string in failure case.
|
||||||
|
**/
|
||||||
|
Q_SCRIPTABLE QString screenshotFullscreen();
|
||||||
|
/**
|
||||||
|
* Saves a screenshot of the screen identified by @p screen into a file and returns the path to the file.
|
||||||
|
* Functionality requires hardware support, if not available a null string is returned.
|
||||||
|
* @param screen Number of screen as numbered by kephal
|
||||||
|
* @returns Path to stored screenshot, or null string in failure case.
|
||||||
|
**/
|
||||||
|
Q_SCRIPTABLE QString screenshotScreen(int screen);
|
||||||
|
/**
|
||||||
|
* Saves a screenshot of the selected geometry into a file and returns the path to the file.
|
||||||
|
* Functionality requires hardware support, if not available a null string is returned.
|
||||||
|
* @param x Left upper x coord of region
|
||||||
|
* @param y Left upper y coord of region
|
||||||
|
* @param width Width of the region to screenshot
|
||||||
|
* @param height Height of the region to screenshot
|
||||||
|
* @returns Path to stored screenshot, or null string in failure case.
|
||||||
|
**/
|
||||||
|
Q_SCRIPTABLE QString screenshotArea(int x, int y, int width, int height);
|
||||||
|
|
||||||
Q_SIGNALS:
|
Q_SIGNALS:
|
||||||
Q_SCRIPTABLE void screenshotCreated(qulonglong handle);
|
Q_SCRIPTABLE void screenshotCreated(qulonglong handle);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void grabPointerImage(QImage& snapshot, int offsetx, int offsety);
|
void grabPointerImage(QImage& snapshot, int offsetx, int offsety);
|
||||||
|
QString blitScreenshot(const QRect &geometry);
|
||||||
EffectWindow *m_scheduledScreenshot;
|
EffectWindow *m_scheduledScreenshot;
|
||||||
ScreenShotType m_type;
|
ScreenShotType m_type;
|
||||||
QPixmap m_lastScreenshot;
|
QPixmap m_lastScreenshot;
|
||||||
|
|
Loading…
Reference in a new issue