use std::error::Error;
use smithay_client_toolkit::{
delegate_output, delegate_registry,
output::{OutputHandler, OutputInfo, OutputState},
registry::{ProvidesRegistryState, RegistryState},
registry_handlers,
};
use wayland_client::{globals::registry_queue_init, protocol::wl_output, Connection, QueueHandle};
fn main() -> Result<(), Box<dyn Error>> {
env_logger::init();
let conn = Connection::connect_to_env()?;
let (globals, mut event_queue) = registry_queue_init(&conn).unwrap();
let qh = event_queue.handle();
let registry_state = RegistryState::new(&globals);
let output_delegate = OutputState::new(&globals, &qh);
let mut list_outputs = ListOutputs { registry_state, output_state: output_delegate };
event_queue.roundtrip(&mut list_outputs)?;
for output in list_outputs.output_state.outputs() {
print_output(
&list_outputs
.output_state
.info(&output)
.ok_or_else(|| "output has no info".to_owned())?,
);
}
Ok(())
}
struct ListOutputs {
registry_state: RegistryState,
output_state: OutputState,
}
impl OutputHandler for ListOutputs {
fn output_state(&mut self) -> &mut OutputState {
&mut self.output_state
}
fn new_output(
&mut self,
_conn: &Connection,
_qh: &QueueHandle<Self>,
_output: wl_output::WlOutput,
) {
}
fn update_output(
&mut self,
_conn: &Connection,
_qh: &QueueHandle<Self>,
_output: wl_output::WlOutput,
) {
}
fn output_destroyed(
&mut self,
_conn: &Connection,
_qh: &QueueHandle<Self>,
_output: wl_output::WlOutput,
) {
}
}
delegate_output!(ListOutputs);
delegate_registry!(ListOutputs);
impl ProvidesRegistryState for ListOutputs {
fn registry(&mut self) -> &mut RegistryState {
&mut self.registry_state
}
registry_handlers! {
OutputState,
}
}
fn print_output(info: &OutputInfo) {
println!("{}", info.model);
if let Some(name) = info.name.as_ref() {
println!("\tname: {name}");
}
if let Some(description) = info.description.as_ref() {
println!("\tdescription: {description}");
}
println!("\tmake: {}", info.make);
println!("\tx: {}, y: {}", info.location.0, info.location.1);
println!("\tsubpixel: {:?}", info.subpixel);
println!("\tphysical_size: {}×{}mm", info.physical_size.0, info.physical_size.1);
if let Some((x, y)) = info.logical_position.as_ref() {
println!("\tlogical x: {x}, y: {y}");
}
if let Some((width, height)) = info.logical_size.as_ref() {
println!("\tlogical width: {width}, height: {height}");
}
println!("\tmodes:");
for mode in &info.modes {
println!("\t\t{mode}");
}
}