diff --git a/src/firefox-patches/ff141-gradienth-dithering.patch b/src/firefox-patches/ff141-gradienth-dithering.patch deleted file mode 100644 index 3048eb4b2..000000000 --- a/src/firefox-patches/ff141-gradienth-dithering.patch +++ /dev/null @@ -1,97 +0,0 @@ -diff --git a/gfx/wr/swgl/build.rs b/gfx/wr/swgl/build.rs ---- a/gfx/wr/swgl/build.rs -+++ b/gfx/wr/swgl/build.rs -@@ -147,10 +147,11 @@ - let shader_dir = std::env::var("CARGO_MANIFEST_DIR").unwrap() + "/../webrender/res"; - - let shader_flags = ShaderFeatureFlags::GL - | ShaderFeatureFlags::DUAL_SOURCE_BLENDING - | ShaderFeatureFlags::ADVANCED_BLEND_EQUATION -+ | ShaderFeatureFlags::DITHERING - | ShaderFeatureFlags::DEBUG; - let mut shaders: Vec = Vec::new(); - for (name, features) in get_shader_features(shader_flags) { - shaders.extend(features.iter().map(|f| { - if f.is_empty() { -diff --git a/gfx/wr/webrender/res/brush_linear_gradient.glsl b/gfx/wr/webrender/res/brush_linear_gradient.glsl ---- a/gfx/wr/webrender/res/brush_linear_gradient.glsl -+++ b/gfx/wr/webrender/res/brush_linear_gradient.glsl -@@ -79,17 +79,23 @@ - - return Fragment(color); - } - - #ifdef SWGL_DRAW_SPAN -+#ifdef WR_FEATURE_DITHERING -+void swgl_drawSpanRGBA8() { -+ return; -+} -+#else - void swgl_drawSpanRGBA8() { - int address = swgl_validateGradient(sGpuBufferF, get_gpu_buffer_uv(v_gradient_address.x), int(GRADIENT_ENTRIES + 2.0)); - if (address < 0) { - return; - } - - swgl_commitLinearGradientRGBA8(sGpuBufferF, address, GRADIENT_ENTRIES, true, v_gradient_repeat.x != 0.0, - v_pos, v_scale_dir, v_start_offset.x); - } - #endif -+#endif - - #endif -diff --git a/gfx/wr/webrender/src/renderer/init.rs b/gfx/wr/webrender/src/renderer/init.rs ---- a/gfx/wr/webrender/src/renderer/init.rs -+++ b/gfx/wr/webrender/src/renderer/init.rs -@@ -222,11 +222,11 @@ - fn default() -> Self { - WebRenderOptions { - resource_override_path: None, - use_optimized_shaders: false, - enable_aa: true, -- enable_dithering: false, -+ enable_dithering: true, - debug_flags: DebugFlags::empty(), - max_recorded_profiles: 0, - precache_flags: ShaderPrecacheFlags::empty(), - enable_subpixel_aa: false, - clear_color: ColorF::new(1.0, 1.0, 1.0, 1.0), ---- a/gfx/wr/webrender/build.rs -+++ b/gfx/wr/webrender/build.rs -@@ -150,11 +150,10 @@ - ) { - flags.remove(ShaderFeatureFlags::TEXTURE_EXTERNAL_ESSL1); - } - // The optimizer cannot handle the required EXT_YUV_target extension - flags.remove(ShaderFeatureFlags::TEXTURE_EXTERNAL_BT709); -- flags.remove(ShaderFeatureFlags::DITHERING); - - for (shader_name, configs) in get_shader_features(flags) { - for config in configs { - shaders.push(ShaderOptimizationInput { - shader_name, -diff --git a/gfx/wr/webrender/res/shared.glsl b/gfx/wr/webrender/res/shared.glsl -index f9c093f8486dbd481f2520762f80ace257c294f6..904f9991e917423e11563d862bbd185725523573 100644 ---- a/gfx/wr/webrender/res/shared.glsl -+++ b/gfx/wr/webrender/res/shared.glsl -@@ -226,6 +226,7 @@ uniform __samplerExternal2DY2YEXT sColor1; - uniform __samplerExternal2DY2YEXT sColor2; - #endif - -+#define WR_FEATURE_DITHERING - #ifdef WR_FEATURE_DITHERING - uniform sampler2D sDither; - #endif -diff --git a/gfx/wr/webrender/res/gradient.glsl b/gfx/wr/webrender/res/gradient.glsl -index 6ed2e6987135e04a70fcc908c089bf225ffdb255..09a4acdf3f53a53e123510fdc5aea8b9b8c4d91e 100644 ---- a/gfx/wr/webrender/res/gradient.glsl -+++ b/gfx/wr/webrender/res/gradient.glsl -@@ -11,6 +11,7 @@ flat varying mediump vec2 v_gradient_repeat; - - #ifdef WR_FRAGMENT_SHADER - -+#define WR_FEATURE_DITHERING - #ifdef WR_FEATURE_DITHERING - vec4 dither(vec4 color) { - const int matrix_mask = 7; - diff --git a/src/zen/folders/ZenFolders.mjs b/src/zen/folders/ZenFolders.mjs index c5d9bbf8c..d68ec91c0 100644 --- a/src/zen/folders/ZenFolders.mjs +++ b/src/zen/folders/ZenFolders.mjs @@ -466,7 +466,9 @@ #onNewFolder(event) { const isFromToolbar = event.target.id === 'zen-context-menu-new-folder-toolbar'; const contextMenu = event.target.parentElement; - let tabs = []; + let tabs = TabContextMenu.contextTab.multiselected + ? gBrowser.selectedTabs + : [TabContextMenu.contextTab]; let triggerTab = contextMenu.triggerNode && (contextMenu.triggerNode.tab || contextMenu.triggerNode.closest('tab')); diff --git a/src/zen/tabs/ZenPinnedTabManager.mjs b/src/zen/tabs/ZenPinnedTabManager.mjs index 23ac56ae3..6174e261d 100644 --- a/src/zen/tabs/ZenPinnedTabManager.mjs +++ b/src/zen/tabs/ZenPinnedTabManager.mjs @@ -989,7 +989,8 @@ } movingTabs = [...movingTabs]; try { - const pinnedTabsTarget = this._isGoingToPinnedTabs; + const pinnedTabsTarget = + event.target.closest('.zen-current-workspace-indicator') || this._isGoingToPinnedTabs; const essentialTabsTarget = event.target.closest('.zen-essentials-container'); const tabsTarget = !this._isGoingToPinnedTabs; diff --git a/src/zen/workspaces/ZenGradientGenerator.mjs b/src/zen/workspaces/ZenGradientGenerator.mjs index cb3143ac1..2ede7a397 100644 --- a/src/zen/workspaces/ZenGradientGenerator.mjs +++ b/src/zen/workspaces/ZenGradientGenerator.mjs @@ -1143,7 +1143,7 @@ return forToolbar ? this.getToolbarModifiedBase() : this.isDarkMode - ? 'rgba(0, 0, 0, 0.4)' + ? 'linear-gradient(-45deg, rgba(255, 255, 255, 0.01), rgba(0, 0, 0, 0.4))' : 'transparent'; } else if (themedColors.length === 1) { return this.getSingleRGBColor(themedColors[0], forToolbar); @@ -1313,6 +1313,13 @@ } } + if (theme) { + const workspaceElement = browser.gZenWorkspaces.workspaceElement(windowWorkspace.uuid); + if (workspaceElement) { + workspaceElement.clearThemeStyles(); + } + } + if (!skipUpdate) { browser.document.documentElement.style.setProperty( '--zen-main-browser-background-old', @@ -1627,21 +1634,42 @@ invalidateGradientCache() { this.#gradientsCache = {}; + window.dispatchEvent(new Event('ZenGradientCacheChanged')); } - async getGradientForWorkspace(workspace) { + getGradientForWorkspace(workspace) { const uuid = workspace.uuid; if (this.#gradientsCache[uuid]) { return this.#gradientsCache[uuid]; } const previousOpacity = this.currentOpacity; const previousLightness = this.#currentLightness; - this.currentOpacity = workspace.theme.opacity ?? 0.5; - this.#currentLightness = workspace.theme.lightness ?? 50; - const gradient = this.getGradient(workspace.theme.gradientColors); + const theme = workspace.theme; + this.currentOpacity = theme.opacity ?? 0.5; + this.#currentLightness = theme.lightness ?? 50; + const gradient = this.getGradient(theme.gradientColors); this.currentOpacity = previousOpacity; this.#currentLightness = previousLightness; - this.#gradientsCache[uuid] = [gradient, workspace.theme.texture ?? 0]; + let dominantColor = this.getMostDominantColor(theme.gradientColors); + const isDefaultTheme = !dominantColor; + if (isDefaultTheme) { + dominantColor = this.getNativeAccentColor(); + } + let isDarkMode = this.isDarkMode; + let isExplicitMode = false; + if (!isDefaultTheme && !this.isLegacyVersion) { + // Check for the primary color + isDarkMode = this.shouldBeDarkMode(dominantColor); + isExplicitMode = true; + } + this.#gradientsCache[uuid] = { + gradient, + grain: theme.texture ?? 0, + isDarkMode, + isExplicitMode, + toolbarColor: this.getToolbarColor(isDarkMode), + primaryColor: this.getAccentColorForUI(dominantColor), + }; return this.#gradientsCache[uuid]; } } diff --git a/src/zen/workspaces/ZenWorkspace.mjs b/src/zen/workspaces/ZenWorkspace.mjs index 558c59b4d..fcf7f13e9 100644 --- a/src/zen/workspaces/ZenWorkspace.mjs +++ b/src/zen/workspaces/ZenWorkspace.mjs @@ -144,6 +144,8 @@ this.#updateOverflow(); + window.addEventListener('ZenGradientCacheChanged', this.#onGradientCacheChanged.bind(this)); + this.dispatchEvent( new CustomEvent('ZenWorkspaceAttached', { bubbles: true, @@ -224,6 +226,26 @@ get newTabButton() { return this.querySelector('#tabs-newtab-button'); } + + #onGradientCacheChanged() { + const { isDarkMode, isExplicitMode, toolbarColor, primaryColor } = + gZenThemePicker.getGradientForWorkspace( + gZenWorkspaces.getWorkspaceFromId(this.workspaceUuid) + ); + if (isExplicitMode) { + this.style.colorScheme = isDarkMode ? 'dark' : 'light'; + } else { + this.style.colorScheme = ''; + } + this.style.setProperty('--toolbox-textcolor', `rgba(${toolbarColor.join(',')})`); + this.style.setProperty('--zen-primary-color', primaryColor); + } + + clearThemeStyles() { + this.style.colorScheme = ''; + this.style.removeProperty('--toolbox-textcolor'); + this.style.removeProperty('--zen-primary-color'); + } } customElements.define('zen-workspace', nsZenWorkspace); diff --git a/src/zen/workspaces/ZenWorkspaces.mjs b/src/zen/workspaces/ZenWorkspaces.mjs index 146646468..1b40f8129 100644 --- a/src/zen/workspaces/ZenWorkspaces.mjs +++ b/src/zen/workspaces/ZenWorkspaces.mjs @@ -1719,9 +1719,9 @@ var gZenWorkspaces = new (class extends nsZenMultiWindowFeature { // Find the next workspace we are scrolling to const nextWorkspace = workspaces.workspaces[workspaceIndex + (offsetPixels > 0 ? -1 : 1)]; if (nextWorkspace) { - const [nextGradient, nextGrain] = - await gZenThemePicker.getGradientForWorkspace(nextWorkspace); - const existingGrain = (await gZenThemePicker.getGradientForWorkspace(workspace))[1]; + const { gradient: nextGradient, grain: nextGrain } = + gZenThemePicker.getGradientForWorkspace(nextWorkspace); + const existingGrain = gZenThemePicker.getGradientForWorkspace(workspace).grain; const percentage = Math.abs(offsetPixels) / 200; await new Promise((resolve) => { requestAnimationFrame(() => { diff --git a/src/zen/workspaces/zen-workspaces.css b/src/zen/workspaces/zen-workspaces.css index b647f889f..244d7ee9b 100644 --- a/src/zen/workspaces/zen-workspaces.css +++ b/src/zen/workspaces/zen-workspaces.css @@ -247,6 +247,7 @@ zen-workspace { position: absolute; height: 100%; overflow: hidden; + color: var(--toolbox-textcolor); :root:not([zen-sidebar-expanded='true']) & { width: 100%;