2008-07-15 23:21:50 +04:00
|
|
|
/********************************************************************
|
|
|
|
KWin - the KDE window manager
|
|
|
|
This file is part of the KDE project.
|
|
|
|
|
2013-03-12 16:17:53 +04:00
|
|
|
Copyright (C) 2008 Martin Gräßlin <mgraesslin@kde.org>
|
2008-07-15 23:21:50 +04:00
|
|
|
|
|
|
|
This program is free software; you can redistribute it and/or modify
|
|
|
|
it under the terms of the GNU General Public License as published by
|
|
|
|
the Free Software Foundation; either version 2 of the License, or
|
|
|
|
(at your option) any later version.
|
|
|
|
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
GNU General Public License for more details.
|
|
|
|
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
|
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
*********************************************************************/
|
|
|
|
|
|
|
|
#ifndef KWIN_CUBE_H
|
|
|
|
#define KWIN_CUBE_H
|
|
|
|
|
|
|
|
#include <kwineffects.h>
|
|
|
|
#include <kwinglutils.h>
|
|
|
|
#include <QObject>
|
|
|
|
#include <QQueue>
|
2010-12-18 12:18:54 +03:00
|
|
|
#include <QMatrix4x4>
|
2011-03-15 00:50:05 +03:00
|
|
|
#include <QTimeLine>
|
2009-10-22 11:06:44 +04:00
|
|
|
#include "cube_inside.h"
|
|
|
|
#include "cube_proxy.h"
|
2008-07-15 23:21:50 +04:00
|
|
|
|
|
|
|
namespace KWin
|
|
|
|
{
|
|
|
|
|
|
|
|
class CubeEffect
|
2011-02-25 22:25:21 +03:00
|
|
|
: public Effect
|
2011-01-30 17:34:42 +03:00
|
|
|
{
|
2008-07-15 23:21:50 +04:00
|
|
|
Q_OBJECT
|
2012-08-11 13:24:37 +04:00
|
|
|
Q_PROPERTY(qreal cubeOpacity READ configuredCubeOpacity)
|
|
|
|
Q_PROPERTY(bool opacityDesktopOnly READ isOpacityDesktopOnly)
|
|
|
|
Q_PROPERTY(bool displayDesktopName READ isDisplayDesktopName)
|
|
|
|
Q_PROPERTY(bool reflection READ isReflection)
|
|
|
|
Q_PROPERTY(int rotationDuration READ configuredRotationDuration)
|
|
|
|
Q_PROPERTY(QColor backgroundColor READ configuredBackgroundColor)
|
|
|
|
Q_PROPERTY(QColor capColor READ configuredCapColor)
|
|
|
|
Q_PROPERTY(bool paintCaps READ isPaintCaps)
|
|
|
|
Q_PROPERTY(bool closeOnMouseRelease READ isCloseOnMouseRelease)
|
|
|
|
Q_PROPERTY(qreal zPosition READ configuredZPosition)
|
|
|
|
Q_PROPERTY(bool useForTabBox READ isUseForTabBox)
|
|
|
|
Q_PROPERTY(bool invertKeys READ isInvertKeys)
|
|
|
|
Q_PROPERTY(bool invertMouse READ isInvertMouse)
|
|
|
|
Q_PROPERTY(qreal capDeformationFactor READ configuredCapDeformationFactor)
|
|
|
|
Q_PROPERTY(bool useZOrdering READ isUseZOrdering)
|
|
|
|
Q_PROPERTY(bool texturedCaps READ isTexturedCaps)
|
|
|
|
// TODO: electric borders: not a registered type
|
2011-01-30 17:34:42 +03:00
|
|
|
public:
|
|
|
|
CubeEffect();
|
|
|
|
~CubeEffect();
|
|
|
|
virtual void reconfigure(ReconfigureFlags);
|
|
|
|
virtual void prePaintScreen(ScreenPrePaintData& data, int time);
|
|
|
|
virtual void paintScreen(int mask, QRegion region, ScreenPaintData& data);
|
|
|
|
virtual void postPaintScreen();
|
|
|
|
virtual void prePaintWindow(EffectWindow* w, WindowPrePaintData& data, int time);
|
|
|
|
virtual void paintWindow(EffectWindow* w, int mask, QRegion region, WindowPaintData& data);
|
|
|
|
virtual bool borderActivated(ElectricBorder border);
|
|
|
|
virtual void grabbedKeyboardEvent(QKeyEvent* e);
|
2013-04-24 18:51:04 +04:00
|
|
|
virtual void windowInputMouseEvent(QEvent* e);
|
2011-08-27 13:21:31 +04:00
|
|
|
virtual bool isActive() const;
|
2008-12-04 11:47:07 +03:00
|
|
|
|
2014-03-24 14:50:09 +04:00
|
|
|
int requestedEffectChainPosition() const override {
|
|
|
|
return 50;
|
|
|
|
}
|
|
|
|
|
2011-01-30 17:34:42 +03:00
|
|
|
// proxy functions
|
|
|
|
virtual void* proxy();
|
|
|
|
void registerCubeInsideEffect(CubeInsideEffect* effect);
|
|
|
|
void unregisterCubeInsideEffect(CubeInsideEffect* effect);
|
2009-10-22 11:06:44 +04:00
|
|
|
|
2011-01-30 17:34:42 +03:00
|
|
|
static bool supported();
|
2012-08-11 13:24:37 +04:00
|
|
|
|
|
|
|
// for properties
|
|
|
|
qreal configuredCubeOpacity() const {
|
|
|
|
return cubeOpacity;
|
|
|
|
}
|
|
|
|
bool isOpacityDesktopOnly() const {
|
|
|
|
return opacityDesktopOnly;
|
|
|
|
}
|
|
|
|
bool isDisplayDesktopName() const {
|
|
|
|
return displayDesktopName;
|
|
|
|
}
|
|
|
|
bool isReflection() const {
|
|
|
|
return reflection;
|
|
|
|
}
|
|
|
|
int configuredRotationDuration() const {
|
|
|
|
return rotationDuration;
|
|
|
|
}
|
|
|
|
QColor configuredBackgroundColor() const {
|
|
|
|
return backgroundColor;
|
|
|
|
}
|
|
|
|
QColor configuredCapColor() const {
|
|
|
|
return capColor;
|
|
|
|
}
|
|
|
|
bool isPaintCaps() const {
|
|
|
|
return paintCaps;
|
|
|
|
}
|
|
|
|
bool isCloseOnMouseRelease() const {
|
|
|
|
return closeOnMouseRelease;
|
|
|
|
}
|
|
|
|
qreal configuredZPosition() const {
|
|
|
|
return zPosition;
|
|
|
|
}
|
|
|
|
bool isUseForTabBox() const {
|
|
|
|
return useForTabBox;
|
|
|
|
}
|
|
|
|
bool isInvertKeys() const {
|
|
|
|
return invertKeys;
|
|
|
|
}
|
|
|
|
bool isInvertMouse() const {
|
|
|
|
return invertMouse;
|
|
|
|
}
|
|
|
|
qreal configuredCapDeformationFactor() const {
|
|
|
|
return capDeformationFactor;
|
|
|
|
}
|
|
|
|
bool isUseZOrdering() const {
|
|
|
|
return useZOrdering;
|
|
|
|
}
|
|
|
|
bool isTexturedCaps() const {
|
|
|
|
return texturedCaps;
|
|
|
|
}
|
2013-07-22 18:07:39 +04:00
|
|
|
private Q_SLOTS:
|
2011-01-30 17:34:42 +03:00
|
|
|
void toggleCube();
|
|
|
|
void toggleCylinder();
|
|
|
|
void toggleSphere();
|
|
|
|
// slots for global shortcut changed
|
|
|
|
// needed to toggle the effect
|
2013-08-14 23:13:12 +04:00
|
|
|
void globalShortcutChanged(QAction *action, const QKeySequence &seq);
|
2011-03-06 14:15:16 +03:00
|
|
|
void slotTabBoxAdded(int mode);
|
|
|
|
void slotTabBoxUpdated();
|
|
|
|
void slotTabBoxClosed();
|
2012-05-01 15:53:56 +04:00
|
|
|
void slotCubeCapLoaded();
|
|
|
|
void slotWallPaperLoaded();
|
2011-01-30 17:34:42 +03:00
|
|
|
private:
|
|
|
|
enum RotationDirection {
|
|
|
|
Left,
|
|
|
|
Right,
|
|
|
|
Upwards,
|
|
|
|
Downwards
|
|
|
|
};
|
|
|
|
enum VerticalRotationPosition {
|
|
|
|
Up,
|
|
|
|
Normal,
|
|
|
|
Down
|
|
|
|
};
|
|
|
|
enum CubeMode {
|
|
|
|
Cube,
|
|
|
|
Cylinder,
|
|
|
|
Sphere
|
|
|
|
};
|
|
|
|
void toggle(CubeMode newMode = Cube);
|
|
|
|
void paintCube(int mask, QRegion region, ScreenPaintData& data);
|
2015-11-30 13:39:04 +03:00
|
|
|
void paintCap(bool frontFirst, float zOffset, const QMatrix4x4 &projection);
|
2011-01-30 17:34:42 +03:00
|
|
|
void paintCubeCap();
|
|
|
|
void paintCylinderCap();
|
|
|
|
void paintSphereCap();
|
|
|
|
bool loadShader();
|
|
|
|
void rotateCube();
|
|
|
|
void rotateToDesktop(int desktop);
|
|
|
|
void setActive(bool active);
|
2012-05-01 15:53:56 +04:00
|
|
|
QImage loadCubeCap(const QString &capPath);
|
|
|
|
QImage loadWallPaper(const QString &file);
|
2011-01-30 17:34:42 +03:00
|
|
|
bool activated;
|
|
|
|
bool cube_painting;
|
|
|
|
bool keyboard_grab;
|
|
|
|
bool schedule_close;
|
|
|
|
QList<ElectricBorder> borderActivate;
|
|
|
|
QList<ElectricBorder> borderActivateCylinder;
|
|
|
|
QList<ElectricBorder> borderActivateSphere;
|
|
|
|
int painting_desktop;
|
|
|
|
int frontDesktop;
|
|
|
|
float cubeOpacity;
|
|
|
|
bool opacityDesktopOnly;
|
|
|
|
bool displayDesktopName;
|
|
|
|
EffectFrame* desktopNameFrame;
|
|
|
|
QFont desktopNameFont;
|
|
|
|
bool reflection;
|
|
|
|
bool rotating;
|
|
|
|
bool verticalRotating;
|
|
|
|
bool desktopChangedWhileRotating;
|
|
|
|
bool paintCaps;
|
2011-03-15 00:50:05 +03:00
|
|
|
QTimeLine timeLine;
|
|
|
|
QTimeLine verticalTimeLine;
|
2011-01-30 17:34:42 +03:00
|
|
|
RotationDirection rotationDirection;
|
|
|
|
RotationDirection verticalRotationDirection;
|
|
|
|
VerticalRotationPosition verticalPosition;
|
|
|
|
QQueue<RotationDirection> rotations;
|
|
|
|
QQueue<RotationDirection> verticalRotations;
|
|
|
|
QColor backgroundColor;
|
|
|
|
QColor capColor;
|
|
|
|
GLTexture* wallpaper;
|
|
|
|
bool texturedCaps;
|
|
|
|
GLTexture* capTexture;
|
|
|
|
float manualAngle;
|
|
|
|
float manualVerticalAngle;
|
2011-03-15 00:50:05 +03:00
|
|
|
QTimeLine::CurveShape currentShape;
|
2011-01-30 17:34:42 +03:00
|
|
|
bool start;
|
|
|
|
bool stop;
|
|
|
|
bool reflectionPainting;
|
|
|
|
int rotationDuration;
|
|
|
|
int activeScreen;
|
|
|
|
bool bottomCap;
|
|
|
|
bool closeOnMouseRelease;
|
|
|
|
float zoom;
|
|
|
|
float zPosition;
|
|
|
|
bool useForTabBox;
|
|
|
|
bool invertKeys;
|
|
|
|
bool invertMouse;
|
|
|
|
bool tabBoxMode;
|
|
|
|
bool shortcutsRegistered;
|
|
|
|
CubeMode mode;
|
|
|
|
bool useShaders;
|
|
|
|
GLShader* cylinderShader;
|
|
|
|
GLShader* sphereShader;
|
|
|
|
GLShader* m_reflectionShader;
|
|
|
|
GLShader* m_capShader;
|
|
|
|
float capDeformationFactor;
|
|
|
|
bool useZOrdering;
|
|
|
|
float zOrderingFactor;
|
|
|
|
bool useList;
|
|
|
|
// needed for reflection
|
|
|
|
float mAddedHeightCoeff1;
|
|
|
|
float mAddedHeightCoeff2;
|
2008-08-12 11:41:19 +04:00
|
|
|
|
2011-01-30 17:34:42 +03:00
|
|
|
QMatrix4x4 m_rotationMatrix;
|
|
|
|
QMatrix4x4 m_reflectionMatrix;
|
|
|
|
QMatrix4x4 m_textureMirrorMatrix;
|
2015-12-01 13:24:53 +03:00
|
|
|
QMatrix4x4 m_currentFaceMatrix;
|
2011-01-30 17:34:42 +03:00
|
|
|
GLVertexBuffer *m_cubeCapBuffer;
|
2009-03-30 15:27:57 +04:00
|
|
|
|
2011-01-30 17:34:42 +03:00
|
|
|
// Shortcuts - needed to toggle the effect
|
2013-08-14 23:13:12 +04:00
|
|
|
QList<QKeySequence> cubeShortcut;
|
|
|
|
QList<QKeySequence> cylinderShortcut;
|
|
|
|
QList<QKeySequence> sphereShortcut;
|
2009-10-22 11:06:44 +04:00
|
|
|
|
2011-01-30 17:34:42 +03:00
|
|
|
// proxy
|
|
|
|
CubeEffectProxy m_proxy;
|
|
|
|
QList< CubeInsideEffect* > m_cubeInsideEffects;
|
|
|
|
};
|
2008-07-15 23:21:50 +04:00
|
|
|
|
|
|
|
} // namespace
|
|
|
|
|
|
|
|
#endif
|