Compare commits

...

3 Commits

Author SHA1 Message Date
2bc71a8168
Merge pull request #75 from hamirmahal/refactor/replace-get-0-with-first
refactor: replace `get(0)` with cleaner `first()`
2024-06-30 22:00:13 +03:00
Hamir Mahal
82539dc3be
refactor: replace get(0) with cleaner first() 2024-06-30 00:44:24 -07:00
Hamir Mahal
37bf4aeb40
chore: changes from formatting on save 2024-06-30 00:43:47 -07:00

View File

@ -5,7 +5,7 @@ use zbus::{
dbus_proxy, dbus_proxy,
export::futures_util::TryStreamExt, export::futures_util::TryStreamExt,
zvariant::{ObjectPath, OwnedObjectPath, Structure, Value}, zvariant::{ObjectPath, OwnedObjectPath, Structure, Value},
Connection, MessageStream, MessageType, Result Connection, MessageStream, MessageType, Result,
}; };
#[derive(Clone, Copy)] #[derive(Clone, Copy)]
@ -20,7 +20,7 @@ pub enum RecordTypes {
pub enum CursorModeTypes { pub enum CursorModeTypes {
Default, Default,
Hidden, Hidden,
Show Show,
} }
#[dbus_proxy( #[dbus_proxy(
@ -54,8 +54,12 @@ pub struct WaylandRecorder {
impl WaylandRecorder { impl WaylandRecorder {
pub async fn new() -> Self { pub async fn new() -> Self {
let connection = Connection::session().await.expect("failed to connect to session bus"); let connection = Connection::session()
let screen_cast_proxy = ScreenCastProxy::new(&connection).await.expect("failed to create dbus proxy for screen-cast"); .await
.expect("failed to connect to session bus");
let screen_cast_proxy = ScreenCastProxy::new(&connection)
.await
.expect("failed to create dbus proxy for screen-cast");
gst::init().expect("failed to initialize gstreamer"); gst::init().expect("failed to initialize gstreamer");
WaylandRecorder { WaylandRecorder {
@ -67,24 +71,37 @@ impl WaylandRecorder {
} }
} }
pub async fn start(&mut self, filename: String, record_type: RecordTypes, cursor_mode_type: CursorModeTypes) -> bool { pub async fn start(
self.screen_cast_proxy.create_session(HashMap::from([ &mut self,
("handle_token", Value::from("blue_recorder_1")), filename: String,
("session_handle_token", Value::from("blue_recorder_1")), record_type: RecordTypes,
])) cursor_mode_type: CursorModeTypes,
.await.expect("failed to create session"); ) -> bool {
self.screen_cast_proxy
.create_session(HashMap::from([
("handle_token", Value::from("blue_recorder_1")),
("session_handle_token", Value::from("blue_recorder_1")),
]))
.await
.expect("failed to create session");
let mut message_stream = MessageStream::from(self.connection.clone()); let mut message_stream = MessageStream::from(self.connection.clone());
self.filename = filename.clone(); self.filename = filename.clone();
while let Some(msg) = message_stream.try_next().await.expect("failed to get message") { while let Some(msg) = message_stream
.try_next()
.await
.expect("failed to get message")
{
match msg.message_type() { match msg.message_type() {
MessageType::Signal => { MessageType::Signal => {
let (response_num, response) = msg.body::<(u32, HashMap<&str, Value>)>().expect("failed to get body"); let (response_num, response) = msg
.body::<(u32, HashMap<&str, Value>)>()
.expect("failed to get body");
if response_num > 0 { if response_num > 0 {
return false; return false;
} }
if response.len() == 0 { if response.len() == 0 {
@ -96,14 +113,17 @@ impl WaylandRecorder {
self.screen_cast_proxy.clone(), self.screen_cast_proxy.clone(),
response.clone(), response.clone(),
record_type, record_type,
cursor_mode_type cursor_mode_type,
) )
.await.expect("failed to handle session"); .await
.expect("failed to handle session");
continue; continue;
} }
if response.contains_key("streams") { if response.contains_key("streams") {
self.record_screen_cast(response.clone()).await.expect("failed to record screen cast"); self.record_screen_cast(response.clone())
.await
.expect("failed to record screen cast");
break; break;
} }
} }
@ -124,8 +144,21 @@ impl WaylandRecorder {
} }
if self.session_path.len() > 0 { if self.session_path.len() > 0 {
println!("Closing session...: {:?}", self.session_path.replace("request", "session")); println!(
self.connection.clone().call_method(Some("org.freedesktop.portal.Desktop"), self.session_path.clone().replace("request", "session"), Some("org.freedesktop.portal.Session"), "Close", &()).await.expect("failed to close session"); "Closing session...: {:?}",
self.session_path.replace("request", "session")
);
self.connection
.clone()
.call_method(
Some("org.freedesktop.portal.Desktop"),
self.session_path.clone().replace("request", "session"),
Some("org.freedesktop.portal.Session"),
"Close",
&(),
)
.await
.expect("failed to close session");
self.session_path = String::new(); self.session_path = String::new();
} }
} }
@ -135,7 +168,7 @@ impl WaylandRecorder {
screen_cast_proxy: ScreenCastProxy<'_>, screen_cast_proxy: ScreenCastProxy<'_>,
response: HashMap<&str, Value<'_>>, response: HashMap<&str, Value<'_>>,
record_type: RecordTypes, record_type: RecordTypes,
cursor_mode_type: CursorModeTypes cursor_mode_type: CursorModeTypes,
) -> Result<()> { ) -> Result<()> {
let response_session_handle = response let response_session_handle = response
.get("session_handle") .get("session_handle")
@ -191,13 +224,13 @@ impl WaylandRecorder {
.clone() .clone()
.downcast::<Vec<Value>>() .downcast::<Vec<Value>>()
.expect("cannot down cast streams to vec array") .expect("cannot down cast streams to vec array")
.get(0) .first()
.expect("cannot get first object from streams array") .expect("cannot get first object from streams array")
.clone() .clone()
.downcast::<Structure>() .downcast::<Structure>()
.expect("cannot down cast first object to structure") .expect("cannot down cast first object to structure")
.fields() .fields()
.get(0) .first()
.expect("cannot get first field from structure") .expect("cannot get first field from structure")
.clone() .clone()
.downcast::<u32>() .downcast::<u32>()