🔧 Do not apply edge masks on full-screen windows
This commit is contained in:
@@ -20,13 +20,14 @@
|
|||||||
|
|
||||||
// Each shader can access these standard input values:
|
// Each shader can access these standard input values:
|
||||||
|
|
||||||
// vec2 iTexCoord: Texture coordinates for retrieving the window input color.
|
// vec2 iTexCoord: Texture coordinates for retrieving the window input color.
|
||||||
// bool uForOpening: True if a window-open animation is ongoing, false otherwise.
|
// bool uIsFullscreen: True if the window is maximized or in fullscreen mode.
|
||||||
// float uProgress: A value which transitions from 0 to 1 during the animation.
|
// bool uForOpening: True if a window-open animation is ongoing, false otherwise.
|
||||||
// float uDuration: The duration of the current animation in seconds.
|
// float uProgress: A value which transitions from 0 to 1 during the animation.
|
||||||
// vec2 uSize: The size of uTexture in pixels.
|
// float uDuration: The duration of the current animation in seconds.
|
||||||
// float uPadding: The empty area around the actual window (e.g. where the shadow
|
// vec2 uSize: The size of uTexture in pixels.
|
||||||
// is drawn). For now, this will only be set on GNOME.
|
// float uPadding: The empty area around the actual window (e.g. where the shadow
|
||||||
|
// is drawn). For now, this will only be set on GNOME.
|
||||||
|
|
||||||
// Furthermore, there are two global methods for reading the window input color and
|
// Furthermore, there are two global methods for reading the window input color and
|
||||||
// setting the shader output color. Both methods assume straight alpha:
|
// setting the shader output color. Both methods assume straight alpha:
|
||||||
@@ -35,6 +36,7 @@
|
|||||||
// void setOutputColor(vec4 outColor)
|
// void setOutputColor(vec4 outColor)
|
||||||
|
|
||||||
uniform bool uForOpening;
|
uniform bool uForOpening;
|
||||||
|
uniform bool uIsFullscreen;
|
||||||
uniform float uProgress;
|
uniform float uProgress;
|
||||||
uniform float uDuration;
|
uniform float uDuration;
|
||||||
|
|
||||||
@@ -168,14 +170,18 @@ float easeOutBack(float x, float e) {
|
|||||||
// --------------------------------------------------------------------- edge mask helpers
|
// --------------------------------------------------------------------- edge mask helpers
|
||||||
|
|
||||||
// This method returns a mask which smoothly transitions towards zero when approaching
|
// This method returns a mask which smoothly transitions towards zero when approaching
|
||||||
// the window's borders. There is a variant which takes the transition area width in
|
// the window's borders. If the window is currently maximized or in fullscreen mode, this
|
||||||
|
// will return 1.0 everywhere. There is a variant which takes the transition area width in
|
||||||
// pixels and one which takes this as a percentage.
|
// pixels and one which takes this as a percentage.
|
||||||
float getEdgeMask(vec2 uv, vec2 maxUV, float fadeWidth) {
|
float getEdgeMask(vec2 uv, vec2 maxUV, float fadeWidth) {
|
||||||
float mask = 1.0;
|
float mask = 1.0;
|
||||||
mask *= smoothstep(0.0, 1.0, clamp(uv.x / fadeWidth, 0.0, 1.0));
|
|
||||||
mask *= smoothstep(0.0, 1.0, clamp(uv.y / fadeWidth, 0.0, 1.0));
|
if (!uIsFullscreen) {
|
||||||
mask *= smoothstep(0.0, 1.0, clamp((maxUV.x - uv.x) / fadeWidth, 0.0, 1.0));
|
mask *= smoothstep(0.0, 1.0, clamp(uv.x / fadeWidth, 0.0, 1.0));
|
||||||
mask *= smoothstep(0.0, 1.0, clamp((maxUV.y - uv.y) / fadeWidth, 0.0, 1.0));
|
mask *= smoothstep(0.0, 1.0, clamp(uv.y / fadeWidth, 0.0, 1.0));
|
||||||
|
mask *= smoothstep(0.0, 1.0, clamp((maxUV.x - uv.x) / fadeWidth, 0.0, 1.0));
|
||||||
|
mask *= smoothstep(0.0, 1.0, clamp((maxUV.y - uv.y) / fadeWidth, 0.0, 1.0));
|
||||||
|
}
|
||||||
|
|
||||||
return mask;
|
return mask;
|
||||||
}
|
}
|
||||||
|
|||||||
+10
-5
@@ -75,11 +75,12 @@ var Shader = GObject.registerClass(
|
|||||||
this._time = 0;
|
this._time = 0;
|
||||||
|
|
||||||
// Store standard uniform locations.
|
// Store standard uniform locations.
|
||||||
this._uForOpening = this.get_uniform_location('uForOpening');
|
this._uForOpening = this.get_uniform_location('uForOpening');
|
||||||
this._uProgress = this.get_uniform_location('uProgress');
|
this._uIsFullscreen = this.get_uniform_location('uIsFullscreen');
|
||||||
this._uDuration = this.get_uniform_location('uDuration');
|
this._uProgress = this.get_uniform_location('uProgress');
|
||||||
this._uSize = this.get_uniform_location('uSize');
|
this._uDuration = this.get_uniform_location('uDuration');
|
||||||
this._uPadding = this.get_uniform_location('uPadding');
|
this._uSize = this.get_uniform_location('uSize');
|
||||||
|
this._uPadding = this.get_uniform_location('uPadding');
|
||||||
|
|
||||||
// Create a timeline to drive the animation.
|
// Create a timeline to drive the animation.
|
||||||
this._timeline = new Clutter.Timeline();
|
this._timeline = new Clutter.Timeline();
|
||||||
@@ -124,9 +125,13 @@ var Shader = GObject.registerClass(
|
|||||||
// This is not necessarily symmetric, but I haven't figured out a way to
|
// This is not necessarily symmetric, but I haven't figured out a way to
|
||||||
// get the actual values...
|
// get the actual values...
|
||||||
const padding = (actor.width - actor.meta_window.get_frame_rect().width) / 2;
|
const padding = (actor.width - actor.meta_window.get_frame_rect().width) / 2;
|
||||||
|
const isFullscreen =
|
||||||
|
actor.meta_window.get_maximized() === Meta.MaximizeFlags.BOTH ||
|
||||||
|
actor.meta_window.fullscreen;
|
||||||
|
|
||||||
this.set_uniform_float(this._uPadding, 1, [padding]);
|
this.set_uniform_float(this._uPadding, 1, [padding]);
|
||||||
this.set_uniform_float(this._uForOpening, 1, [forOpening]);
|
this.set_uniform_float(this._uForOpening, 1, [forOpening]);
|
||||||
|
this.set_uniform_float(this._uIsFullscreen, 1, [isFullscreen]);
|
||||||
this.set_uniform_float(this._uDuration, 1, [duration * 0.001]);
|
this.set_uniform_float(this._uDuration, 1, [duration * 0.001]);
|
||||||
this.set_uniform_float(this._uSize, 2, [actor.width, actor.height]);
|
this.set_uniform_float(this._uSize, 2, [actor.width, actor.height]);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user