diff options
| author | AlexanderCurl <alexc@alexc.hu> | 2026-04-18 17:46:06 +0100 |
|---|---|---|
| committer | AlexanderCurl <alexc@alexc.hu> | 2026-04-18 17:46:06 +0100 |
| commit | 70ca3fef77ee8bdc6e3ac28589a6fa08c024cc69 (patch) | |
| tree | ab1123d4067c1b086dd6faa7ee4ea643236b565a /raveos-theme/gnome/theme-data/extensions/installed/blur-my-shell@aunetx/components/applications.js | |
| parent | 5d94c0a7d44a2255b81815a52a7056a94a39842d (diff) | |
| download | RaveOS-PKGBUILD-70ca3fef77ee8bdc6e3ac28589a6fa08c024cc69.tar.gz RaveOS-PKGBUILD-70ca3fef77ee8bdc6e3ac28589a6fa08c024cc69.zip | |
Replaced file structures for themes in the correct format
Diffstat (limited to 'raveos-theme/gnome/theme-data/extensions/installed/blur-my-shell@aunetx/components/applications.js')
| -rw-r--r-- | raveos-theme/gnome/theme-data/extensions/installed/blur-my-shell@aunetx/components/applications.js | 614 |
1 files changed, 0 insertions, 614 deletions
diff --git a/raveos-theme/gnome/theme-data/extensions/installed/blur-my-shell@aunetx/components/applications.js b/raveos-theme/gnome/theme-data/extensions/installed/blur-my-shell@aunetx/components/applications.js deleted file mode 100644 index e783046..0000000 --- a/raveos-theme/gnome/theme-data/extensions/installed/blur-my-shell@aunetx/components/applications.js +++ /dev/null @@ -1,614 +0,0 @@ -import Meta from 'gi://Meta'; -import Gio from 'gi://Gio'; -import * as Main from 'resource:///org/gnome/shell/ui/main.js'; -import * as Config from 'resource:///org/gnome/shell/misc/config.js'; - -import { ApplicationsService } from '../dbus/services.js'; -import { PaintSignals } from '../conveniences/paint_signals.js'; -import { DummyPipeline } from '../conveniences/dummy_pipeline.js'; -import { Pipeline } from '../conveniences/pipeline.js'; - - -/// Converts a wildcard pattern to a RegExp object. -/// Supports * (matches any sequence) and ? (matches any single character). -/// Matching is case-insensitive. -/// -/// @param {string} pattern - The wildcard pattern (e.g., "Firefox*", "*Code*") -/// @returns {RegExp} The compiled regex pattern -function wildcardToRegex(pattern) { - // Escape special regex characters except * and ? - const escaped = pattern.replace(/[.+^${}()|[\]\\]/g, '\\$&'); - // Convert wildcards: * -> .*, ? -> . - const regex = '^' + escaped.replace(/\*/g, '.*').replace(/\?/g, '.') + '$'; - return new RegExp(regex, 'i'); -} - - -/// Compiles an array of wildcard patterns into RegExp objects. -/// Caches the results to avoid recompilation on every check. -/// -/// @param {string[]} patterns - Array of wildcard patterns -/// @param {Map} cache - Cache map storing pattern -> regex mappings -/// @returns {RegExp[]} Array of compiled regex patterns -function compilePatterns(patterns, cache) { - return patterns.map(pattern => { - if (cache.has(pattern)) { - return cache.get(pattern); - } - const regex = wildcardToRegex(pattern); - cache.set(pattern, regex); - return regex; - }); -} - - -/// Tests if a value matches any of the compiled patterns. -/// -/// @param {string} value - The value to test (e.g., wm_class) -/// @param {RegExp[]} patterns - Array of compiled regex patterns -/// @returns {boolean} True if value matches any pattern -function matchesAnyPattern(value, patterns) { - if (!value || patterns.length === 0) { - return false; - } - return patterns.some(pattern => pattern.test(value)); -} - -export const ApplicationsBlur = class ApplicationsBlur { - constructor(connections, settings, effects_manager) { - this.connections = connections; - this.settings = settings; - this.effects_manager = effects_manager; - this.paint_signals = new PaintSignals(connections); - - // stores every blurred meta window - this.meta_window_map = new Map(); - - // cache for compiled patterns to avoid recompilation - this._whitelist_pattern_cache = new Map(); - this._blacklist_pattern_cache = new Map(); - this._compiled_whitelist = []; - this._compiled_blacklist = []; - - // compile initial patterns - this._update_patterns(); - } - - /// Updates the compiled whitelist and blacklist patterns from settings. - /// Called during initialization and when whitelist/blacklist settings change. - _update_patterns() { - const whitelist = this.settings.applications.WHITELIST || []; - const blacklist = this.settings.applications.BLACKLIST || []; - - this._compiled_whitelist = compilePatterns(whitelist, this._whitelist_pattern_cache); - this._compiled_blacklist = compilePatterns(blacklist, this._blacklist_pattern_cache); - - this._log(`Patterns updated - whitelist: ${whitelist.length}, blacklist: ${blacklist.length}`); - } - - enable() { - this._log("blurring applications..."); - - // export dbus service for preferences - this.service = new ApplicationsService; - this.service.export(); - - this.mutter_gsettings = new Gio.Settings({ schema: 'org.gnome.mutter' }); - - // blur already existing windows - this.update_all_windows(); - - // blur every new window - this.connections.connect( - global.display, - 'window-created', - (_meta_display, meta_window) => { - this._log("window created"); - - if (meta_window) - this.track_new(meta_window); - } - ); - - // update window blur when focus is changed - this.focused_window_pid = null; - this.init_dynamic_opacity(); - this.connections.connect( - global.display, - 'focus-window', - (_meta_display, meta_window, _p0) => { - if (meta_window && meta_window.bms_pid != this.focused_window_pid) - this.set_focus_for_window(meta_window); - else if (!meta_window) - this.set_focus_for_window(null); - } - ); - - this.connect_to_overview(); - } - - /// Initializes the dynamic opacity for windows, without touching to the connections. - /// This is used both when enabling the component, and when changing the dynamic-opacity pref. - init_dynamic_opacity() { - if (this.settings.applications.DYNAMIC_OPACITY) { - // make the currently focused window solid - if (global.display.focus_window) - this.set_focus_for_window(global.display.focus_window); - } else { - // remove old focused window if the pref was changed - if (this.focused_window_pid) - this.set_focus_for_window(null); - } - } - - /// Connect to the overview being opened/closed to force the blur being - /// shown on every window of the workspaces viewer. - connect_to_overview() { - this.connections.disconnect_all_for(Main.overview); - - if (this.settings.applications.BLUR_ON_OVERVIEW) { - // when the overview is opened, show every window actors (which - // allows the blur to be shown too) - this.connections.connect( - Main.overview, 'showing', - _ => this.meta_window_map.forEach((meta_window, _pid) => { - let window_actor = meta_window.get_compositor_private(); - window_actor?.show(); - }) - ); - - // when the overview is closed, hide every actor that is not on the - // current workspace (to mimic the original behaviour) - this.connections.connect( - Main.overview, 'hidden', - _ => { - this.meta_window_map.forEach((meta_window, _pid) => { - let window_actor = meta_window.get_compositor_private(); - - if ( - (!meta_window.get_workspace().active) || meta_window.minimized - ) - window_actor.hide(); - }); - } - ); - } - } - - /// Iterate through all existing windows and add blur as needed. - update_all_windows() { - // Recompile patterns in case whitelist/blacklist changed - this._update_patterns(); - - // remove all previously blurred windows, in the case where the - // whitelist was changed - this.meta_window_map.forEach(((_meta_window, pid) => { - this.remove_blur(pid); - })); - - for ( - let i = 0; - i < global.workspace_manager.get_n_workspaces(); - ++i - ) { - let workspace = global.workspace_manager.get_workspace_by_index(i); - let windows = workspace.list_windows(); - - windows.forEach(meta_window => this.track_new(meta_window)); - } - } - - /// Adds the needed signals to every new tracked window, and adds blur if - /// needed. - /// Accepts only untracked meta windows (i.e no `bms_pid` set) - track_new(meta_window) { - // create a pid that will follow the window during its whole life - const pid = ("" + Math.random()).slice(2, 16); - meta_window.bms_pid = pid; - - this._log(`new window tracked, pid: ${pid}`); - - // register the blurred window - this.meta_window_map.set(pid, meta_window); - - // update the blur when wm-class is changed - this.connections.connect( - meta_window, 'notify::wm-class', - _ => this.check_blur(meta_window) - ); - - // update the clip, position, and/or size when the window changes - this.connections.connect( - meta_window, 'size-changed', - _ => this.update_size(pid) - ); - if (this.settings.applications.STATIC_BLUR) { - this.connections.connect( - meta_window, 'position-changed', - _ => this.update_size(pid) - ); - } - - // remove the blur when the window is unmanaged - this.connections.connect( - meta_window, 'unmanaging', - _ => this.untrack_meta_window(pid) - ); - - this.check_blur(meta_window); - - if (this.settings.applications.STATIC_BLUR && meta_window.get_client_type() === Meta.WindowClientType.X11) { - const window_actor = meta_window.get_compositor_private(); - window_actor.connect('child-added', _ => { - if (!meta_window.blur_actor) { - this._warn("can't move blur actor to back, it doesn't exist"); - return; - } - - window_actor.set_child_below_sibling(meta_window.blur_actor, null); - }); - } - } - - /// Updates the size of the blur actor associated to a meta window from its pid. - /// Accepts only tracked meta window (i.e `bms_pid` set), be it blurred or not. - update_size(pid) { - if (this.meta_window_map.has(pid)) { - const meta_window = this.meta_window_map.get(pid); - const blur_actor = meta_window.blur_actor; - if (blur_actor) { - if (this.settings.applications.STATIC_BLUR) { - const bg_manager = meta_window.bg_manager; - const bg_actor_monitor_index = bg_manager.backgroundActor.monitor; - const window_monitor_index = meta_window.get_monitor(); - const monitor = Main.layoutManager.monitors[window_monitor_index]; - - if (bg_actor_monitor_index !== window_monitor_index) { - this._log(`application (pid ${pid}) switching to monitor: ${window_monitor_index}`); - - // Recreate the BackgroundActor on the right monitor. This is necessary to make sure differently - // sized monitors have the correct scaled image of the wallpaper. - bg_manager._monitorIndex = window_monitor_index; - bg_manager._updateBackgroundActor(); - - // Also to fix differently sized monitor issues. - blur_actor.width = monitor.width; - blur_actor.height = monitor.height; - } - - const frame = meta_window.get_frame_rect(); - const buffer = meta_window.get_buffer_rect(); - blur_actor.x = monitor.x - buffer.x; - blur_actor.y = monitor.y - buffer.y; - - // set_clip(x-offset, y-offset, width, height) - blur_actor.set_clip(frame.x - monitor.x, frame.y - monitor.y, frame.width, frame.height); - } else { - const allocation = this.compute_allocation(meta_window); - blur_actor.x = allocation.x; - blur_actor.y = allocation.y; - blur_actor.width = allocation.width; - blur_actor.height = allocation.height; - } - } - } else - // the pid was visibly not removed - this.untrack_meta_window(pid); - } - - /// Checks if the given actor needs to be blurred. - /// Accepts only tracked meta window, be it blurred or not. - /// - /// In order to be blurred, a window either: - /// - is whitelisted in the user preferences if not enable-all - /// - is not blacklisted if enable-all - /// - /// Whitelist and blacklist support wildcard patterns: - /// - * matches any sequence of characters - /// - ? matches any single character - /// - Matching is case-insensitive - check_blur(meta_window) { - const window_wm_class = meta_window.get_wm_class(); - const enable_all = this.settings.applications.ENABLE_ALL; - if (window_wm_class) - this._log(`pid ${meta_window.bms_pid} associated to wm class name ${window_wm_class}`); - - - // if we are in blacklist mode and the window is not blacklisted - // or if we are in whitelist mode and the window is whitelisted - if ( - window_wm_class !== "" - && ((enable_all && !matchesAnyPattern(window_wm_class, this._compiled_blacklist)) - || (!enable_all && matchesAnyPattern(window_wm_class, this._compiled_whitelist)) - ) - && [ - Meta.FrameType.NORMAL, - Meta.FrameType.DIALOG, - Meta.FrameType.MODAL_DIALOG - ].includes(meta_window.get_frame_type()) - ) { - // only blur the window if it is not already done - if (!meta_window.blur_actor) - this.create_blur_effect(meta_window); - } - - // remove blur it is not explicitly whitelisted or un-blacklisted - else if (meta_window.blur_actor) - this.remove_blur(meta_window.bms_pid); - } - - /// Add the blur effect to the window. - /// Accepts only tracked meta window that is NOT already blurred. - create_blur_effect(meta_window) { - const pid = meta_window.bms_pid; - const window_actor = meta_window.get_compositor_private(); - - let blur_actor; - - if (this.settings.applications.STATIC_BLUR) { - const pipeline = new Pipeline(this.effects_manager, global.blur_my_shell._pipelines_manager, this.settings.applications.PIPELINE); - const bg_managers = []; - blur_actor = pipeline.create_background_with_effects( - meta_window.get_monitor(), bg_managers, window_actor, - 'bms-application-blurred-widget' - ); - - if (bg_managers.length > 0) meta_window.bg_manager = bg_managers[0]; - else // I've never seen this happen, but just in case - this._warn(`no bg_manager on blur creation for pid ${pid}`); - } else { - const pipeline = new DummyPipeline(this.effects_manager, this.settings.applications); - [blur_actor, meta_window.bg_manager] = pipeline.create_background_with_effect( - window_actor, 'bms-application-blurred-widget' - ); - - // if hacks are selected, force to repaint the window - if (this.settings.HACKS_LEVEL === 1) { - this._log("hack level 1"); - - this.paint_signals.disconnect_all_for_actor(blur_actor); - this.paint_signals.connect(blur_actor, pipeline.effect); - } else { - this.paint_signals.disconnect_all_for_actor(blur_actor); - } - } - - meta_window.blur_actor = blur_actor; - - // make sure window is blurred in overview - if (this.settings.applications.BLUR_ON_OVERVIEW) - this.enforce_window_visibility_on_overview_for(window_actor); - - // update the size - this.update_size(pid); - - // set the window actor's opacity - this.set_window_opacity(window_actor, this.settings.applications.OPACITY); - - // now set up the signals, for the window actor only: they are disconnected - // in `remove_blur`, whereas the signals for the meta window are disconnected - // only when the whole component is disabled - - // update the window opacity when it changes, else we don't control it fully - this.connections.connect( - window_actor, 'notify::opacity', - _ => { - if (this.focused_window_pid != pid) - this.set_window_opacity(window_actor, this.settings.applications.OPACITY); - } - ); - - // hide the blur if window becomes invisible - if (!window_actor.visible) - blur_actor.hide(); - - this.connections.connect( - window_actor, - 'notify::visible', - window_actor => { - if (window_actor.visible) - meta_window.blur_actor.show(); - else - meta_window.blur_actor.hide(); - } - ); - } - - /// With `focus=true`, tells us we are focused on said window (which can be null if - /// we are not focused anymore). It automatically removes the ancient focus. - /// With `focus=false`, just remove the focus from said window (which can still be null). - set_focus_for_window(meta_window, focus = true) { - let blur_actor = null; - let window_actor = null; - let new_pid = null; - if (meta_window) { - blur_actor = meta_window.blur_actor; - window_actor = meta_window.get_compositor_private(); - new_pid = meta_window.bms_pid; - } - - if (focus) { - // remove old focused window if any - if (this.focused_window_pid) { - const old_focused_window = this.meta_window_map.get(this.focused_window_pid); - if (old_focused_window) - this.set_focus_for_window(old_focused_window, false); - } - // set new focused window pid - this.focused_window_pid = new_pid; - // if we have blur, hide it and make the window opaque - if (this.settings.applications.DYNAMIC_OPACITY && blur_actor) { - blur_actor.hide(); - this.set_window_opacity(window_actor, 255); - } - } - // if we remove the focus and have blur, show it and make the window transparent - else if (blur_actor) { - blur_actor.show(); - this.set_window_opacity(window_actor, this.settings.applications.OPACITY); - } - } - - /// Makes sure that, when the overview is visible, the window actor will - /// stay visible no matter what. - /// We can instead hide the last child of the window actor, which will - /// improve performances without hiding the blur effect. - enforce_window_visibility_on_overview_for(window_actor) { - this.connections.connect(window_actor, 'notify::visible', - _ => { - if (this.settings.applications.BLUR_ON_OVERVIEW) { - if ( - !window_actor.visible - && Main.overview.visible - ) { - window_actor.show(); - window_actor.get_last_child().hide(); - } else if ( - window_actor.visible - ) - window_actor.get_last_child().show(); - } - } - ); - } - - /// Set the opacity of the window actor that sits on top of the blur effect. - set_window_opacity(window_actor, opacity) { - window_actor?.get_children().forEach(child => { - if (child.name !== "blur-actor" && child.opacity != opacity) - child.opacity = opacity; - }); - } - - /// Update the opacity of all window actors. - set_opacity() { - let opacity = this.settings.applications.OPACITY; - - this.meta_window_map.forEach(((meta_window, pid) => { - if (pid != this.focused_window_pid && meta_window.blur_actor) { - let window_actor = meta_window.get_compositor_private(); - this.set_window_opacity(window_actor, opacity); - } - })); - } - - /// Find the system's window scaling. - /// If `scale-monitor-framebuffer` experimental feature if on, we don't need to manage scaling. - /// Else, on wayland, we need to divide by the scale to get the correct result. - compute_scale(meta_window) { - // TODO: Drop GNOME <50 compatibility - const gnome_shell_major_version = parseInt(Config.PACKAGE_VERSION.split('.')[0]); - const scale_monitor_framebuffer = - gnome_shell_major_version >= 50 || - this.mutter_gsettings - .get_strv('experimental-features') - .includes('scale-monitor-framebuffer'); - const is_wayland = gnome_shell_major_version >= 50 || - (typeof Meta.is_wayland_compositor === 'function' - ? Meta.is_wayland_compositor() - : global.display?.is_wayland_compositor?.() ?? true); - const monitor_index = meta_window.get_monitor(); - // check if the window is using wayland, or xwayland/xorg for rendering - return !scale_monitor_framebuffer && is_wayland && meta_window.get_client_type() == 0 - ? Main.layoutManager.monitors[monitor_index].geometry_scale - : 1; - } - - /// Compute the size and position for a blur actor. - /// Coordinates are relative to window buffer's corner. - compute_allocation(meta_window) { - const scale = this.compute_scale(meta_window); - - let frame = meta_window.get_frame_rect(); - let buffer = meta_window.get_buffer_rect(); - - return { - x: (frame.x - buffer.x) / scale, - y: (frame.y - buffer.y) / scale, - width: frame.width / scale, - height: frame.height / scale - }; - } - - change_blur_type() { - this._log("resetting..."); - - this.disable(); - setTimeout(_ => this.enable(), 1); - } - - change_pipeline() { - this.update_all_windows(); - } - - /// Removes the blur actor to make a blurred window become normal again. - /// It however does not untrack the meta window itself. - /// Accepts a pid corresponding (or not) to a blurred (or not) meta window. - remove_blur(pid) { - this._log(`removing blur for pid ${pid}`); - - let meta_window = this.meta_window_map.get(pid); - if (meta_window) { - let window_actor = meta_window.get_compositor_private(); - let blur_actor = meta_window.blur_actor; - let bg_manager = meta_window.bg_manager; - - if (blur_actor && window_actor) { - // reset the opacity - this.set_window_opacity(window_actor, 255); - - // remove the blurred actor - window_actor.remove_child(blur_actor); - bg_manager._bms_pipeline.destroy(); - bg_manager.destroy(); - blur_actor.destroy(); - - // kinda untrack the blurred actor, as its presence is how we know - // whether we are blurred or not - delete meta_window.blur_actor; - delete meta_window.bg_manager; - - // disconnect the signals of the window actor - this.paint_signals.disconnect_all_for_actor(blur_actor); - this.connections.disconnect_all_for(window_actor); - } - } - } - - /// Kinda the same as `remove_blur`, but better: it also untracks the window. - /// This needs to be called when the component is being disabled, else it - /// would cause havoc by having untracked windows during normal operations, - /// which is not the point at all! - /// Accepts a pid corresponding (or not) to a blurred (or not) meta window. - untrack_meta_window(pid) { - this.remove_blur(pid); - let meta_window = this.meta_window_map.get(pid); - if (meta_window) { - this.connections.disconnect_all_for(meta_window); - this.meta_window_map.delete(pid); - } - } - - disable() { - this._log("removing blur from applications..."); - - this.service?.unexport(); - delete this.mutter_gsettings; - - this.meta_window_map.forEach((_meta_window, pid) => { - this.untrack_meta_window(pid); - }); - - this.connections.disconnect_all(); - this.paint_signals.disconnect_all(); - } - - _log(str) { - if (this.settings.DEBUG) - console.log(`[Blur my Shell > applications] ${str}`); - } - - _warn(str) { - console.warn(`[Blur my Shell > applications] ${str}`); - } -}; |