feat: Improved theme handling for single workspaces, b=no-bug, c=tabs, folders, workspaces

This commit is contained in:
Mr. M
2025-08-14 12:54:11 +02:00
parent 942606f82b
commit c779267486
7 changed files with 65 additions and 108 deletions

View File

@@ -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<String> = 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;

View File

@@ -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'));

View File

@@ -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;

View File

@@ -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];
}
}

View File

@@ -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);

View File

@@ -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(() => {

View File

@@ -247,6 +247,7 @@ zen-workspace {
position: absolute;
height: 100%;
overflow: hidden;
color: var(--toolbox-textcolor);
:root:not([zen-sidebar-expanded='true']) & {
width: 100%;