|
|
|
@ -193,21 +193,15 @@ fn parse_contents(contents: String) -> Result<Vec<Hotkey>, Error> {
|
|
|
|
|
let (keysym, modifiers) =
|
|
|
|
|
parse_keybind(lines[i], real_line_no, &key_to_evdev_key, &mod_to_mod_enum)?;
|
|
|
|
|
|
|
|
|
|
// Error if keybind line is at the very last line
|
|
|
|
|
// ( It's impossible for there to be a command )
|
|
|
|
|
if i >= lines.len() - 1 {
|
|
|
|
|
return Err(Error::InvalidConfig(ParseError::MissingCommand(real_line_no)));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Error if the command doesn't start with whitespace
|
|
|
|
|
// OR is not a blank command
|
|
|
|
|
if (!lines[i + 1].starts_with(' ') && !lines[i + 1].starts_with('\t'))
|
|
|
|
|
&& !lines[i + 1].trim().is_empty()
|
|
|
|
|
{
|
|
|
|
|
return Err(Error::InvalidConfig(ParseError::CommandWithoutWhitespace(
|
|
|
|
|
real_line_no + 1,
|
|
|
|
|
)));
|
|
|
|
|
}
|
|
|
|
|
// if (!lines[i + 1].starts_with(' ') && !lines[i + 1].starts_with('\t'))
|
|
|
|
|
// && !lines[i + 1].trim().is_empty()
|
|
|
|
|
// {
|
|
|
|
|
// return Err(Error::InvalidConfig(ParseError::CommandWithoutWhitespace(
|
|
|
|
|
// real_line_no + 1,
|
|
|
|
|
// )));
|
|
|
|
|
// }
|
|
|
|
|
|
|
|
|
|
// Parse the command, also handling multiline commands
|
|
|
|
|
let mut command = String::new();
|
|
|
|
@ -326,9 +320,7 @@ mod tests {
|
|
|
|
|
assert!(result.is_err());
|
|
|
|
|
|
|
|
|
|
match result.unwrap_err() {
|
|
|
|
|
Error::ConfigNotFound => {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
Error::ConfigNotFound => {}
|
|
|
|
|
_ => {
|
|
|
|
|
panic!("Error type for nonexistent file is wrong.");
|
|
|
|
|
}
|
|
|
|
@ -534,7 +526,8 @@ pesto
|
|
|
|
|
eval_invalid_config_test(contents, ParseError::UnknownSymbol(5))
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
|
#[ignore]
|
|
|
|
|
// if a line do not start with whitespace, it is treated as a key. So we'll expect a invalid key error here
|
|
|
|
|
fn test_command_without_whitespace() -> std::io::Result<()> {
|
|
|
|
|
let contents = "0
|
|
|
|
|
firefox
|
|
|
|
@ -543,21 +536,22 @@ pesto
|
|
|
|
|
brave
|
|
|
|
|
";
|
|
|
|
|
|
|
|
|
|
eval_invalid_config_test(contents, ParseError::CommandWithoutWhitespace(5))
|
|
|
|
|
eval_invalid_config_test(contents, ParseError::UnknownSymbol(4))
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
|
fn test_eofed_keybinding() -> std::io::Result<()> {
|
|
|
|
|
let contents = "
|
|
|
|
|
k
|
|
|
|
|
xbacklight -inc 10 -fps 30 -time 200
|
|
|
|
|
// #[test]
|
|
|
|
|
// fn test_eofed_keybinding() -> std::io::Result<()> {
|
|
|
|
|
// let contents = "
|
|
|
|
|
// k
|
|
|
|
|
// xbacklight -inc 10 -fps 30 -time 200
|
|
|
|
|
|
|
|
|
|
c ";
|
|
|
|
|
// c ";
|
|
|
|
|
|
|
|
|
|
eval_invalid_config_test(contents, ParseError::MissingCommand(5))
|
|
|
|
|
}
|
|
|
|
|
// eval_invalid_config_test(contents, ParseError::MissingCommand(5))
|
|
|
|
|
// }
|
|
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
|
#[ignore]
|
|
|
|
|
// keysyms not followed by command should be ignored
|
|
|
|
|
fn test_no_command() -> std::io::Result<()> {
|
|
|
|
|
let contents = "
|
|
|
|
|
k
|
|
|
|
@ -569,14 +563,11 @@ w
|
|
|
|
|
|
|
|
|
|
eval_config_test(
|
|
|
|
|
contents,
|
|
|
|
|
vec![
|
|
|
|
|
Hotkey::new(
|
|
|
|
|
evdev::Key::KEY_K,
|
|
|
|
|
vec![],
|
|
|
|
|
"xbacklight -inc 10 -fps 30 -time 200".to_string(),
|
|
|
|
|
),
|
|
|
|
|
Hotkey::new(evdev::Key::KEY_W, vec![], "".to_string()),
|
|
|
|
|
],
|
|
|
|
|
vec![Hotkey::new(
|
|
|
|
|
evdev::Key::KEY_K,
|
|
|
|
|
vec![],
|
|
|
|
|
"xbacklight -inc 10 -fps 30 -time 200".to_string(),
|
|
|
|
|
)],
|
|
|
|
|
)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|