fix: the toolbar's cursor and preview options win over the config
This commit is contained in:
1 parent
33ce0cefa0
commit
43d56838c1
1 file changed
+90
-11
+90
-11
@@ -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]
|
||||||
|
|||||||
Reference in new issue
Block a user