1
0
Fork 0
forked from wry/wry
wry/src/cli.rs
2022-12-31 22:18:48 +01:00

223 lines
5.5 KiB
Rust

mod generate;
mod idle;
mod log;
mod quit;
mod run_privileged;
pub mod screenshot;
mod seat_test;
mod set_log_level;
mod unlock;
use {
crate::{compositor::start_compositor, portal},
::log::Level,
clap::{Args, Parser, Subcommand, ValueEnum},
clap_complete::Shell,
};
/// A wayland compositor.
#[derive(Parser, Debug)]
struct Jay {
#[clap(flatten)]
global: GlobalArgs,
#[clap(subcommand)]
command: Cmd,
}
#[derive(Args, Debug)]
pub struct GlobalArgs {
/// The log level.
#[clap(value_enum, long, default_value_t)]
pub log_level: CliLogLevel,
}
#[derive(Subcommand, Debug)]
pub enum Cmd {
/// Run the compositor.
Run(RunArgs),
/// Generate shell completion scripts for jay.
GenerateCompletion(GenerateArgs),
/// Open the log file.
Log(LogArgs),
/// Sets the log level.
SetLogLevel(SetLogArgs),
/// Stop the compositor.
Quit,
/// Unlocks the compositor.
Unlock,
/// Take a screenshot.
Screenshot(ScreenshotArgs),
/// Inspect/modify the idle (screensaver) settings.
Idle(IdleArgs),
/// Run a privileged program.
RunPrivileged(RunPrivilegedArgs),
/// Tests the events produced by a seat.
SeatTest(SeatTestArgs),
/// Run the desktop portal.
Portal,
#[cfg(feature = "it")]
RunTests,
}
#[derive(Args, Debug)]
pub struct IdleArgs {
/// The filename of the saved screenshot
///
/// If no filename is given, the screenshot will be saved under %Y-%m-%d-%H%M%S_jay.qoi
/// in the current directory.
///
/// The filename can contain the usual strftime parameters.
#[clap(subcommand)]
pub command: Option<IdleCmd>,
}
#[derive(Args, Debug)]
pub struct RunPrivilegedArgs {
/// The program to run
#[clap(required = true)]
pub program: Vec<String>,
}
#[derive(Subcommand, Debug)]
pub enum IdleCmd {
/// Print the idle status.
Status,
/// Set the idle interval.
Set(IdleSetArgs),
}
impl Default for IdleCmd {
fn default() -> Self {
Self::Status
}
}
#[derive(Args, Debug)]
pub struct IdleSetArgs {
/// The interval of inactivity after which to disable the screens.
///
/// This can be either a number in minutes and seconds or the keyword `disabled` to
/// disable the screensaver.
///
/// Minutes and seconds can be specified in any of the following formats:
///
/// * 1m
/// * 1m5s
/// * 1m 5s
/// * 1min 5sec
/// * 1 minute 5 seconds
#[clap(verbatim_doc_comment, required = true)]
pub interval: Vec<String>,
}
#[derive(Args, Debug)]
pub struct ScreenshotArgs {
/// The filename of the saved screenshot
///
/// If no filename is given, the screenshot will be saved under %Y-%m-%d-%H%M%S_jay.qoi
/// in the current directory.
///
/// The filename can contain the usual strftime parameters.
pub filename: Option<String>,
}
#[derive(Args, Debug, Default)]
pub struct RunArgs {
/// The backends to try.
///
/// By default, jay will try to start the available backends in this order: x11,metal.
/// The first backend that can be started will be used.
///
/// Using this option, you can change which backends will be tried and change the order in
/// which they will be tried. Multiple backends can be supplied as a comma-separated list.
#[clap(value_enum, use_value_delimiter = true, long)]
pub backends: Vec<CliBackend>,
}
#[derive(Args, Debug)]
pub struct LogArgs {
/// Print the path of the log file.
#[clap(long)]
path: bool,
/// Follow the log.
#[clap(long, short)]
follow: bool,
/// Immediately jump to the end in the pager.
#[clap(long, short = 'e')]
pager_end: bool,
}
#[derive(Args, Debug)]
pub struct SetLogArgs {
/// The new log level.
#[clap(value_enum)]
level: CliLogLevel,
}
#[derive(Args, Debug)]
pub struct SeatTestArgs {
/// Test all seats.
#[clap(long, short = 'a')]
all: bool,
/// The seat to test.
seat: Option<String>,
}
#[derive(ValueEnum, Debug, Copy, Clone, Hash, Eq, PartialEq)]
pub enum CliBackend {
X11,
Metal,
}
#[derive(ValueEnum, Debug, Copy, Clone, Hash)]
pub enum CliLogLevel {
Trace,
Debug,
Info,
Warn,
Error,
}
impl Into<Level> for CliLogLevel {
fn into(self) -> Level {
match self {
CliLogLevel::Trace => Level::Trace,
CliLogLevel::Debug => Level::Debug,
CliLogLevel::Info => Level::Info,
CliLogLevel::Warn => Level::Warn,
CliLogLevel::Error => Level::Error,
}
}
}
impl Default for CliLogLevel {
fn default() -> Self {
Self::Info
}
}
#[derive(Args, Debug)]
pub struct GenerateArgs {
/// The shell to generate completions for
#[clap(value_enum)]
shell: Shell,
}
pub fn main() {
let cli = Jay::parse();
match cli.command {
Cmd::Run(a) => start_compositor(cli.global, a),
Cmd::GenerateCompletion(g) => generate::main(g),
Cmd::Log(a) => log::main(cli.global, a),
Cmd::Quit => quit::main(cli.global),
Cmd::SetLogLevel(a) => set_log_level::main(cli.global, a),
Cmd::Screenshot(a) => screenshot::main(cli.global, a),
Cmd::Idle(a) => idle::main(cli.global, a),
Cmd::Unlock => unlock::main(cli.global),
Cmd::RunPrivileged(a) => run_privileged::main(cli.global, a),
Cmd::SeatTest(a) => seat_test::main(cli.global, a),
Cmd::Portal => portal::run(cli.global),
#[cfg(feature = "it")]
Cmd::RunTests => crate::it::run_tests(),
}
}