summaryrefslogtreecommitdiff
path: root/raveos-gnome-theme/theme-data/extensions/installed/burn-my-windows@schneegans.github.com/src/ShaderFactory.js
diff options
context:
space:
mode:
authorNippy <nippy@rp1.hu>2026-06-01 18:57:29 +0200
committerNippy <nippy@rp1.hu>2026-06-01 18:57:29 +0200
commit2e5a7d93476c0819b5a23f5740e4c843eaedc73a (patch)
tree84279c63b84126eb8f6d9d94a42c44aabbe22336 /raveos-gnome-theme/theme-data/extensions/installed/burn-my-windows@schneegans.github.com/src/ShaderFactory.js
parente1f0fac166056bb106284be4a3fec0c558525927 (diff)
downloadRaveOS-PKGBUILD-2e5a7d93476c0819b5a23f5740e4c843eaedc73a.tar.gz
RaveOS-PKGBUILD-2e5a7d93476c0819b5a23f5740e4c843eaedc73a.zip
Raveos gnome update
Diffstat (limited to 'raveos-gnome-theme/theme-data/extensions/installed/burn-my-windows@schneegans.github.com/src/ShaderFactory.js')
-rw-r--r--raveos-gnome-theme/theme-data/extensions/installed/burn-my-windows@schneegans.github.com/src/ShaderFactory.js94
1 files changed, 94 insertions, 0 deletions
diff --git a/raveos-gnome-theme/theme-data/extensions/installed/burn-my-windows@schneegans.github.com/src/ShaderFactory.js b/raveos-gnome-theme/theme-data/extensions/installed/burn-my-windows@schneegans.github.com/src/ShaderFactory.js
new file mode 100644
index 0000000..6056262
--- /dev/null
+++ b/raveos-gnome-theme/theme-data/extensions/installed/burn-my-windows@schneegans.github.com/src/ShaderFactory.js
@@ -0,0 +1,94 @@
+//////////////////////////////////////////////////////////////////////////////////////////
+// ) ( //
+// ( /( ( ( ) ( ( ( ( )\ ) ( ( //
+// )\()) ))\ )( ( ( )\ ) )\))( )\ ( (()/( ( )\))( ( //
+// ((_)\ /((_|()\ )\ ) )\ '(()/( ((_)()((_) )\ ) ((_)))\((_)()\ )\ //
+// | |(_|_))( ((_)_(_/( _((_)) )(_)) _(()((_|_)_(_/( _| |((_)(()((_|(_) //
+// | '_ \ || | '_| ' \)) | ' \()| || | \ V V / | ' \)) _` / _ \ V V (_-< //
+// |_.__/\_,_|_| |_||_| |_|_|_| \_, | \_/\_/|_|_||_|\__,_\___/\_/\_//__/ //
+// |__/ //
+//////////////////////////////////////////////////////////////////////////////////////////
+
+// SPDX-FileCopyrightText: Simon Schneegans <code@simonschneegans.de>
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+'use strict';
+
+import GObject from 'gi://GObject';
+
+import {Shader} from './Shader.js';
+
+//////////////////////////////////////////////////////////////////////////////////////////
+// Each effect of Burn-My-Windows owns an instance of this class. It is used to create //
+// shaders whenever a new one is required. It tries to re-use old shaders as much as //
+// possible in order to avoid memory leaks. //
+//////////////////////////////////////////////////////////////////////////////////////////
+
+export default class ShaderFactory {
+
+ // Creates a new ShaderFactory. Requires the nick of the effect and a callback function
+ // which will be called whenever a new shader is created.
+ constructor(nick, setupFunc) {
+ // The _freeShaders array contains previously created shaders which are not currently
+ // in use.
+ this._freeShaders = [];
+
+ // The nick of the effect is required when creating new shaders as it's part of the
+ // GLSL source code file name.
+ this._nick = nick;
+
+ // Store the setup callback.
+ this._setupFunc = setupFunc;
+ }
+
+ // ---------------------------------------------------------------- API for extension.js
+
+ // This is called from extension.js whenever a window is opened or closed. It returns an
+ // instance of the shader class, trying to reuse previously created shaders. If a new
+ // shader instance is required, it calls creates a new one and calls the setupFunc
+ // thereafter.
+ getShader() {
+ let shader;
+
+ // If there are currently no free shaders, we have to create a new one.
+ if (this._freeShaders.length == 0) {
+
+ // Since Shell.GLSLEffect caches the shader source per class (not per instance), we
+ // have to derive a new shader type for each effect. The type name contains the nick
+ // of the effect to make it unique.
+ const typeName = `BurnMyWindowsShader_${this._nick}`;
+
+ // Only try to register the new type once.
+ if (GObject.type_from_name(typeName) == null) {
+ const outerThis = this;
+ GObject.registerClass({GTypeName: typeName}, class ShaderImp extends Shader {
+ // This will actually load the GLSL source code from the resources.
+ _init() {
+ super._init(outerThis._nick);
+ }
+
+ // This can be called to mark this instance to be re-usable.
+ returnToFactory() {
+ outerThis._freeShaders.push(this);
+ }
+ });
+ }
+
+ // Now create a niew instance of the newly registered shader type.
+ // GObject.Object.new is only available with newer versions of GJS.
+ if (GObject.Object.new) {
+ shader = GObject.Object.new(GObject.type_from_name(typeName), {});
+ } else {
+ shader = GObject.Object.newv(GObject.type_from_name(typeName), []);
+ }
+
+ // Call the provided setup callback.
+ this._setupFunc(shader);
+
+ } else {
+ shader = this._freeShaders.pop();
+ }
+
+ return shader;
+ }
+} \ No newline at end of file