Skip to content
This repository was archived by the owner on Nov 20, 2025. It is now read-only.
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions src/blur.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -97,10 +97,12 @@ BlurEffect::BlurEffect()
m_upsamplePass.blurSizeLocation = m_upsamplePass.shader->uniformLocation("blurSize");
m_upsamplePass.opacityLocation = m_upsamplePass.shader->uniformLocation("opacity");
m_upsamplePass.edgeSizePixelsLocation = m_upsamplePass.shader->uniformLocation("edgeSizePixels");
m_upsamplePass.refractionCornerRadiusPixelsLocation = m_upsamplePass.shader->uniformLocation("refractionCornerRadiusPixels");
m_upsamplePass.refractionStrengthLocation = m_upsamplePass.shader->uniformLocation("refractionStrength");
m_upsamplePass.refractionNormalPowLocation = m_upsamplePass.shader->uniformLocation("refractionNormalPow");
m_upsamplePass.refractionRGBFringingLocation = m_upsamplePass.shader->uniformLocation("refractionRGBFringing");
m_upsamplePass.refractionTextureRepeatModeLocation = m_upsamplePass.shader->uniformLocation("refractionTextureRepeatMode");
m_upsamplePass.refractionModeLocation = m_upsamplePass.shader->uniformLocation("refractionMode");
}

m_texture.shader = ShaderManager::instance()->generateShaderFromFile(ShaderTrait::MapTexture,
Expand Down Expand Up @@ -1108,10 +1110,12 @@ void BlurEffect::blur(BlurRenderData &renderInfo, const RenderTarget &renderTarg
if (w && m_settings.refraction.refractionStrength > 0) {
m_upsamplePass.shader->setUniform(m_upsamplePass.edgeSizePixelsLocation,
std::min(m_settings.refraction.edgeSizePixels, (float)std::min(deviceBackgroundRect.width() / 2, deviceBackgroundRect.height() / 2)));
m_upsamplePass.shader->setUniform(m_upsamplePass.refractionCornerRadiusPixelsLocation, m_settings.refraction.refractionCornerRadiusPixels);
m_upsamplePass.shader->setUniform(m_upsamplePass.refractionStrengthLocation, m_settings.refraction.refractionStrength);
m_upsamplePass.shader->setUniform(m_upsamplePass.refractionNormalPowLocation, m_settings.refraction.refractionNormalPow);
m_upsamplePass.shader->setUniform(m_upsamplePass.refractionRGBFringingLocation, m_settings.refraction.refractionRGBFringing);
m_upsamplePass.shader->setUniform(m_upsamplePass.refractionTextureRepeatModeLocation, m_settings.refraction.refractionTextureRepeatMode);
m_upsamplePass.shader->setUniform(m_upsamplePass.refractionModeLocation, m_settings.refraction.refractionMode);
}

glEnable(GL_BLEND);
Expand Down
2 changes: 2 additions & 0 deletions src/blur.h
Original file line number Diff line number Diff line change
Expand Up @@ -159,10 +159,12 @@ public Q_SLOTS:
int opacityLocation;

int edgeSizePixelsLocation;
int refractionCornerRadiusPixelsLocation;
int refractionStrengthLocation;
int refractionNormalPowLocation;
int refractionRGBFringingLocation;
int refractionTextureRepeatModeLocation;
int refractionModeLocation;
} m_upsamplePass;

struct
Expand Down
6 changes: 6 additions & 0 deletions src/blur.kcfg
Original file line number Diff line number Diff line change
Expand Up @@ -91,11 +91,17 @@ class3</default>
<entry name="RefractionEdgeSize" type="Double">
<default>20.0</default>
</entry>
<entry name="RefractionCornerRadius" type="Double">
<default>8.0</default>
</entry>
<entry name="RefractionRGBFringing" type="Double">
<default>1.0</default>
</entry>
<entry name="RefractionTextureRepeatMode" type="Int">
<default>0</default>
</entry>
<entry name="RefractionMode" type="Int">
<default>0</default>
</entry>
</group>
</kcfg>
30 changes: 30 additions & 0 deletions src/kcm/blur_config.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,8 @@

#include <QFileDialog>
#include <QPushButton>
#include <QComboBox>
#include <QLabel>

namespace KWin
{
Expand All @@ -28,6 +30,34 @@ BlurEffectConfig::BlurEffectConfig(QObject *parent, const KPluginMetaData &data)
BlurConfig::instance("kwinrc");
addConfig(BlurConfig::self(), widget());

// Disable Edge Behavior when Concave mode is selected - not relevant
auto updateEdgeBehaviorEnabled = [this]() {
const bool concave = ui.kcfg_RefractionMode && ui.kcfg_RefractionMode->currentIndex() == 1;
if (ui.kcfg_RefractionTextureRepeatMode) {
ui.kcfg_RefractionTextureRepeatMode->setEnabled(!concave);
}
if (ui.labelRefractionTextureRepeatMode) {
ui.labelRefractionTextureRepeatMode->setEnabled(!concave);
}
// Corner radius is only relevant for Concave as Basic breaks with low values
if (ui.kcfg_RefractionCornerRadius) {
ui.kcfg_RefractionCornerRadius->setEnabled(concave);
}
if (ui.labelRefractionCornerRadius) {
ui.labelRefractionCornerRadius->setEnabled(concave);
}
if (ui.labelRefractionCornerRadiusSquare) {
ui.labelRefractionCornerRadiusSquare->setEnabled(concave);
}
if (ui.labelRefractionCornerRadiusRound) {
ui.labelRefractionCornerRadiusRound->setEnabled(concave);
}
};
if (ui.kcfg_RefractionMode) {
connect(ui.kcfg_RefractionMode, QOverload<int>::of(&QComboBox::currentIndexChanged), this, [updateEdgeBehaviorEnabled](int){ updateEdgeBehaviorEnabled(); });
updateEdgeBehaviorEnabled();
}

connect(ui.staticBlurImagePicker, &QPushButton::clicked, this, &BlurEffectConfig::slotStaticBlurImagePickerClicked);

QFile about(":/effects/forceblur/kcm/about.html");
Expand Down
144 changes: 127 additions & 17 deletions src/kcm/blur_config.ui
Original file line number Diff line number Diff line change
Expand Up @@ -358,11 +358,11 @@
</attribute>
<layout class="QVBoxLayout">
<item>
<widget class="QLabel" name="labelRefractionNote">
<property name="text">
<string>Refraction does not work when using static blur.</string>
</property>
</widget>
<widget class="QLabel" name="labelRefractionNote">
<property name="text">
<string>Refraction does not work when using static blur.</string>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="labelRefractionStrength">
Expand Down Expand Up @@ -402,7 +402,7 @@
<number>0</number>
</property>
<property name="maximum">
<number>20</number>
<number>30</number>
</property>
<property name="singleStep">
<number>1</number>
Expand Down Expand Up @@ -430,6 +430,47 @@
</item>
</layout>
</item>
<item>
<widget class="QLabel" name="labelRefractionMode">
<property name="text">
<string>Refraction Mode:</string>
</property>
</widget>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayoutRefractionMode">
<item>
<spacer name="horizontalSpacerRefractionMode">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeType">
<enum>QSizePolicy::Fixed</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QComboBox" name="kcfg_RefractionMode">
<item>
<property name="text">
<string>Basic (Bulge)</string>
</property>
</item>
<item>
<property name="text">
<string>Concave (Lens)</string>
</property>
</item>
</widget>
</item>
</layout>
</item>
<item>
<widget class="QLabel" name="labelRefractionEdgeSize">
<property name="text">
Expand Down Expand Up @@ -468,7 +509,7 @@
<number>0</number>
</property>
<property name="maximum">
<number>20</number>
<number>30</number>
</property>
<property name="singleStep">
<number>1</number>
Expand Down Expand Up @@ -562,6 +603,72 @@
</item>
</layout>
</item>
<item>
<widget class="QLabel" name="labelRefractionCornerRadius">
<property name="text">
<string>Refraction Corner Radius:</string>
</property>
</widget>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayoutCornerRadius">
<item>
<spacer name="horizontalSpacerCornerRadius">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeType">
<enum>QSizePolicy::Fixed</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QLabel" name="labelRefractionCornerRadiusSquare">
<property name="text">
<string>Square</string>
</property>
</widget>
</item>
<item>
<widget class="QSlider" name="kcfg_RefractionCornerRadius">
<property name="minimum">
<number>0</number>
</property>
<property name="maximum">
<number>200</number>
</property>
<property name="singleStep">
<number>1</number>
</property>
<property name="pageStep">
<number>7</number>
</property>
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="tickPosition">
<enum>QSlider::TicksBelow</enum>
</property>
<property name="tickInterval">
<number>7</number>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="labelRefractionCornerRadiusRound">
<property name="text">
<string>Round</string>
</property>
</widget>
</item>
</layout>
</item>
<item>
<widget class="QLabel" name="labelRefractionRGBFringing">
<property name="text">
Expand Down Expand Up @@ -600,7 +707,7 @@
<number>0</number>
</property>
<property name="maximum">
<number>20</number>
<number>30</number>
</property>
<property name="singleStep">
<number>1</number>
Expand Down Expand Up @@ -655,6 +762,9 @@
</item>
<item>
<widget class="QComboBox" name="kcfg_RefractionTextureRepeatMode">
<property name="enabled">
<bool>true</bool>
</property>
<item>
<property name="text">
<string>Clamp (extend edge pixels)</string>
Expand All @@ -671,15 +781,15 @@
</item>
<item>
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>0</width>
<height>0</height>
</size>
</property>
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>0</width>
<height>0</height>
</size>
</property>
</spacer>
</item>
</layout>
Expand Down
15 changes: 13 additions & 2 deletions src/settings.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -66,10 +66,21 @@ void BlurSettings::read()
staticBlur.blurCustomImage = BlurConfig::fakeBlurCustomImageBlur();

refraction.edgeSizePixels = BlurConfig::refractionEdgeSize() * 10;
refraction.refractionStrength = BlurConfig::refractionStrength() / 20.0;

{
const double maxCorner = 200.0;
const double steps = 30.0;
const double stepSize = maxCorner / steps; // ≈6.6667
const double raw = BlurConfig::refractionCornerRadius();
const double snapped = std::round(raw / stepSize) * stepSize;
refraction.refractionCornerRadiusPixels = snapped;
}

refraction.refractionStrength = BlurConfig::refractionStrength() / 30.0;
refraction.refractionNormalPow = BlurConfig::refractionNormalPow() / 2.0;
refraction.refractionRGBFringing = BlurConfig::refractionRGBFringing() / 20.0; // Scale to 0-1 range
refraction.refractionRGBFringing = BlurConfig::refractionRGBFringing() / 30.0;
refraction.refractionTextureRepeatMode = BlurConfig::refractionTextureRepeatMode();
refraction.refractionMode = BlurConfig::refractionMode();
}

}
2 changes: 2 additions & 0 deletions src/settings.h
Original file line number Diff line number Diff line change
Expand Up @@ -61,10 +61,12 @@ struct StaticBlurSettings
struct RefractionSettings
{
float edgeSizePixels;
float refractionCornerRadiusPixels;
float refractionStrength;
float refractionNormalPow;
float refractionRGBFringing;
int refractionTextureRepeatMode;
int refractionMode; // 0: Basic (bulge), 1: Concave (lens)
};

class BlurSettings
Expand Down
Loading