diff options
author | bnewbold <bnewbold@robocracy.org> | 2016-06-12 20:26:09 -0400 |
---|---|---|
committer | bnewbold <bnewbold@robocracy.org> | 2016-06-12 20:32:37 -0400 |
commit | 730796a80d0eca520713c20971958e778ee06b67 (patch) | |
tree | df7ec8b2eb0cb76c5e3594d8d46dd88295954a59 /src | |
parent | 5cc79f64ab0c310a76c5930ff6d51b4547a97ef4 (diff) | |
download | exuberant-hacks-730796a80d0eca520713c20971958e778ee06b67.tar.gz exuberant-hacks-730796a80d0eca520713c20971958e778ee06b67.zip |
basic command line args
Diffstat (limited to 'src')
-rw-r--r-- | src/main.rs | 59 |
1 files changed, 48 insertions, 11 deletions
diff --git a/src/main.rs b/src/main.rs index f393f9d..e07c972 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,10 +1,14 @@ #[macro_use] extern crate glium; + extern crate image; +extern crate getopts; use std::env; use std::u64; +use std::process::exit; +use getopts::Options; use glium::glutin::os::unix::WindowBuilderExt; mod util; @@ -182,21 +186,54 @@ fn run(window_id: Option<u64>) { } +fn print_usage(program: &str, opts: Options) { + let brief = format!("Usage: {} [options]", program); + print!("{}", opts.usage(&brief)); +} + fn main() { let args: Vec<String> = env::args().collect(); - - let window_id: Option<u64> = { - if args.len() >= 2 { - let parsed = if (&args[1]).starts_with("0x") { - u64::from_str_radix(args[1].trim_left_matches('0').trim_left_matches('x'), 16) - } else { - args[1].parse::<u64>() - }; - Some(parsed.expect("Failed to parse numerical arg")) - } else { - None + let program = args[0].clone(); + + // Turn, eg, "-root" into "--root" + let args = util::convert_xscreensaver_args(args); + + let mut opts = Options::new(); + opts.optflag("h", "help", "print this help menu"); + opts.optflag("", "window", "run in a window (IGNORED)"); + opts.optflag("", "root", "run in root window (IGNORED)"); + opts.optopt("", "window-id", "X window id number", "NUM"); + + let matches = match opts.parse(&args[1..]) { + Ok(m) => { m } + Err(f) => { + print_usage(&program, opts); + println!(""); + println!("{}", f.to_string()); + exit(-1); } }; + if matches.opt_present("help") { + print_usage(&program, opts); + exit(0); + } + + // if no "--window-id", try environment variable (arg has priority though) + let window_id_string: Option<String> = + matches.opt_str("window-id") + .or(env::var("XSCREENSAVER_WINDOW").ok()); + + let window_id = window_id_string.map(|id| match util::dechex2u64(&id) { + Ok(y) => y, + Err(e) => { + println!("Couldn't parse numerical argument: {}", e); + exit(-1); }, + }); + + if window_id.is_some() { + println!("Drawing on existing X window: 0x{:07X}", window_id.unwrap()); + } + run(window_id); } |