Working cursor disable and paint, still need to pass the texture to the 3d view for rendering

This commit is contained in:
wheaney 2025-07-04 14:17:11 -07:00
parent ea40421372
commit 757eaed57f
2 changed files with 106 additions and 0 deletions

View File

@ -1,6 +1,9 @@
#include "breezydesktopeffect.h"
#include "effect/effect.h"
#include "effect/effecthandler.h"
#include "opengl/glutils.h"
#include "core/rendertarget.h"
#include "core/renderviewport.h"
#include <QAction>
#include <QFile>
@ -13,6 +16,8 @@
Q_LOGGING_CATEGORY(KWIN_XR, "kwin.xr")
using namespace std::chrono_literals;
namespace KWin
{
@ -88,6 +93,8 @@ void BreezyDesktopEffect::activate()
// TODO - move away from QuickSceneEffect
effects->ungrabKeyboard();
effects->stopMouseInterception(this);
hideCursor();
}
void BreezyDesktopEffect::deactivate()
@ -104,6 +111,7 @@ void BreezyDesktopEffect::deactivate()
}
m_shutdownTimer->start(animationDuration());
showCursor();
}
void BreezyDesktopEffect::realDeactivate()
@ -231,4 +239,89 @@ void BreezyDesktopEffect::updateXrRotation() {
}
}
// show and hide cursor logic pulled from ZoomEffect
GLTexture *BreezyDesktopEffect::ensureCursorTexture()
{
if (!m_cursorTexture || m_cursorTextureDirty) {
m_cursorTexture.reset();
m_cursorTextureDirty = false;
const auto cursor = effects->cursorImage();
if (!cursor.image().isNull()) {
m_cursorTexture = GLTexture::upload(cursor.image());
if (!m_cursorTexture) {
return nullptr;
}
m_cursorTexture->setWrapMode(GL_CLAMP_TO_EDGE);
}
}
return m_cursorTexture.get();
}
void BreezyDesktopEffect::markCursorTextureDirty()
{
m_cursorTextureDirty = true;
}
void BreezyDesktopEffect::showCursor()
{
if (m_isMouseHidden) {
disconnect(effects, &EffectsHandler::cursorShapeChanged, this, &BreezyDesktopEffect::markCursorTextureDirty);
// show the previously hidden mouse-pointer again and free the loaded texture/picture.
effects->showCursor();
m_cursorTexture.reset();
m_isMouseHidden = false;
}
}
void BreezyDesktopEffect::hideCursor()
{
qCCritical(KWIN_XR) << "\t\t\tBreezy - hide cursor";
if (!m_isMouseHidden) {
qCCritical(KWIN_XR) << "\t\t\tBreezy - hide cursor - ensure cursor texture";
// try to load the cursor-theme into a OpenGL texture and if successful then hide the mouse-pointer
GLTexture *texture = nullptr;
if (effects->isOpenGLCompositing()) {
qCCritical(KWIN_XR) << "\t\t\tBreezy - hide cursor - OpenGL compositing";
texture = ensureCursorTexture();
}
if (texture) {
qCCritical(KWIN_XR) << "\t\t\tBreezy - hide cursor - hiding cursor";
effects->hideCursor();
connect(effects, &EffectsHandler::cursorShapeChanged, this, &BreezyDesktopEffect::markCursorTextureDirty);
m_isMouseHidden = true;
}
}
}
void BreezyDesktopEffect::paintScreen(const RenderTarget &renderTarget, const RenderViewport &viewport, int mask, const QRegion &region, Output *screen)
{
GLTexture *cursorTexture = ensureCursorTexture();
if (cursorTexture) {
const auto cursor = effects->cursorImage();
QSizeF cursorSize = QSizeF(cursor.image().size()) / cursor.image().devicePixelRatio();
// Ensure cursor size doesn't exceed texture dimensions
const QSize textureSize = cursorTexture->size();
cursorSize = cursorSize.boundedTo(QSizeF(textureSize));
const QPointF p = (effects->cursorPos() - cursor.hotSpot());
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
auto s = ShaderManager::instance()->pushShader(ShaderTrait::MapTexture | ShaderTrait::TransformColorspace);
s->setColorspaceUniforms(ColorDescription::sRGB, renderTarget.colorDescription(), RenderingIntent::Perceptual);
QMatrix4x4 mvp = viewport.projectionMatrix();
mvp.translate(p.x(), p.y());
s->setUniform(GLShader::Mat4Uniform::ModelViewProjectionMatrix, mvp);
cursorTexture->render(cursorSize);
ShaderManager::instance()->popShader();
glDisable(GL_BLEND);
}
QuickSceneEffect::paintScreen(renderTarget, viewport, mask, region, screen);
}
} // namespace KWin
#include "moc_breezydesktopeffect.cpp"

View File

@ -8,6 +8,8 @@
namespace KWin
{
class GLTexture;
class GLShader;
class BreezyDesktopEffect : public QuickSceneEffect
{
@ -31,6 +33,8 @@ namespace KWin
BreezyDesktopEffect();
void paintScreen(const RenderTarget &renderTarget, const RenderViewport &viewport, int mask, const QRegion &region, Output *screen) override;
int requestedEffectChainPosition() const override;
int animationDuration() const;
@ -41,6 +45,11 @@ namespace KWin
BackgroundMode backgroundMode() const;
QColor backgroundColor() const;
void showCursor();
void hideCursor();
GLTexture *ensureCursorTexture();
void markCursorTextureDirty();
QQuaternion xrRotation() const;
public Q_SLOTS:
@ -71,6 +80,10 @@ namespace KWin
QList<QKeySequence> m_toggleShortcut;
QList<ElectricBorder> m_borderActivate;
QList<ElectricBorder> m_touchBorderActivate;
std::unique_ptr<GLTexture> m_cursorTexture;
bool m_cursorTextureDirty = false;
bool m_isMouseHidden = false;
QQuaternion m_xrRotation;
QTimer *m_xrRotationTimer = nullptr;
};