Merge branch 'KDE/4.11'
This commit is contained in:
commit
341aaae068
6 changed files with 67 additions and 17 deletions
|
@ -166,7 +166,7 @@ X11Cursor::X11Cursor(QObject *parent)
|
||||||
m_resetTimeStampTimer->setSingleShot(true);
|
m_resetTimeStampTimer->setSingleShot(true);
|
||||||
connect(m_resetTimeStampTimer, SIGNAL(timeout()), SLOT(resetTimeStamp()));
|
connect(m_resetTimeStampTimer, SIGNAL(timeout()), SLOT(resetTimeStamp()));
|
||||||
// TODO: How often do we really need to poll?
|
// TODO: How often do we really need to poll?
|
||||||
m_mousePollingTimer->setInterval(100);
|
m_mousePollingTimer->setInterval(50);
|
||||||
connect(m_mousePollingTimer, SIGNAL(timeout()), SLOT(mousePolled()));
|
connect(m_mousePollingTimer, SIGNAL(timeout()), SLOT(mousePolled()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -37,7 +37,8 @@ namespace KWin
|
||||||
KWIN_EFFECT(resize, ResizeEffect)
|
KWIN_EFFECT(resize, ResizeEffect)
|
||||||
|
|
||||||
ResizeEffect::ResizeEffect()
|
ResizeEffect::ResizeEffect()
|
||||||
: m_active(false)
|
: AnimationEffect()
|
||||||
|
, m_active(false)
|
||||||
, m_resizeWindow(0)
|
, m_resizeWindow(0)
|
||||||
{
|
{
|
||||||
reconfigure(ReconfigureAll);
|
reconfigure(ReconfigureAll);
|
||||||
|
@ -55,14 +56,14 @@ void ResizeEffect::prePaintScreen(ScreenPrePaintData& data, int time)
|
||||||
if (m_active) {
|
if (m_active) {
|
||||||
data.mask |= PAINT_SCREEN_WITH_TRANSFORMED_WINDOWS;
|
data.mask |= PAINT_SCREEN_WITH_TRANSFORMED_WINDOWS;
|
||||||
}
|
}
|
||||||
effects->prePaintScreen(data, time);
|
AnimationEffect::prePaintScreen(data, time);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ResizeEffect::prePaintWindow(EffectWindow* w, WindowPrePaintData& data, int time)
|
void ResizeEffect::prePaintWindow(EffectWindow* w, WindowPrePaintData& data, int time)
|
||||||
{
|
{
|
||||||
if (m_active && w == m_resizeWindow)
|
if (m_active && w == m_resizeWindow)
|
||||||
data.mask |= PAINT_WINDOW_TRANSFORMED;
|
data.mask |= PAINT_WINDOW_TRANSFORMED;
|
||||||
effects->prePaintWindow(w, data, time);
|
AnimationEffect::prePaintWindow(w, data, time);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ResizeEffect::paintWindow(EffectWindow* w, int mask, QRegion region, WindowPaintData& data)
|
void ResizeEffect::paintWindow(EffectWindow* w, int mask, QRegion region, WindowPaintData& data)
|
||||||
|
@ -118,8 +119,9 @@ void ResizeEffect::paintWindow(EffectWindow* w, int mask, QRegion region, Window
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
} else
|
} else {
|
||||||
effects->paintWindow(w, mask, region, data);
|
AnimationEffect::paintWindow(w, mask, region, data);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void ResizeEffect::reconfigure(ReconfigureFlags)
|
void ResizeEffect::reconfigure(ReconfigureFlags)
|
||||||
|
@ -148,6 +150,8 @@ void ResizeEffect::slotWindowFinishUserMovedResized(EffectWindow *w)
|
||||||
if (m_active && w == m_resizeWindow) {
|
if (m_active && w == m_resizeWindow) {
|
||||||
m_active = false;
|
m_active = false;
|
||||||
m_resizeWindow = NULL;
|
m_resizeWindow = NULL;
|
||||||
|
if (m_features & TextureScale)
|
||||||
|
animate(w, CrossFadePrevious, 0, 150, FPx2(1.0));
|
||||||
effects->addRepaintFull();
|
effects->addRepaintFull();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -21,13 +21,13 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
#ifndef KWIN_RESIZE_H
|
#ifndef KWIN_RESIZE_H
|
||||||
#define KWIN_RESIZE_H
|
#define KWIN_RESIZE_H
|
||||||
|
|
||||||
#include <kwineffects.h>
|
#include <kwinanimationeffect.h>
|
||||||
|
|
||||||
namespace KWin
|
namespace KWin
|
||||||
{
|
{
|
||||||
|
|
||||||
class ResizeEffect
|
class ResizeEffect
|
||||||
: public Effect
|
: public AnimationEffect
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
Q_PROPERTY(bool textureScale READ isTextureScale)
|
Q_PROPERTY(bool textureScale READ isTextureScale)
|
||||||
|
@ -38,7 +38,7 @@ public:
|
||||||
virtual inline bool provides(Effect::Feature ef) {
|
virtual inline bool provides(Effect::Feature ef) {
|
||||||
return ef == Effect::Resize;
|
return ef == Effect::Resize;
|
||||||
}
|
}
|
||||||
inline bool isActive() const { return m_active; }
|
inline bool isActive() const { return m_active || AnimationEffect::isActive(); }
|
||||||
virtual void prePaintScreen(ScreenPrePaintData& data, int time);
|
virtual void prePaintScreen(ScreenPrePaintData& data, int time);
|
||||||
virtual void prePaintWindow(EffectWindow* w, WindowPrePaintData& data, int time);
|
virtual void prePaintWindow(EffectWindow* w, WindowPrePaintData& data, int time);
|
||||||
virtual void paintWindow(EffectWindow* w, int mask, QRegion region, WindowPaintData& data);
|
virtual void paintWindow(EffectWindow* w, int mask, QRegion region, WindowPaintData& data);
|
||||||
|
|
|
@ -52,7 +52,6 @@ void KillWindow::start()
|
||||||
if (m_active) {
|
if (m_active) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
m_active = true;
|
|
||||||
|
|
||||||
xcb_connection_t *c = connection();
|
xcb_connection_t *c = connection();
|
||||||
ScopedCPointer<xcb_grab_pointer_reply_t> grabPointer(xcb_grab_pointer_reply(c, xcb_grab_pointer_unchecked(c, false, rootWindow(),
|
ScopedCPointer<xcb_grab_pointer_reply_t> grabPointer(xcb_grab_pointer_reply(c, xcb_grab_pointer_unchecked(c, false, rootWindow(),
|
||||||
|
@ -64,7 +63,11 @@ void KillWindow::start()
|
||||||
if (grabPointer.isNull() || grabPointer->status != XCB_GRAB_STATUS_SUCCESS) {
|
if (grabPointer.isNull() || grabPointer->status != XCB_GRAB_STATUS_SUCCESS) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
grabXKeyboard();
|
m_active = grabXKeyboard();
|
||||||
|
if (!m_active) {
|
||||||
|
xcb_ungrab_pointer(connection(), XCB_TIME_CURRENT_TIME);
|
||||||
|
return;
|
||||||
|
}
|
||||||
grabXServer();
|
grabXServer();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -348,6 +348,13 @@ void OpenGLPaintRedirector::resizePixmaps(const QRect *rects)
|
||||||
size[TopBottom] = QSize(align(qMax(rects[TopPixmap].width(), rects[BottomPixmap].width()), 128),
|
size[TopBottom] = QSize(align(qMax(rects[TopPixmap].width(), rects[BottomPixmap].width()), 128),
|
||||||
rects[TopPixmap].height() + rects[BottomPixmap].height());
|
rects[TopPixmap].height() + rects[BottomPixmap].height());
|
||||||
|
|
||||||
|
if (!GLTexture::NPOTTextureSupported()) {
|
||||||
|
for (int i = 0; i < 2; i++) {
|
||||||
|
size[i].rwidth() = nearestPowerOfTwo(size[i].width());
|
||||||
|
size[i].rheight() = nearestPowerOfTwo(size[i].height());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
bool fbo_bound = false;
|
bool fbo_bound = false;
|
||||||
|
|
||||||
for (int i = 0; i < 2; i++) {
|
for (int i = 0; i < 2; i++) {
|
||||||
|
|
|
@ -48,6 +48,10 @@ namespace KWin
|
||||||
xcb_render_picture_t SceneXrender::buffer = XCB_RENDER_PICTURE_NONE;
|
xcb_render_picture_t SceneXrender::buffer = XCB_RENDER_PICTURE_NONE;
|
||||||
ScreenPaintData SceneXrender::screen_paint;
|
ScreenPaintData SceneXrender::screen_paint;
|
||||||
|
|
||||||
|
#define DOUBLE_TO_FIXED(d) ((xcb_render_fixed_t) ((d) * 65536))
|
||||||
|
#define FIXED_TO_DOUBLE(f) ((double) ((f) / 65536.0))
|
||||||
|
|
||||||
|
|
||||||
static xcb_render_pictformat_t findFormatForVisual(xcb_visualid_t visual)
|
static xcb_render_pictformat_t findFormatForVisual(xcb_visualid_t visual)
|
||||||
{
|
{
|
||||||
static QHash<xcb_visualid_t, xcb_render_pictformat_t> s_cache;
|
static QHash<xcb_visualid_t, xcb_render_pictformat_t> s_cache;
|
||||||
|
@ -445,7 +449,6 @@ void SceneXrender::Window::performPaint(int mask, QRegion region, WindowPaintDat
|
||||||
if (toplevel->hasShadow())
|
if (toplevel->hasShadow())
|
||||||
transformed_shape |= toplevel->shadow()->shadowRegion();
|
transformed_shape |= toplevel->shadow()->shadowRegion();
|
||||||
|
|
||||||
#define DOUBLE_TO_FIXED(d) ((xcb_render_fixed_t) ((d) * 65536))
|
|
||||||
xcb_render_transform_t xform = {
|
xcb_render_transform_t xform = {
|
||||||
DOUBLE_TO_FIXED(1), DOUBLE_TO_FIXED(0), DOUBLE_TO_FIXED(0),
|
DOUBLE_TO_FIXED(1), DOUBLE_TO_FIXED(0), DOUBLE_TO_FIXED(0),
|
||||||
DOUBLE_TO_FIXED(0), DOUBLE_TO_FIXED(1), DOUBLE_TO_FIXED(0),
|
DOUBLE_TO_FIXED(0), DOUBLE_TO_FIXED(1), DOUBLE_TO_FIXED(0),
|
||||||
|
@ -479,7 +482,6 @@ void SceneXrender::Window::performPaint(int mask, QRegion region, WindowPaintDat
|
||||||
}
|
}
|
||||||
transformed_shape.setRects(rects.constData(), rects.count());
|
transformed_shape.setRects(rects.constData(), rects.count());
|
||||||
}
|
}
|
||||||
#undef DOUBLE_TO_FIXED
|
|
||||||
|
|
||||||
transformed_shape.translate(mapToScreen(mask, data, QPoint(0, 0)));
|
transformed_shape.translate(mapToScreen(mask, data, QPoint(0, 0)));
|
||||||
PaintClipper pcreg(region); // clip by the region to paint
|
PaintClipper pcreg(region); // clip by the region to paint
|
||||||
|
@ -495,7 +497,8 @@ void SceneXrender::Window::performPaint(int mask, QRegion region, WindowPaintDat
|
||||||
// the window has border
|
// the window has border
|
||||||
// This solves a number of glitches and on top of this
|
// This solves a number of glitches and on top of this
|
||||||
// it optimizes painting quite a bit
|
// it optimizes painting quite a bit
|
||||||
const bool blitInTempPixmap = xRenderOffscreen() || (scaled && (wantShadow || (client && !client->noBorder()) || (deleted && !deleted->noBorder())));
|
const bool blitInTempPixmap = xRenderOffscreen() || (data.crossFadeProgress() < 1.0 && !opaque) ||
|
||||||
|
(scaled && (wantShadow || (client && !client->noBorder()) || (deleted && !deleted->noBorder())));
|
||||||
|
|
||||||
xcb_render_picture_t renderTarget = buffer;
|
xcb_render_picture_t renderTarget = buffer;
|
||||||
if (blitInTempPixmap) {
|
if (blitInTempPixmap) {
|
||||||
|
@ -630,7 +633,38 @@ xcb_render_composite(connection(), XCB_RENDER_PICT_OP_OVER, m_xrenderShadow->pic
|
||||||
if (!opaque) {
|
if (!opaque) {
|
||||||
clientAlpha = xRenderBlendPicture(data.opacity());
|
clientAlpha = xRenderBlendPicture(data.opacity());
|
||||||
}
|
}
|
||||||
xcb_render_composite(connection(), clientRenderOp, pic, clientAlpha, renderTarget, cr.x(), cr.y(), 0, 0, dr.x(), dr.y(), dr.width(), dr.height());
|
xcb_render_composite(connection(), clientRenderOp, pic, clientAlpha, renderTarget,
|
||||||
|
cr.x(), cr.y(), 0, 0, dr.x(), dr.y(), dr.width(), dr.height());
|
||||||
|
if (data.crossFadeProgress() < 1.0 && data.crossFadeProgress() > 0.0) {
|
||||||
|
XRenderWindowPixmap *previous = previousWindowPixmap<XRenderWindowPixmap>();
|
||||||
|
if (previous && previous != pixmap) {
|
||||||
|
static XRenderPicture cFadeAlpha(XCB_RENDER_PICTURE_NONE);
|
||||||
|
static xcb_render_color_t cFadeColor = {0, 0, 0, 0};
|
||||||
|
cFadeColor.alpha = uint16_t((1.0 - data.crossFadeProgress()) * 0xffff);
|
||||||
|
if (cFadeAlpha == XCB_RENDER_PICTURE_NONE) {
|
||||||
|
cFadeAlpha = xRenderFill(cFadeColor);
|
||||||
|
} else {
|
||||||
|
xcb_rectangle_t rect = {0, 0, 1, 1};
|
||||||
|
xcb_render_fill_rectangles(connection(), XCB_RENDER_PICT_OP_SRC, cFadeAlpha, cFadeColor , 1, &rect);
|
||||||
|
}
|
||||||
|
if (previous->size() != pixmap->size()) {
|
||||||
|
xcb_render_transform_t xform2 = {
|
||||||
|
DOUBLE_TO_FIXED(FIXED_TO_DOUBLE(xform.matrix11) * previous->size().width() / pixmap->size().width()), DOUBLE_TO_FIXED(0), DOUBLE_TO_FIXED(0),
|
||||||
|
DOUBLE_TO_FIXED(0), DOUBLE_TO_FIXED(FIXED_TO_DOUBLE(xform.matrix22) * previous->size().height() / pixmap->size().height()), DOUBLE_TO_FIXED(0),
|
||||||
|
DOUBLE_TO_FIXED(0), DOUBLE_TO_FIXED(0), DOUBLE_TO_FIXED(1)
|
||||||
|
};
|
||||||
|
xcb_render_set_picture_transform(connection(), previous->picture(), xform2);
|
||||||
|
}
|
||||||
|
|
||||||
|
xcb_render_composite(connection(), opaque ? XCB_RENDER_PICT_OP_OVER : XCB_RENDER_PICT_OP_ATOP,
|
||||||
|
previous->picture(), cFadeAlpha, renderTarget,
|
||||||
|
cr.x(), cr.y(), 0, 0, dr.x(), dr.y(), dr.width(), dr.height());
|
||||||
|
|
||||||
|
if (previous->size() != pixmap->size()) {
|
||||||
|
xcb_render_set_picture_transform(connection(), previous->picture(), identity);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
if (!opaque)
|
if (!opaque)
|
||||||
transformed_shape = QRegion();
|
transformed_shape = QRegion();
|
||||||
}
|
}
|
||||||
|
@ -926,7 +960,7 @@ void SceneXrender::EffectFrame::renderUnstyled(xcb_render_picture_t pict, const
|
||||||
|
|
||||||
qreal x = roundness;//we start at angle = 0
|
qreal x = roundness;//we start at angle = 0
|
||||||
qreal y = 0;
|
qreal y = 0;
|
||||||
#define DOUBLE_TO_FIXED(d) ((xcb_render_fixed_t) ((d) * 65536))
|
|
||||||
QVector<xcb_render_pointfix_t> points;
|
QVector<xcb_render_pointfix_t> points;
|
||||||
xcb_render_pointfix_t point;
|
xcb_render_pointfix_t point;
|
||||||
point.x = DOUBLE_TO_FIXED(roundness);
|
point.x = DOUBLE_TO_FIXED(roundness);
|
||||||
|
@ -944,7 +978,6 @@ void SceneXrender::EffectFrame::renderUnstyled(xcb_render_picture_t pict, const
|
||||||
XRenderPicture fill = xRenderFill(Qt::black);
|
XRenderPicture fill = xRenderFill(Qt::black);
|
||||||
xcb_render_tri_fan(connection(), XCB_RENDER_PICT_OP_OVER, fill, *s_effectFrameCircle,
|
xcb_render_tri_fan(connection(), XCB_RENDER_PICT_OP_OVER, fill, *s_effectFrameCircle,
|
||||||
0, 0, 0, points.count(), points.constData());
|
0, 0, 0, points.count(), points.constData());
|
||||||
#undef DOUBLE_TO_FIXED
|
|
||||||
}
|
}
|
||||||
// TODO: merge alpha mask with SceneXrender::Window::alphaMask
|
// TODO: merge alpha mask with SceneXrender::Window::alphaMask
|
||||||
// alpha mask
|
// alpha mask
|
||||||
|
@ -1096,5 +1129,8 @@ xcb_render_picture_t SceneXRenderShadow::picture(Shadow::ShadowElements element)
|
||||||
return *m_pictures[element];
|
return *m_pictures[element];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#undef DOUBLE_TO_FIXED
|
||||||
|
#undef FIXED_TO_DOUBLE
|
||||||
|
|
||||||
} // namespace
|
} // namespace
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in a new issue