Files
Graphite/desktop/ui/src/delegate.rs
Timon ba0a97aefe Desktop: Isolate CEF-rendered UI into separate crate and process (#4321)
* Extract CEF rendered UI into a separate process and crate

* Review

* Review

* Review

* Review

* Remove necessary workarounds

* Block on frame copy ack

* Crop and resample frames correctly

* Skip blank frames

* Fix deps

* Fix fmt

* Fix clippy warning

* Review

* Fix todo
2026-07-14 14:51:20 -07:00

60 lines
1.6 KiB
Rust

use ipc_channel::ipc::IpcSender;
use std::path::PathBuf;
use std::sync::mpsc::Receiver;
use std::sync::{Arc, Mutex};
use super::remote::messages::EventMessage;
use super::view::{ViewInfo, ViewInfoReceiver, ViewInfoUpdate};
use crate::Cursor;
#[derive(Clone)]
pub(crate) struct BrowserDelegate(Arc<Inner>);
struct Inner {
sender: Arc<Mutex<IpcSender<EventMessage>>>,
view_info: Mutex<ViewInfoReceiver>,
}
impl BrowserDelegate {
pub(crate) fn new(sender: Arc<Mutex<IpcSender<EventMessage>>>, view_info_receiver: Receiver<ViewInfoUpdate>) -> Self {
Self(Arc::new(Inner {
sender,
view_info: Mutex::new(ViewInfoReceiver::new(view_info_receiver)),
}))
}
fn send(&self, message: EventMessage) {
let Ok(sender) = self.0.sender.lock() else {
tracing::error!("Failed to lock host message sender");
return;
};
if let Err(e) = sender.send(message) {
tracing::debug!("Failed to send message to main process: {e}");
}
}
pub(crate) fn view_info(&self) -> ViewInfo {
let Ok(mut guard) = self.0.view_info.lock() else {
tracing::error!("Failed to lock the view info mirror");
return ViewInfo::new();
};
guard.current()
}
pub(crate) fn load_resource(&self, path: PathBuf) -> Option<crate::resources::Resource> {
crate::resources::load(path)
}
pub(crate) fn cursor_change(&self, cursor: Cursor) {
self.send(EventMessage::CursorChange(cursor));
}
pub(crate) fn initialized_web_communication(&self) {
self.send(EventMessage::WebCommunicationInitialized);
}
pub(crate) fn receive_web_message(&self, message: &[u8]) {
self.send(EventMessage::WebMessage(message.to_vec()));
}
}