linux x11 resolution

Signed-off-by: 21pages <pages21@163.com>
This commit is contained in:
21pages
2023-02-11 19:04:33 +08:00
parent 91a2a5b56e
commit 18a66749a1
7 changed files with 180 additions and 7 deletions

View File

@@ -1,7 +1,7 @@
use super::{CursorData, ResultType};
use hbb_common::libc::{c_char, c_int, c_long, c_void};
pub use hbb_common::platform::linux::*;
use hbb_common::{allow_err, bail, log};
use hbb_common::{allow_err, anyhow::anyhow, bail, log, message_proto::Resolution};
use std::{
cell::RefCell,
path::PathBuf,
@@ -10,6 +10,7 @@ use std::{
Arc,
},
};
use xrandr_parser::Parser;
type Xdo = *const c_void;
@@ -641,3 +642,55 @@ pub fn get_double_click_time() -> u32 {
double_click_time
}
}
pub fn resolutions(name: &str) -> Vec<Resolution> {
let mut v = vec![];
let mut parser = Parser::new();
if parser.parse().is_ok() {
if let Ok(connector) = parser.get_connector(name) {
if let Ok(resolutions) = &connector.available_resolutions() {
for r in resolutions {
if let Ok(width) = r.horizontal.parse::<i32>() {
if let Ok(height) = r.vertical.parse::<i32>() {
let resolution = Resolution {
width,
height,
..Default::default()
};
if !v.contains(&resolution) {
v.push(resolution);
}
}
}
}
}
}
}
v
}
pub fn current_resolution(name: &str) -> ResultType<Resolution> {
let mut parser = Parser::new();
parser.parse().map_err(|e| anyhow!(e))?;
let connector = parser.get_connector(name).map_err(|e| anyhow!(e))?;
let r = connector.current_resolution();
let width = r.horizontal.parse::<i32>()?;
let height = r.vertical.parse::<i32>()?;
Ok(Resolution {
width,
height,
..Default::default()
})
}
pub fn change_resolution(name: &str, width: usize, height: usize) -> ResultType<()> {
std::process::Command::new("xrandr")
.args(vec![
"--output",
name,
"--mode",
&format!("{}x{}", width, height),
])
.spawn()?;
Ok(())
}