mirror of
https://github.com/wez/wezterm.git
synced 2024-12-24 13:52:55 +03:00
background: allow specifying the repeat interval
Useful if you want to add smaller items to your background layers every so often; you can specify the distance between them and make it independent of the item height.
This commit is contained in:
parent
e85258a212
commit
040cd19f88
@ -1,4 +1,4 @@
|
|||||||
use crate::{default_one_point_oh, Config, HsbTransform, RgbaColor};
|
use crate::{default_one_point_oh, Config, Dimension, HsbTransform, RgbaColor};
|
||||||
use luahelper::impl_lua_conversion_dynamic;
|
use luahelper::impl_lua_conversion_dynamic;
|
||||||
use wezterm_dynamic::{FromDynamic, FromDynamicOptions, ToDynamic, Value};
|
use wezterm_dynamic::{FromDynamic, FromDynamicOptions, ToDynamic, Value};
|
||||||
|
|
||||||
@ -64,9 +64,13 @@ pub struct BackgroundLayer {
|
|||||||
|
|
||||||
#[dynamic(default)]
|
#[dynamic(default)]
|
||||||
pub repeat_x: BackgroundRepeat,
|
pub repeat_x: BackgroundRepeat,
|
||||||
|
#[dynamic(try_from = "crate::units::OptPixelUnit", default)]
|
||||||
|
pub repeat_x_size: Option<Dimension>,
|
||||||
|
|
||||||
#[dynamic(default)]
|
#[dynamic(default)]
|
||||||
pub repeat_y: BackgroundRepeat,
|
pub repeat_y: BackgroundRepeat,
|
||||||
|
#[dynamic(try_from = "crate::units::OptPixelUnit", default)]
|
||||||
|
pub repeat_y_size: Option<Dimension>,
|
||||||
|
|
||||||
#[dynamic(default)]
|
#[dynamic(default)]
|
||||||
pub vertical_align: BackgroundVerticalAlignment,
|
pub vertical_align: BackgroundVerticalAlignment,
|
||||||
@ -111,6 +115,8 @@ impl BackgroundLayer {
|
|||||||
attachment: Default::default(),
|
attachment: Default::default(),
|
||||||
repeat_x: Default::default(),
|
repeat_x: Default::default(),
|
||||||
repeat_y: Default::default(),
|
repeat_y: Default::default(),
|
||||||
|
repeat_x_size: None,
|
||||||
|
repeat_y_size: None,
|
||||||
vertical_align: Default::default(),
|
vertical_align: Default::default(),
|
||||||
horizontal_align: Default::default(),
|
horizontal_align: Default::default(),
|
||||||
width: BackgroundSize::Percent(100),
|
width: BackgroundSize::Percent(100),
|
||||||
@ -136,6 +142,7 @@ pub enum BackgroundSize {
|
|||||||
/// Stretches the image to a percentage of the background size
|
/// Stretches the image to a percentage of the background size
|
||||||
/// as determined by the `origin` property.
|
/// as determined by the `origin` property.
|
||||||
Percent(u8),
|
Percent(u8),
|
||||||
|
// FIXME: Dimension
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Default for BackgroundSize {
|
impl Default for BackgroundSize {
|
||||||
|
@ -1,5 +1,26 @@
|
|||||||
use wezterm_dynamic::{FromDynamic, FromDynamicOptions, ToDynamic, Value};
|
use wezterm_dynamic::{FromDynamic, FromDynamicOptions, ToDynamic, Value};
|
||||||
|
|
||||||
|
#[derive(Debug, Copy, Clone)]
|
||||||
|
pub struct OptPixelUnit(Option<Dimension>);
|
||||||
|
|
||||||
|
impl FromDynamic for OptPixelUnit {
|
||||||
|
fn from_dynamic(
|
||||||
|
value: &Value,
|
||||||
|
_options: FromDynamicOptions,
|
||||||
|
) -> Result<Self, wezterm_dynamic::Error> {
|
||||||
|
match value {
|
||||||
|
Value::Null => Ok(Self(None)),
|
||||||
|
value => Ok(Self(Some(DefaultUnit::Pixels.from_dynamic_impl(value)?))),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Into<Option<Dimension>> for OptPixelUnit {
|
||||||
|
fn into(self) -> Option<Dimension> {
|
||||||
|
self.0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Debug, Copy, Clone)]
|
#[derive(Debug, Copy, Clone)]
|
||||||
pub struct PixelUnit(Dimension);
|
pub struct PixelUnit(Dimension);
|
||||||
|
|
||||||
|
@ -4,7 +4,7 @@ use crate::Dimensions;
|
|||||||
use anyhow::Context;
|
use anyhow::Context;
|
||||||
use config::{
|
use config::{
|
||||||
BackgroundLayer, BackgroundRepeat, BackgroundSize, BackgroundSource, ConfigHandle,
|
BackgroundLayer, BackgroundRepeat, BackgroundSize, BackgroundSource, ConfigHandle,
|
||||||
GradientOrientation,
|
DimensionContext, GradientOrientation,
|
||||||
};
|
};
|
||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
use std::sync::{Arc, Mutex};
|
use std::sync::{Arc, Mutex};
|
||||||
@ -343,6 +343,17 @@ impl crate::TermWindow {
|
|||||||
let tex_height = sprite.coords.height() as f32;
|
let tex_height = sprite.coords.height() as f32;
|
||||||
let aspect = tex_width as f32 / tex_height as f32;
|
let aspect = tex_width as f32 / tex_height as f32;
|
||||||
|
|
||||||
|
let h_context = DimensionContext {
|
||||||
|
dpi: self.dimensions.dpi as f32,
|
||||||
|
pixel_max: pixel_width,
|
||||||
|
pixel_cell: self.render_metrics.cell_size.width as f32,
|
||||||
|
};
|
||||||
|
let v_context = DimensionContext {
|
||||||
|
dpi: self.dimensions.dpi as f32,
|
||||||
|
pixel_max: pixel_height,
|
||||||
|
pixel_cell: self.render_metrics.cell_size.height as f32,
|
||||||
|
};
|
||||||
|
|
||||||
// log::info!("tex {tex_width}x{tex_height} aspect={aspect}");
|
// log::info!("tex {tex_width}x{tex_height} aspect={aspect}");
|
||||||
|
|
||||||
// Compute the largest aspect-preserved size that will fill the space
|
// Compute the largest aspect-preserved size that will fill the space
|
||||||
@ -385,30 +396,41 @@ impl crate::TermWindow {
|
|||||||
BackgroundSize::Contain => max_aspect_width as f32,
|
BackgroundSize::Contain => max_aspect_width as f32,
|
||||||
BackgroundSize::Cover => min_aspect_width as f32,
|
BackgroundSize::Cover => min_aspect_width as f32,
|
||||||
BackgroundSize::Length(n) => n as f32,
|
BackgroundSize::Length(n) => n as f32,
|
||||||
BackgroundSize::Percent(p) => (pixel_width as f32 * p as f32) / 100.,
|
BackgroundSize::Percent(p) => (pixel_width * p as f32) / 100.,
|
||||||
};
|
};
|
||||||
|
|
||||||
let height = match layer.def.height {
|
let height = match layer.def.height {
|
||||||
BackgroundSize::Contain => max_aspect_height as f32,
|
BackgroundSize::Contain => max_aspect_height as f32,
|
||||||
BackgroundSize::Cover => min_aspect_height as f32,
|
BackgroundSize::Cover => min_aspect_height as f32,
|
||||||
BackgroundSize::Length(n) => n as f32,
|
BackgroundSize::Length(n) => n as f32,
|
||||||
BackgroundSize::Percent(p) => (pixel_height as f32 * p as f32) / 100.,
|
BackgroundSize::Percent(p) => (pixel_height * p as f32) / 100.,
|
||||||
};
|
};
|
||||||
let origin_x = pixel_width / -2.;
|
let origin_x = pixel_width / -2.;
|
||||||
let top_pixel = pixel_height / -2.;
|
let top_pixel = pixel_height / -2.;
|
||||||
let mut origin_y = top_pixel;
|
let mut origin_y = top_pixel;
|
||||||
|
|
||||||
|
let repeat_x = layer
|
||||||
|
.def
|
||||||
|
.repeat_x_size
|
||||||
|
.map(|size| size.evaluate_as_pixels(h_context))
|
||||||
|
.unwrap_or(width);
|
||||||
|
let repeat_y = layer
|
||||||
|
.def
|
||||||
|
.repeat_y_size
|
||||||
|
.map(|size| size.evaluate_as_pixels(v_context))
|
||||||
|
.unwrap_or(height);
|
||||||
|
|
||||||
// log::info!("computed {width}x{height}");
|
// log::info!("computed {width}x{height}");
|
||||||
if let Some(factor) = layer.def.attachment.scroll_factor() {
|
if let Some(factor) = layer.def.attachment.scroll_factor() {
|
||||||
let distance = top as f32 * self.render_metrics.cell_size.height as f32 * factor;
|
let distance = top as f32 * self.render_metrics.cell_size.height as f32 * factor;
|
||||||
let num_tiles = distance / height;
|
let num_tiles = distance / repeat_y;
|
||||||
origin_y -= num_tiles.fract() * height;
|
origin_y -= num_tiles.fract() * repeat_y;
|
||||||
}
|
}
|
||||||
|
|
||||||
let limit_y = top_pixel + pixel_height;
|
let limit_y = top_pixel + pixel_height;
|
||||||
|
|
||||||
for y_step in 0.. {
|
for y_step in 0.. {
|
||||||
let offset_y = y_step as f32 * height;
|
let offset_y = y_step as f32 * repeat_y;
|
||||||
let origin_y = origin_y + offset_y;
|
let origin_y = origin_y + offset_y;
|
||||||
if origin_y >= limit_y
|
if origin_y >= limit_y
|
||||||
|| (y_step > 0 && layer.def.repeat_y == BackgroundRepeat::NoRepeat)
|
|| (y_step > 0 && layer.def.repeat_y == BackgroundRepeat::NoRepeat)
|
||||||
@ -417,7 +439,7 @@ impl crate::TermWindow {
|
|||||||
}
|
}
|
||||||
|
|
||||||
for x_step in 0.. {
|
for x_step in 0.. {
|
||||||
let offset_x = x_step as f32 * width;
|
let offset_x = x_step as f32 * repeat_x;
|
||||||
if offset_x >= pixel_width
|
if offset_x >= pixel_width
|
||||||
|| (x_step > 0 && layer.def.repeat_x == BackgroundRepeat::NoRepeat)
|
|| (x_step > 0 && layer.def.repeat_x == BackgroundRepeat::NoRepeat)
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user