windowManager: Incorporate invisible borders into window dimming effect
Without this, the dim "fade" will start at the top of the untrimmed actor. With a large enough draggable_border_width setting, this will show no fade at all. https://bugzilla.gnome.org/show_bug.cgi?id=659302
This commit is contained in:
parent
82eccb566c
commit
127ef8383b
@ -1,5 +1,6 @@
|
|||||||
#version 110
|
#version 110
|
||||||
uniform sampler2D tex;
|
uniform sampler2D tex;
|
||||||
|
uniform float startY;
|
||||||
uniform float fraction;
|
uniform float fraction;
|
||||||
uniform float height;
|
uniform float height;
|
||||||
const float c = -0.2;
|
const float c = -0.2;
|
||||||
@ -18,10 +19,11 @@ void main()
|
|||||||
// To reduce contrast, blend with a mid gray
|
// To reduce contrast, blend with a mid gray
|
||||||
cogl_color_out = color * contrast - off * c;
|
cogl_color_out = color * contrast - off * c;
|
||||||
|
|
||||||
// We only fully dim at a distance of BORDER_MAX_HEIGHT from the edge and
|
// We only fully dim at a distance of BORDER_MAX_HEIGHT from startY and
|
||||||
// when the fraction is 1.0. For other locations and fractions we linearly
|
// when the fraction is 1.0. For other locations and fractions we linearly
|
||||||
// interpolate back to the original undimmed color.
|
// interpolate back to the original undimmed color, so the top of the window
|
||||||
cogl_color_out = color + (cogl_color_out - color) * min(y / border_max_height, 1.0);
|
// is at full color.
|
||||||
|
cogl_color_out = color + (cogl_color_out - color) * max(min((y - startY) / border_max_height, 1.0), 0.0);
|
||||||
cogl_color_out = color + (cogl_color_out - color) * fraction;
|
cogl_color_out = color + (cogl_color_out - color) * fraction;
|
||||||
|
|
||||||
cogl_color_out *= color.a;
|
cogl_color_out *= color.a;
|
||||||
|
@ -25,15 +25,22 @@ function getDimShaderSource() {
|
|||||||
return dimShader;
|
return dimShader;
|
||||||
}
|
}
|
||||||
|
|
||||||
function WindowDimmer(actor) {
|
function getTopInvisibleBorder(metaWindow) {
|
||||||
this._init(actor);
|
let outerRect = metaWindow.get_outer_rect();
|
||||||
|
let inputRect = metaWindow.get_input_rect();
|
||||||
|
return outerRect.y - inputRect.y;
|
||||||
|
}
|
||||||
|
|
||||||
|
function WindowDimmer(actor, window) {
|
||||||
|
this._init(actor, window);
|
||||||
}
|
}
|
||||||
|
|
||||||
WindowDimmer.prototype = {
|
WindowDimmer.prototype = {
|
||||||
_init: function(actor) {
|
_init: function(actor, window) {
|
||||||
this.effect = new Clutter.ShaderEffect({ shader_type: Clutter.ShaderType.FRAGMENT_SHADER });
|
this.effect = new Clutter.ShaderEffect({ shader_type: Clutter.ShaderType.FRAGMENT_SHADER });
|
||||||
this.effect.set_shader_source(getDimShaderSource());
|
this.effect.set_shader_source(getDimShaderSource());
|
||||||
|
|
||||||
|
this.window = window;
|
||||||
this.actor = actor;
|
this.actor = actor;
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -45,6 +52,7 @@ WindowDimmer.prototype = {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (fraction > 0.01) {
|
if (fraction > 0.01) {
|
||||||
|
Shell.shader_effect_set_double_uniform(this.effect, 'startY', getTopInvisibleBorder(this.window));
|
||||||
Shell.shader_effect_set_double_uniform(this.effect, 'height', this.actor.get_height());
|
Shell.shader_effect_set_double_uniform(this.effect, 'height', this.actor.get_height());
|
||||||
Shell.shader_effect_set_double_uniform(this.effect, 'fraction', fraction);
|
Shell.shader_effect_set_double_uniform(this.effect, 'fraction', fraction);
|
||||||
|
|
||||||
@ -63,9 +71,9 @@ WindowDimmer.prototype = {
|
|||||||
_dimFraction: 0.0
|
_dimFraction: 0.0
|
||||||
};
|
};
|
||||||
|
|
||||||
function getWindowDimmer(texture) {
|
function getWindowDimmer(texture, window) {
|
||||||
if (!texture._windowDimmer)
|
if (!texture._windowDimmer)
|
||||||
texture._windowDimmer = new WindowDimmer(texture);
|
texture._windowDimmer = new WindowDimmer(texture, window);
|
||||||
|
|
||||||
return texture._windowDimmer;
|
return texture._windowDimmer;
|
||||||
}
|
}
|
||||||
@ -264,13 +272,13 @@ WindowManager.prototype = {
|
|||||||
return;
|
return;
|
||||||
let texture = actor.get_texture();
|
let texture = actor.get_texture();
|
||||||
if (animate)
|
if (animate)
|
||||||
Tweener.addTween(getWindowDimmer(texture),
|
Tweener.addTween(getWindowDimmer(texture, window),
|
||||||
{ dimFraction: 1.0,
|
{ dimFraction: 1.0,
|
||||||
time: DIM_TIME,
|
time: DIM_TIME,
|
||||||
transition: 'linear'
|
transition: 'linear'
|
||||||
});
|
});
|
||||||
else
|
else
|
||||||
getWindowDimmer(texture).dimFraction = 1.0;
|
getWindowDimmer(texture, window).dimFraction = 1.0;
|
||||||
},
|
},
|
||||||
|
|
||||||
_undimWindow: function(window, animate) {
|
_undimWindow: function(window, animate) {
|
||||||
@ -279,13 +287,13 @@ WindowManager.prototype = {
|
|||||||
return;
|
return;
|
||||||
let texture = actor.get_texture();
|
let texture = actor.get_texture();
|
||||||
if (animate)
|
if (animate)
|
||||||
Tweener.addTween(getWindowDimmer(texture),
|
Tweener.addTween(getWindowDimmer(texture, window),
|
||||||
{ dimFraction: 0.0,
|
{ dimFraction: 0.0,
|
||||||
time: UNDIM_TIME,
|
time: UNDIM_TIME,
|
||||||
transition: 'linear'
|
transition: 'linear'
|
||||||
});
|
});
|
||||||
else
|
else
|
||||||
getWindowDimmer(texture).dimFraction = 0.0;
|
getWindowDimmer(texture, window).dimFraction = 0.0;
|
||||||
},
|
},
|
||||||
|
|
||||||
_mapWindow : function(shellwm, actor) {
|
_mapWindow : function(shellwm, actor) {
|
||||||
|
Loading…
Reference in New Issue
Block a user