59 lines
1.9 KiB
JavaScript
59 lines
1.9 KiB
JavaScript
|
// This code istaken from the blur-my-shell extension
|
||
|
|
||
|
//'use strict';
|
||
|
|
||
|
import Clutter from 'gi://Clutter';
|
||
|
import Shell from 'gi://Shell';
|
||
|
import GObject from 'gi://GObject';
|
||
|
import GLib from 'gi://GLib';
|
||
|
|
||
|
const SHADER_PATH = GLib.filename_from_uri(GLib.uri_resolve_relative(import.meta.url, 'glitch_effect.glsl', GLib.UriFlags.NONE))[0];
|
||
|
|
||
|
const get_shader_source = _ => {
|
||
|
try {
|
||
|
return Shell.get_file_contents_utf8_sync(SHADER_PATH);
|
||
|
} catch (e) {
|
||
|
log(`[Coverflow Alt-Tab] error loading shader from ${SHADER_PATH}: ${e}`);
|
||
|
return null;
|
||
|
}
|
||
|
};
|
||
|
|
||
|
/// New Clutter Shader Effect that simply mixes a color in, the class applies
|
||
|
/// the GLSL shader programmed into vfunc_get_static_shader_source and applies
|
||
|
/// it to an Actor.
|
||
|
///
|
||
|
/// Clutter Shader Source Code:
|
||
|
/// https://github.com/GNOME/clutter/blob/master/clutter/clutter-shader-effect.c
|
||
|
///
|
||
|
/// GJS Doc:
|
||
|
/// https://gjs-docs.gnome.org/clutter10~10_api/clutter.shadereffect
|
||
|
export const GlitchEffect = new GObject.registerClass({
|
||
|
GTypeName: "CoverflowAltTabGlitchEffect",
|
||
|
}, class CoverflowAltTabGlitchShader extends Clutter.ShaderEffect {
|
||
|
_init(params) {
|
||
|
super._init(params);
|
||
|
this._timeOffset = Math.random() * 1000000;
|
||
|
// set shader source
|
||
|
this._source = get_shader_source();
|
||
|
|
||
|
if (this._source)
|
||
|
this.set_shader_source(this._source);
|
||
|
|
||
|
this.set_enabled(true);
|
||
|
}
|
||
|
|
||
|
vfunc_paint_target(paint_node = null, paint_context = null) {
|
||
|
const time = this._timeOffset + GLib.get_monotonic_time() / GLib.USEC_PER_SEC;
|
||
|
this.set_uniform_value("time", time);
|
||
|
this.set_uniform_value("tex", 0);
|
||
|
|
||
|
if (paint_node && paint_context)
|
||
|
super.vfunc_paint_target(paint_node, paint_context);
|
||
|
else if (paint_node)
|
||
|
super.vfunc_paint_target(paint_node);
|
||
|
else
|
||
|
super.vfunc_paint_target();
|
||
|
|
||
|
this.queue_repaint();
|
||
|
}
|
||
|
});
|