mirror of
https://github.com/zen-browser/desktop.git
synced 2026-01-04 12:27:50 +00:00
feat: Improved theme handling for single workspaces, b=no-bug, c=tabs, folders, workspaces
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -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'));
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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];
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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(() => {
|
||||
|
||||
@@ -247,6 +247,7 @@ zen-workspace {
|
||||
position: absolute;
|
||||
height: 100%;
|
||||
overflow: hidden;
|
||||
color: var(--toolbox-textcolor);
|
||||
|
||||
:root:not([zen-sidebar-expanded='true']) & {
|
||||
width: 100%;
|
||||
|
||||
Reference in New Issue
Block a user