mirror of
https://github.com/GraphiteEditor/Graphite.git
synced 2026-09-15 22:28:10 +08:00
* mitigate resizing issue on mac and windows * adjust scroll speed for mac and win * fixup * filter out duplicate mouse move events
60 lines
1.7 KiB
Rust
60 lines
1.7 KiB
Rust
use cef::{Browser, ImplBrowser, ImplBrowserHost};
|
|
use winit::event::WindowEvent;
|
|
|
|
use crate::cef::input::InputState;
|
|
use crate::cef::ipc::{MessageType, SendMessage};
|
|
use crate::cef::{CefEventHandler, input};
|
|
|
|
use super::CefContext;
|
|
|
|
pub(super) struct SingleThreadedCefContext {
|
|
pub(super) event_handler: Box<dyn CefEventHandler>,
|
|
pub(super) browser: Browser,
|
|
pub(super) input_state: InputState,
|
|
pub(super) instance_dir: std::path::PathBuf,
|
|
}
|
|
|
|
impl CefContext for SingleThreadedCefContext {
|
|
fn work(&mut self) {
|
|
cef::do_message_loop_work();
|
|
}
|
|
|
|
fn handle_window_event(&mut self, event: &WindowEvent) {
|
|
input::handle_window_event(&self.browser, &mut self.input_state, event);
|
|
}
|
|
|
|
fn notify_view_info_changed(&self) {
|
|
let view_info = self.event_handler.view_info();
|
|
let host = self.browser.host().unwrap();
|
|
host.set_zoom_level(view_info.zoom());
|
|
host.was_resized();
|
|
|
|
// Fix for CEF not updating the view after resize on windows and mac
|
|
// TODO: remove once https://github.com/chromiumembedded/cef/issues/3822 is fixed
|
|
#[cfg(any(target_os = "windows", target_os = "macos"))]
|
|
host.invalidate(cef::PaintElementType::default());
|
|
}
|
|
|
|
fn send_web_message(&self, message: Vec<u8>) {
|
|
self.send_message(MessageType::SendToJS, &message);
|
|
}
|
|
}
|
|
|
|
impl Drop for SingleThreadedCefContext {
|
|
fn drop(&mut self) {
|
|
cef::shutdown();
|
|
std::fs::remove_dir_all(&self.instance_dir).expect("Failed to remove CEF cache directory");
|
|
}
|
|
}
|
|
|
|
impl SendMessage for SingleThreadedCefContext {
|
|
fn send_message(&self, message_type: MessageType, message: &[u8]) {
|
|
let Some(frame) = self.browser.main_frame() else {
|
|
tracing::error!("Main frame is not available, cannot send message");
|
|
return;
|
|
};
|
|
|
|
frame.send_message(message_type, message);
|
|
}
|
|
}
|