init wayland to update var 'cursor embeded'

Signed-off-by: fufesou <shuanglongchen@yeah.net>
This commit is contained in:
fufesou 2023-01-28 22:19:28 +08:00
parent 7e0c9e17df
commit b84f3ba1ee
5 changed files with 28 additions and 7 deletions

View File

@ -12,7 +12,7 @@ cfg_if! {
mod x11; mod x11;
pub use self::linux::*; pub use self::linux::*;
pub use self::x11::Frame; pub use self::x11::Frame;
pub use self::wayland::set_map_err; pub use self::wayland::{set_map_err, detect_cursor_embeded};
} else { } else {
mod x11; mod x11;
pub use self::x11::*; pub use self::x11::*;
@ -76,7 +76,7 @@ pub fn is_cursor_embedded() -> bool {
if is_x11() { if is_x11() {
x11::IS_CURSOR_EMBEDDED x11::IS_CURSOR_EMBEDDED
} else { } else {
wayland::IS_CURSOR_EMBEDDED unsafe { wayland::IS_CURSOR_EMBEDDED }
} }
} }

View File

@ -4,12 +4,26 @@ use std::{io, sync::RwLock, time::Duration};
pub struct Capturer(Display, Box<dyn Recorder>, bool, Vec<u8>); pub struct Capturer(Display, Box<dyn Recorder>, bool, Vec<u8>);
pub const IS_CURSOR_EMBEDDED: bool = true; pub static mut IS_CURSOR_EMBEDDED: bool = true;
lazy_static::lazy_static! { lazy_static::lazy_static! {
static ref MAP_ERR: RwLock<Option<fn(err: String)-> io::Error>> = Default::default(); static ref MAP_ERR: RwLock<Option<fn(err: String)-> io::Error>> = Default::default();
} }
pub fn detect_cursor_embeded() {
if unsafe { IS_CURSOR_EMBEDDED } {
use crate::common::wayland::pipewire::get_available_cursor_modes;
match get_available_cursor_modes() {
Ok(modes) => unsafe {
IS_CURSOR_EMBEDDED = (modes & 0x02) > 0;
},
Err(..) => unsafe {
IS_CURSOR_EMBEDDED = false;
},
}
}
}
pub fn set_map_err(f: fn(err: String) -> io::Error) { pub fn set_map_err(f: fn(err: String) -> io::Error) {
*MAP_ERR.write().unwrap() = Some(f); *MAP_ERR.write().unwrap() = Some(f);
} }
@ -74,7 +88,7 @@ impl Display {
} }
pub fn all() -> io::Result<Vec<Display>> { pub fn all() -> io::Result<Vec<Display>> {
Ok(pipewire::get_capturables(true) Ok(pipewire::get_capturables(unsafe { IS_CURSOR_EMBEDDED })
.map_err(map_err)? .map_err(map_err)?
.drain(..) .drain(..)
.map(|x| Display(x)) .map(|x| Display(x))

View File

@ -415,6 +415,12 @@ static mut INIT: bool = false;
const RESTORE_TOKEN: &str = "restore_token"; const RESTORE_TOKEN: &str = "restore_token";
const RESTORE_TOKEN_CONF_KEY: &str = "wayland-restore-token"; const RESTORE_TOKEN_CONF_KEY: &str = "wayland-restore-token";
pub fn get_available_cursor_modes() -> Result<u32, dbus::Error> {
let conn = SyncConnection::new_session()?;
let portal = get_portal(&conn);
portal.available_cursor_modes()
}
// mostly inspired by https://gitlab.gnome.org/snippets/19 // mostly inspired by https://gitlab.gnome.org/snippets/19
fn request_screen_cast( fn request_screen_cast(
capture_cursor: bool, capture_cursor: bool,

View File

@ -52,7 +52,7 @@ pub fn global_init() -> bool {
#[cfg(target_os = "linux")] #[cfg(target_os = "linux")]
{ {
if !*IS_X11 { if !*IS_X11 {
crate::server::wayland::set_wayland_scrap_map_err(); crate::server::wayland::init();
} }
} }
true true

View File

@ -1,6 +1,6 @@
use super::*; use super::*;
use hbb_common::{allow_err, platform::linux::DISTRO}; use hbb_common::{allow_err, platform::linux::DISTRO};
use scrap::{set_map_err, Capturer, Display, Frame, TraitCapturer}; use scrap::{detect_cursor_embeded, set_map_err, Capturer, Display, Frame, TraitCapturer};
use std::io; use std::io;
use super::video_service::{ use super::video_service::{
@ -12,7 +12,8 @@ lazy_static::lazy_static! {
static ref LOG_SCRAP_COUNT: Mutex<u32> = Mutex::new(0); static ref LOG_SCRAP_COUNT: Mutex<u32> = Mutex::new(0);
} }
pub fn set_wayland_scrap_map_err() { pub fn init() {
detect_cursor_embeded();
set_map_err(map_err_scrap); set_map_err(map_err_scrap);
} }