fix: the toolbar's cursor and preview options win over the config

This commit is contained in:
elwrcl committed 2026-10-03 01:41:51 +03:00
1 parent 33ce0cefa0
commit 43d56838c1
1 file changed
+90 -11
+90 -11
View File
@@ -104,6 +104,26 @@ struct Common {
/// Don't show the preview thumbnail. /// Don't show the preview thumbnail.
#[arg(long)] #[arg(long)]
no_preview: bool, no_preview: bool,
/// The toolbar's choices: unlike the flags they can also turn off what
/// the config turns on. Never set from the command line.
#[arg(skip)]
toolbar_cursor: Option<bool>,
#[arg(skip)]
toolbar_preview: Option<bool>,
}
/// Whether the cursor goes into the shot.
fn wants_cursor(common: &Common, config: &Config) -> bool {
common
.toolbar_cursor
.unwrap_or(common.cursor || config.capture.show_cursor)
}
/// Whether the preview thumbnail is shown.
fn wants_preview(common: &Common, config: &Config) -> bool {
common
.toolbar_preview
.unwrap_or(config.preview.enabled && !common.no_preview)
} }
fn parse_delay(s: &str) -> Result<Duration, String> { fn parse_delay(s: &str) -> Result<Duration, String> {
@@ -176,7 +196,8 @@ fn capture(mode: Mode, common: Common) -> Result<()> {
if let Some(delay) = common.delay { if let Some(delay) = common.delay {
std::thread::sleep(delay); std::thread::sleep(delay);
} }
let cursor = common.cursor || config.capture.show_cursor; let cursor = wants_cursor(&common, &config);
let preview = wants_preview(&common, &config);
let mut wl = Wayland::connect()?; let mut wl = Wayland::connect()?;
if let Ok(version) = niri::version() { if let Ok(version) = niri::version() {
tracing::info!("niri {version}"); tracing::info!("niri {version}");
@@ -235,8 +256,7 @@ fn capture(mode: Mode, common: Common) -> Result<()> {
let target = Target::from_args(common.output, common.clipboard_only); let target = Target::from_args(common.output, common.clipboard_only);
let (pngs, saved) = save(&shots, clip, &target, &config)?; let (pngs, saved) = save(&shots, clip, &target, &config)?;
if config.preview.enabled if preview
&& !common.no_preview
&& let Some(file) = saved && let Some(file) = saved
&& let Err(e) = hide.add(&ipc::socket_path(), &file, &source, ipc::start_host) && let Err(e) = hide.add(&ipc::socket_path(), &file, &source, ipc::start_host)
{ {
@@ -276,8 +296,10 @@ fn from_toolbar(pick: toolbar::Picked) -> (Mode, Common) {
clipboard_only: false, clipboard_only: false,
output: None, output: None,
delay: None, delay: None,
cursor: pick.cursor, cursor: false,
no_preview: !pick.preview, no_preview: false,
toolbar_cursor: Some(pick.cursor),
toolbar_preview: Some(pick.preview),
}; };
(mode, common) (mode, common)
} }
@@ -391,7 +413,10 @@ mod tests {
}; };
let (mode, common) = from_toolbar(pick(T::Screen, true, false)); let (mode, common) = from_toolbar(pick(T::Screen, true, false));
assert!(matches!(mode, Mode::Screen { all: false })); assert!(matches!(mode, Mode::Screen { all: false }));
assert!(common.cursor && common.no_preview); assert_eq!(
(common.toolbar_cursor, common.toolbar_preview),
(Some(true), Some(false))
);
assert!(matches!( assert!(matches!(
from_toolbar(pick(T::Window, false, true)).0, from_toolbar(pick(T::Window, false, true)).0,
Mode::Window Mode::Window
@@ -402,12 +427,66 @@ mod tests {
)); ));
let (mode, common) = from_toolbar(pick(T::Zoom, false, true)); let (mode, common) = from_toolbar(pick(T::Zoom, false, true));
assert!(matches!(mode, Mode::Zoom)); assert!(matches!(mode, Mode::Zoom));
assert!( assert_eq!(
!common.cursor (common.toolbar_cursor, common.toolbar_preview),
&& !common.no_preview (Some(false), Some(true))
&& common.delay.is_none()
&& common.output.is_none()
); );
assert!(common.delay.is_none() && common.output.is_none());
}
#[test]
fn toolbar_options_win_over_the_config_both_ways() {
use toolbar::state::Mode as T;
let mut on = Config::default();
on.capture.show_cursor = true;
on.preview.enabled = true;
let mut off = Config::default();
off.capture.show_cursor = false;
off.preview.enabled = false;
let pick = |cursor, preview| {
from_toolbar(toolbar::Picked {
mode: T::Screen,
cursor,
preview,
})
.1
};
assert!(
!wants_cursor(&pick(false, false), &on),
"unticked beats the config"
);
assert!(!wants_preview(&pick(false, false), &on));
assert!(
wants_cursor(&pick(true, true), &off),
"ticked beats the config"
);
assert!(wants_preview(&pick(true, true), &off));
}
#[test]
fn the_command_line_still_follows_the_config() {
let cli = |args: &[&str]| match Cli::try_parse_from(
std::iter::once("valw").chain(args.iter().copied()),
)
.unwrap()
.command
{
Command::Screen { common, .. } => common,
_ => unreachable!(),
};
let mut on = Config::default();
on.capture.show_cursor = true;
assert!(wants_cursor(&cli(&["screen"]), &on));
assert!(wants_cursor(
&cli(&["screen", "--cursor"]),
&Config::default()
));
assert!(!wants_cursor(&cli(&["screen"]), &Config::default()));
assert!(wants_preview(&cli(&["screen"]), &Config::default()));
assert!(!wants_preview(
&cli(&["screen", "--no-preview"]),
&Config::default()
));
} }
#[test] #[test]