2022-04-19 00:26:10 +00:00
|
|
|
|
use xcb::Xid;
|
|
|
|
|
|
2022-04-16 02:52:53 +00:00
|
|
|
|
extern crate libc;
|
|
|
|
|
extern crate xcb;
|
|
|
|
|
|
|
|
|
|
fn status_map(status: xcb::randr::SetConfig) -> &'static str {
|
|
|
|
|
match status {
|
|
|
|
|
xcb::randr::SetConfig::Success => "success",
|
|
|
|
|
xcb::randr::SetConfig::InvalidConfigTime => "invalid config time",
|
|
|
|
|
xcb::randr::SetConfig::InvalidTime => "invalid time",
|
|
|
|
|
xcb::randr::SetConfig::Failed => "failed",
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
fn rotation_map(rotation: xcb::randr::Rotation) -> &'static str {
|
|
|
|
|
match rotation {
|
|
|
|
|
xcb::randr::Rotation::ROTATE_0 => "normal",
|
|
|
|
|
xcb::randr::Rotation::ROTATE_90 => "portrait",
|
|
|
|
|
xcb::randr::Rotation::ROTATE_180 => "inverted",
|
|
|
|
|
xcb::randr::Rotation::ROTATE_270 => "portrait inverted",
|
|
|
|
|
_ => "unknown",
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
fn display_one_output(
|
|
|
|
|
conn: &xcb::Connection,
|
2022-04-19 00:26:10 +00:00
|
|
|
|
cookie: xcb::randr::GetOutputInfoCookie,
|
2022-04-16 02:52:53 +00:00
|
|
|
|
timestamp: xcb::x::Timestamp,
|
|
|
|
|
) {
|
2022-04-19 00:26:10 +00:00
|
|
|
|
let output = conn.wait_for_reply(cookie).unwrap();
|
|
|
|
|
if !(output.connection() == xcb::randr::Connection::Connected) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
println!("Display: {}", std::str::from_utf8(output.name()).unwrap());
|
|
|
|
|
if output.crtc().resource_id() == 0 {
|
|
|
|
|
println!("(no monitor found)\n");
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
2022-04-16 02:52:53 +00:00
|
|
|
|
let crtc = conn
|
|
|
|
|
.wait_for_reply(conn.send_request(&xcb::randr::GetCrtcInfo {
|
|
|
|
|
crtc: output.crtc(),
|
|
|
|
|
config_timestamp: timestamp,
|
|
|
|
|
}))
|
|
|
|
|
.unwrap();
|
|
|
|
|
|
|
|
|
|
println!(
|
2022-04-19 00:26:10 +00:00
|
|
|
|
"x: {}, y: {}, W×H: {}×{}, status: {}, rotation: {}\n",
|
2022-04-16 02:52:53 +00:00
|
|
|
|
crtc.x(),
|
|
|
|
|
crtc.y(),
|
|
|
|
|
crtc.width(),
|
|
|
|
|
crtc.height(),
|
|
|
|
|
status_map(crtc.status()),
|
|
|
|
|
rotation_map(crtc.rotation()),
|
|
|
|
|
)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
fn display_outputs(
|
|
|
|
|
conn: &xcb::Connection,
|
|
|
|
|
screen: &xcb::randr::GetScreenResourcesReply,
|
|
|
|
|
timestamp: xcb::x::Timestamp,
|
|
|
|
|
) {
|
2022-04-19 00:26:10 +00:00
|
|
|
|
let output_cookies = screen.outputs().iter().map(|output| {
|
|
|
|
|
conn.send_request(&xcb::randr::GetOutputInfo {
|
|
|
|
|
output: *output,
|
|
|
|
|
config_timestamp: timestamp,
|
2022-04-16 02:52:53 +00:00
|
|
|
|
})
|
2022-04-19 00:26:10 +00:00
|
|
|
|
});
|
2022-04-16 02:52:53 +00:00
|
|
|
|
|
2022-04-19 00:26:10 +00:00
|
|
|
|
for cookie in output_cookies {
|
|
|
|
|
display_one_output(conn, cookie, timestamp)
|
2022-04-16 02:52:53 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
fn get_screen_resources(
|
|
|
|
|
conn: &xcb::Connection,
|
|
|
|
|
root: &xcb::x::Window,
|
|
|
|
|
) -> xcb::randr::GetScreenResourcesReply {
|
|
|
|
|
conn.wait_for_reply(conn.send_request(&xcb::randr::GetScreenResources { window: *root }))
|
|
|
|
|
.unwrap()
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
fn display_xrandr_version(conn: &xcb::Connection) {
|
|
|
|
|
let randr_version = conn
|
|
|
|
|
.wait_for_reply(conn.send_request(&xcb::randr::QueryVersion {
|
|
|
|
|
major_version: xcb::randr::MAJOR_VERSION,
|
|
|
|
|
minor_version: xcb::randr::MINOR_VERSION,
|
|
|
|
|
}))
|
|
|
|
|
.unwrap();
|
|
|
|
|
|
|
|
|
|
println!(
|
|
|
|
|
"RandR Version {}.{}",
|
|
|
|
|
randr_version.major_version(),
|
|
|
|
|
randr_version.minor_version()
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
fn main() {
|
|
|
|
|
let (x_connection, screen_num) = xcb::Connection::connect(None).unwrap();
|
|
|
|
|
let setup = x_connection.get_setup();
|
|
|
|
|
let screen = setup.roots().nth(screen_num as usize).unwrap();
|
|
|
|
|
println!(
|
|
|
|
|
"{} x {}",
|
|
|
|
|
screen.width_in_pixels(),
|
|
|
|
|
screen.height_in_pixels()
|
|
|
|
|
);
|
|
|
|
|
display_xrandr_version(&x_connection);
|
|
|
|
|
let screen_resources = get_screen_resources(&x_connection, &screen.root());
|
|
|
|
|
let timestamp = screen_resources.config_timestamp();
|
|
|
|
|
display_outputs(&x_connection, &screen_resources, timestamp);
|
|
|
|
|
}
|