mirror of
https://github.com/sxyazi/yazi.git
synced 2026-07-25 08:41:05 +00:00
Add config support for coordinate and size adjustment for ueberzugpp image preview
Fix https://github.com/sxyazi/yazi/issues/302 Example usage in yazi.toml for a 2.0 scale monitor on Hyprland: ``` [preview.ueberzug] scale_down_factor = 2.0 x_coordinate_offset = 0.5 y_coordinate_offset = 0.5 width_adjustment = -0.5 height_adjustment = -0.5 ```
This commit is contained in:
parent
6d3457dde0
commit
218e9310e9
4 changed files with 59 additions and 8 deletions
|
|
@ -21,4 +21,4 @@ ratatui = "^0"
|
||||||
tokio = { version = "^1", features = [ "parking_lot", "io-util", "process" ] }
|
tokio = { version = "^1", features = [ "parking_lot", "io-util", "process" ] }
|
||||||
|
|
||||||
# Logging
|
# Logging
|
||||||
tracing = "^0"
|
tracing = {version = "^0", features = ["max_level_debug", "release_max_level_warn"]}
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,15 @@
|
||||||
|
use std::cmp::max;
|
||||||
use std::{path::PathBuf, process::Stdio};
|
use std::{path::PathBuf, process::Stdio};
|
||||||
|
use tracing::debug;
|
||||||
|
|
||||||
use anyhow::Result;
|
use anyhow::Result;
|
||||||
use ratatui::prelude::Rect;
|
use ratatui::prelude::Rect;
|
||||||
use tokio::{io::AsyncWriteExt, process::{Child, Command}, sync::mpsc::{self, UnboundedSender}};
|
use tokio::{
|
||||||
|
io::AsyncWriteExt,
|
||||||
|
process::{Child, Command},
|
||||||
|
sync::mpsc::{self, UnboundedSender},
|
||||||
|
};
|
||||||
|
use yazi_config::PREVIEW;
|
||||||
|
|
||||||
use crate::Adaptor;
|
use crate::Adaptor;
|
||||||
|
|
||||||
|
|
@ -31,6 +38,19 @@ impl Ueberzug {
|
||||||
Ok(tx)
|
Ok(tx)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn adjust_rect(mut rect: Rect) -> Rect {
|
||||||
|
let cfg = &PREVIEW.ueberzug;
|
||||||
|
rect.x =
|
||||||
|
max((rect.x as f64 / cfg.scale_down_factor + cfg.x_offset) as i32, 0) as u16;
|
||||||
|
rect.y =
|
||||||
|
max((rect.y as f64 / cfg.scale_down_factor + cfg.y_offset) as i32, 0) as u16;
|
||||||
|
rect.width =
|
||||||
|
max((rect.width as f64 / cfg.scale_down_factor + cfg.width_offset) as i32, 0) as u16;
|
||||||
|
rect.height =
|
||||||
|
max((rect.height as f64 / cfg.scale_down_factor + cfg.height_offset) as i32, 0) as u16;
|
||||||
|
return rect;
|
||||||
|
}
|
||||||
|
|
||||||
fn create_demon(adaptor: Adaptor) -> Result<Child> {
|
fn create_demon(adaptor: Adaptor) -> Result<Child> {
|
||||||
Ok(
|
Ok(
|
||||||
Command::new("ueberzug")
|
Command::new("ueberzug")
|
||||||
|
|
@ -44,7 +64,10 @@ impl Ueberzug {
|
||||||
|
|
||||||
async fn send_command(child: &mut Child, cmd: Option<(PathBuf, Rect)>) -> Result<()> {
|
async fn send_command(child: &mut Child, cmd: Option<(PathBuf, Rect)>) -> Result<()> {
|
||||||
let stdin = child.stdin.as_mut().unwrap();
|
let stdin = child.stdin.as_mut().unwrap();
|
||||||
if let Some((path, rect)) = cmd {
|
if let Some((path, tmp_rect)) = cmd {
|
||||||
|
debug!("ueberzug rect before adjustment: {:?}", tmp_rect);
|
||||||
|
let rect = Self::adjust_rect(tmp_rect);
|
||||||
|
debug!("ueberzug rect after adjust adjustment: {:?}", rect);
|
||||||
let s = format!(
|
let s = format!(
|
||||||
r#"{{"action":"add","identifier":"yazi","x":{},"y":{},"max_width":{},"max_height":{},"path":"{}"}}{}"#,
|
r#"{{"action":"add","identifier":"yazi","x":{},"y":{},"max_width":{},"max_height":{},"path":"{}"}}{}"#,
|
||||||
rect.x,
|
rect.x,
|
||||||
|
|
|
||||||
|
|
@ -14,6 +14,16 @@ max_width = 600
|
||||||
max_height = 900
|
max_height = 900
|
||||||
cache_dir = ""
|
cache_dir = ""
|
||||||
|
|
||||||
|
[preview.ueberzug]
|
||||||
|
# Scale down the coordinate and size of image preview that is incorrectly scaled
|
||||||
|
# up by ueberzugpp in Wayland (tested under Hyprland). Example usage: if your
|
||||||
|
# monitor has a 2.0 scale factor, you should pass 2.0 here.
|
||||||
|
scale_down_factor = 1.0
|
||||||
|
x_offset = 0.0
|
||||||
|
y_offset = 0.0
|
||||||
|
width_offset = 0.0
|
||||||
|
height_offset = 0.0
|
||||||
|
|
||||||
[opener]
|
[opener]
|
||||||
edit = [
|
edit = [
|
||||||
{ exec = '$EDITOR "$@"', block = true, for = "unix" },
|
{ exec = '$EDITOR "$@"', block = true, for = "unix" },
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,7 @@
|
||||||
use std::{path::{Path, PathBuf}, time::{self, SystemTime}};
|
use std::{
|
||||||
|
path::{Path, PathBuf},
|
||||||
|
time::{self, SystemTime},
|
||||||
|
};
|
||||||
|
|
||||||
use md5::{Digest, Md5};
|
use md5::{Digest, Md5};
|
||||||
use serde::Deserialize;
|
use serde::Deserialize;
|
||||||
|
|
@ -6,13 +9,24 @@ use yazi_shared::expand_path;
|
||||||
|
|
||||||
use crate::{xdg::Xdg, MERGED_YAZI};
|
use crate::{xdg::Xdg, MERGED_YAZI};
|
||||||
|
|
||||||
|
#[derive(Debug, Deserialize)]
|
||||||
|
pub struct UeberzugPreview {
|
||||||
|
pub scale_down_factor: f64,
|
||||||
|
pub x_offset: f64,
|
||||||
|
pub y_offset: f64,
|
||||||
|
pub width_offset: f64,
|
||||||
|
pub height_offset: f64,
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
pub struct Preview {
|
pub struct Preview {
|
||||||
pub tab_size: u32,
|
pub tab_size: u32,
|
||||||
pub max_width: u32,
|
pub max_width: u32,
|
||||||
pub max_height: u32,
|
pub max_height: u32,
|
||||||
|
|
||||||
pub cache_dir: PathBuf,
|
pub cache_dir: PathBuf,
|
||||||
|
|
||||||
|
pub ueberzug: UeberzugPreview,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Default for Preview {
|
impl Default for Preview {
|
||||||
|
|
@ -23,11 +37,13 @@ impl Default for Preview {
|
||||||
}
|
}
|
||||||
#[derive(Deserialize)]
|
#[derive(Deserialize)]
|
||||||
struct Shadow {
|
struct Shadow {
|
||||||
tab_size: u32,
|
tab_size: u32,
|
||||||
max_width: u32,
|
max_width: u32,
|
||||||
max_height: u32,
|
max_height: u32,
|
||||||
|
|
||||||
cache_dir: Option<String>,
|
cache_dir: Option<String>,
|
||||||
|
|
||||||
|
ueberzug: UeberzugPreview,
|
||||||
}
|
}
|
||||||
|
|
||||||
let preview = toml::from_str::<Outer>(&MERGED_YAZI).unwrap().preview;
|
let preview = toml::from_str::<Outer>(&MERGED_YAZI).unwrap().preview;
|
||||||
|
|
@ -41,6 +57,8 @@ impl Default for Preview {
|
||||||
max_height: preview.max_height,
|
max_height: preview.max_height,
|
||||||
|
|
||||||
cache_dir,
|
cache_dir,
|
||||||
|
|
||||||
|
ueberzug: preview.ueberzug,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue