Merge pull request #4476 from fufesou/refact/change_resolution

change resolution, macos needs more tests
This commit is contained in:
RustDesk 2023-05-25 00:46:27 +08:00 committed by GitHub
commit cb42edd789
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 22 additions and 15 deletions

View File

@ -830,7 +830,7 @@ pub fn current_resolution(name: &str) -> ResultType<Resolution> {
bail!("Failed to find current resolution for {}", name);
}
pub fn change_resolution(name: &str, width: usize, height: usize) -> ResultType<()> {
pub fn change_resolution_directly(name: &str, width: usize, height: usize) -> ResultType<()> {
Command::new("xrandr")
.args(vec![
"--output",

View File

@ -658,7 +658,7 @@ pub fn current_resolution(name: &str) -> ResultType<Resolution> {
}
}
pub fn change_resolution(name: &str, width: usize, height: usize) -> ResultType<()> {
pub fn change_resolution_directly(name: &str, width: usize, height: usize) -> ResultType<()> {
let display = name.parse::<u32>().map_err(|e| anyhow!(e))?;
unsafe {
if NO == MacSetMode(display, width as _, height as _) {

View File

@ -44,6 +44,24 @@ pub fn breakdown_callback() {
crate::input_service::release_device_modifiers();
}
#[cfg(not(any(target_os = "android", target_os = "ios")))]
pub fn change_resolution(name: &str, width: usize, height: usize) -> ResultType<()> {
hbb_common::log::warn!("Change resolution of '{}' to ({},{})", name, width, height);
let cur_resolution = current_resolution(name)?;
// For MacOS
// to-do: Make sure the following comparison works.
// For Linux
// Just run "xrandr", dpi may not be taken into consideration.
// For Windows
// dmPelsWidth and dmPelsHeight is the same to width and height
// Because this process is running in dpi awareness mode.
if cur_resolution.width as usize == width && cur_resolution.height as usize == height {
return Ok(());
}
change_resolution_directly(name, width, height)
}
// Android
#[cfg(target_os = "android")]
pub fn get_active_username() -> String {

View File

@ -1867,10 +1867,10 @@ pub fn resolutions(name: &str) -> Vec<Resolution> {
}
pub fn current_resolution(name: &str) -> ResultType<Resolution> {
let device_name = str_to_device_name(name);
unsafe {
let mut dm: DEVMODEW = std::mem::zeroed();
dm.dmSize = std::mem::size_of::<DEVMODEW>() as _;
let device_name = str_to_device_name(name);
if EnumDisplaySettingsW(device_name.as_ptr(), ENUM_CURRENT_SETTINGS, &mut dm) == 0 {
bail!(
"failed to get currrent resolution, errno={}",
@ -1886,21 +1886,10 @@ pub fn current_resolution(name: &str) -> ResultType<Resolution> {
}
}
pub fn change_resolution(name: &str, width: usize, height: usize) -> ResultType<()> {
pub(super) fn change_resolution_directly(name: &str, width: usize, height: usize) -> ResultType<()> {
let device_name = str_to_device_name(name);
unsafe {
let mut dm: DEVMODEW = std::mem::zeroed();
if FALSE == EnumDisplaySettingsW(device_name.as_ptr() as _, ENUM_CURRENT_SETTINGS, &mut dm)
{
bail!("EnumDisplaySettingsW failed, errno={}", GetLastError());
}
// dmPelsWidth and dmPelsHeight is the same to width and height
// Because this process is running in dpi awareness mode.
if dm.dmPelsWidth == width as u32 && dm.dmPelsHeight == height as u32 {
return Ok(());
}
dm.dmPelsWidth = width as _;
dm.dmPelsHeight = height as _;
dm.dmFields = DM_PELSHEIGHT | DM_PELSWIDTH;