Skip to content

Commit 478f553

Browse files
committed
Cleanup event handling
1 parent 9f6b7be commit 478f553

File tree

8 files changed

+85
-81
lines changed

8 files changed

+85
-81
lines changed

desktop/src/app.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ impl ApplicationHandler<CustomEvent> for WinitApp {
7676
}
7777

7878
fn window_event(&mut self, event_loop: &ActiveEventLoop, _window_id: WindowId, event: WindowEvent) {
79-
self.cef_context.handle_window_event(&event);
79+
let Some(event) = self.cef_context.handle_window_event(event) else { return };
8080

8181
match event {
8282
WindowEvent::CloseRequested => {
@@ -98,6 +98,7 @@ impl ApplicationHandler<CustomEvent> for WinitApp {
9898
}
9999
})
100100
.unwrap();
101+
self.cef_context.notify_of_resize();
101102
}
102103

103104
WindowEvent::RedrawRequested => {

desktop/src/cef/context.rs

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
use cef::sys::CEF_API_VERSION_LAST;
22
use cef::{Browser, CefString, Settings, api_hash, args::Args, execute_process};
3-
use cef::{BrowserSettings, DictionaryValue, ImplCommandLine, RequestContext, WindowInfo, browser_host_create_browser_sync, initialize};
3+
use cef::{BrowserSettings, DictionaryValue, ImplBrowser, ImplBrowserHost, ImplCommandLine, RenderHandler, RequestContext, WindowInfo, browser_host_create_browser_sync, initialize};
44
use thiserror::Error;
55
use winit::event::WindowEvent;
66

7-
use super::EventHandler;
7+
use super::CefEventHandler;
88
use super::input::{InputState, handle_window_event};
99

1010
use super::internal::{AppImpl, ClientImpl, NonBrowserAppImpl, RenderHandlerImpl};
@@ -62,7 +62,7 @@ impl Context<Setup> {
6262
})
6363
}
6464

65-
pub(crate) fn init(self, event_handler: impl EventHandler) -> Result<Context<Initialized>, InitError> {
65+
pub(crate) fn init(self, event_handler: impl CefEventHandler) -> Result<Context<Initialized>, InitError> {
6666
let settings = Settings {
6767
windowless_rendering_enabled: 1,
6868
multi_threaded_message_loop: 0,
@@ -78,7 +78,7 @@ impl Context<Setup> {
7878
}
7979

8080
let render_handler = RenderHandlerImpl::new(event_handler.clone());
81-
let mut client = ClientImpl::new(render_handler);
81+
let mut client = ClientImpl::new(RenderHandler::new(render_handler));
8282

8383
let url = CefString::from("graphite://frontend/");
8484

@@ -116,8 +116,14 @@ impl Context<Initialized> {
116116
cef::do_message_loop_work();
117117
}
118118

119-
pub(crate) fn handle_window_event(&mut self, event: &WindowEvent) {
120-
handle_window_event(self, event);
119+
pub(crate) fn handle_window_event(&mut self, event: WindowEvent) -> Option<WindowEvent> {
120+
handle_window_event(self, event)
121+
}
122+
123+
pub(crate) fn notify_of_resize(&self) {
124+
if let Some(browser) = &self.browser {
125+
browser.host().unwrap().was_resized();
126+
}
121127
}
122128
}
123129

desktop/src/cef/input/mod.rs

Lines changed: 25 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -8,20 +8,15 @@ use super::context::{Context, Initialized};
88
mod keymap;
99
use keymap::{ToDomBits, ToVKBits};
1010

11-
pub(crate) fn handle_window_event(context: &mut Context<Initialized>, event: &WindowEvent) {
11+
pub(crate) fn handle_window_event(context: &mut Context<Initialized>, event: WindowEvent) -> Option<WindowEvent> {
1212
match event {
13-
WindowEvent::Resized(_) => {
14-
if let Some(browser) = &context.browser {
15-
browser.host().unwrap().was_resized();
16-
}
17-
}
1813
WindowEvent::CursorMoved { position, .. } => {
1914
if let Some(browser) = &context.browser {
2015
if let Some(host) = browser.host() {
2116
host.set_focus(1);
2217
}
2318

24-
context.input_state.update_mouse_position(position);
19+
context.input_state.update_mouse_position(&position);
2520
let mouse_event: MouseEvent = (&context.input_state).into();
2621
browser.host().unwrap().send_mouse_move_event(Some(&mouse_event), 0);
2722
}
@@ -89,7 +84,7 @@ pub(crate) fn handle_window_event(context: &mut Context<Initialized>, event: &Wi
8984
let line_width = 40; //feels about right, TODO: replace with correct value
9085
let line_height = 30; //feels about right, TODO: replace with correct value
9186
let (delta_x, delta_y) = match delta {
92-
MouseScrollDelta::LineDelta(x, y) => (*x * line_width as f32, *y * line_height as f32),
87+
MouseScrollDelta::LineDelta(x, y) => (x * line_width as f32, y * line_height as f32),
9388
MouseScrollDelta::PixelDelta(physical_position) => (physical_position.x as f32, physical_position.y as f32),
9489
};
9590
host.send_mouse_wheel_event(Some(&mouse_event), delta_x as i32, delta_y as i32);
@@ -117,14 +112,16 @@ pub(crate) fn handle_window_event(context: &mut Context<Initialized>, event: &Wi
117112
let char = str.chars().next().unwrap_or('\0');
118113
(None, Some(char))
119114
}
120-
_ => return,
115+
_ => return None,
121116
};
122117

123-
let mut key_event = KeyEvent::default();
124-
key_event.size = std::mem::size_of::<KeyEvent>();
125-
key_event.focus_on_editable_field = 1;
126-
key_event.modifiers = context.input_state.cef_modifiers(&event.location, event.repeat).raw();
127-
key_event.is_system_key = 0;
118+
let mut key_event = KeyEvent {
119+
size: size_of::<KeyEvent>(),
120+
focus_on_editable_field: 1,
121+
modifiers: context.input_state.cef_modifiers(&event.location, event.repeat).raw(),
122+
is_system_key: 0,
123+
..Default::default()
124+
};
128125

129126
if let Some(named_key) = named_key {
130127
key_event.native_key_code = named_key.to_dom_bits();
@@ -142,10 +139,10 @@ pub(crate) fn handle_window_event(context: &mut Context<Initialized>, event: &Wi
142139
if let Some(char) = character {
143140
let mut buf = [0; 2];
144141
char.encode_utf16(&mut buf);
145-
key_event.character = buf[0] as u16;
142+
key_event.character = buf[0];
146143
let mut buf = [0; 2];
147144
char.to_lowercase().next().unwrap().encode_utf16(&mut buf);
148-
key_event.unmodified_character = buf[0] as u16;
145+
key_event.unmodified_character = buf[0];
149146

150147
key_event.type_ = KeyEventType::from(cef_key_event_type_t::KEYEVENT_CHAR);
151148
host.send_key_event(Some(&key_event));
@@ -159,8 +156,9 @@ pub(crate) fn handle_window_event(context: &mut Context<Initialized>, event: &Wi
159156
}
160157
}
161158
}
162-
_ => {}
159+
e => return Some(e),
163160
}
161+
None
164162
}
165163

166164
#[derive(Default, Clone)]
@@ -194,7 +192,7 @@ pub(crate) struct InputState {
194192

195193
impl InputState {
196194
fn update_modifiers(&mut self, modifiers: &winit::keyboard::ModifiersState) {
197-
self.modifiers = modifiers.clone();
195+
self.modifiers = *modifiers;
198196
}
199197

200198
fn update_mouse_position(&mut self, position: &PhysicalPosition<f64>) {
@@ -206,26 +204,26 @@ impl InputState {
206204
}
207205

208206
fn cef_modifiers(&self, location: &winit::keyboard::KeyLocation, is_repeat: bool) -> CefModifiers {
209-
CefModifiers::new(&self, location, is_repeat)
207+
CefModifiers::new(self, location, is_repeat)
210208
}
211209

212210
fn cef_modifiers_mouse_event(&self) -> CefModifiers {
213211
self.cef_modifiers(&winit::keyboard::KeyLocation::Standard, false)
214212
}
215213
}
216214

217-
impl Into<CefModifiers> for InputState {
218-
fn into(self) -> CefModifiers {
219-
CefModifiers::new(&self, &winit::keyboard::KeyLocation::Standard, false)
215+
impl From<InputState> for CefModifiers {
216+
fn from(val: InputState) -> Self {
217+
CefModifiers::new(&val, &winit::keyboard::KeyLocation::Standard, false)
220218
}
221219
}
222220

223-
impl Into<MouseEvent> for &InputState {
224-
fn into(self) -> MouseEvent {
221+
impl From<&InputState> for MouseEvent {
222+
fn from(val: &InputState) -> Self {
225223
MouseEvent {
226-
x: self.mouse_position.x as i32,
227-
y: self.mouse_position.y as i32,
228-
modifiers: self.cef_modifiers_mouse_event().raw(),
224+
x: val.mouse_position.x as i32,
225+
y: val.mouse_position.y as i32,
226+
modifiers: val.cef_modifiers_mouse_event().raw(),
229227
}
230228
}
231229
}

desktop/src/cef/internal/app.rs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,16 @@ use cef::rc::{Rc, RcImpl};
22
use cef::sys::{_cef_app_t, cef_base_ref_counted_t};
33
use cef::{App, BrowserProcessHandler, ImplApp, SchemeRegistrar, WrapApp};
44

5+
use crate::cef::CefEventHandler;
56
use crate::cef::scheme_handler::GraphiteSchemeHandlerFactory;
6-
use crate::cef::EventHandler;
77

88
use super::browser_process_handler::BrowserProcessHandlerImpl;
99

10-
pub(crate) struct AppImpl<H: EventHandler> {
10+
pub(crate) struct AppImpl<H: CefEventHandler> {
1111
object: *mut RcImpl<_cef_app_t, Self>,
1212
event_handler: H,
1313
}
14-
impl<H: EventHandler> AppImpl<H> {
14+
impl<H: CefEventHandler> AppImpl<H> {
1515
pub(crate) fn new(event_handler: H) -> App {
1616
App::new(Self {
1717
object: std::ptr::null_mut(),
@@ -20,7 +20,7 @@ impl<H: EventHandler> AppImpl<H> {
2020
}
2121
}
2222

23-
impl<H: EventHandler> ImplApp for AppImpl<H> {
23+
impl<H: CefEventHandler> ImplApp for AppImpl<H> {
2424
fn browser_process_handler(&self) -> Option<BrowserProcessHandler> {
2525
Some(BrowserProcessHandlerImpl::new(self.event_handler.clone()))
2626
}
@@ -34,7 +34,7 @@ impl<H: EventHandler> ImplApp for AppImpl<H> {
3434
}
3535
}
3636

37-
impl<H: EventHandler> Clone for AppImpl<H> {
37+
impl<H: CefEventHandler> Clone for AppImpl<H> {
3838
fn clone(&self) -> Self {
3939
unsafe {
4040
let rc_impl = &mut *self.object;
@@ -46,15 +46,15 @@ impl<H: EventHandler> Clone for AppImpl<H> {
4646
}
4747
}
4848
}
49-
impl<H: EventHandler> Rc for AppImpl<H> {
49+
impl<H: CefEventHandler> Rc for AppImpl<H> {
5050
fn as_base(&self) -> &cef_base_ref_counted_t {
5151
unsafe {
5252
let base = &*self.object;
5353
std::mem::transmute(&base.cef_object)
5454
}
5555
}
5656
}
57-
impl<H: EventHandler> WrapApp for AppImpl<H> {
57+
impl<H: CefEventHandler> WrapApp for AppImpl<H> {
5858
fn wrap_rc(&mut self, object: *mut RcImpl<_cef_app_t, Self>) {
5959
self.object = object;
6060
}

desktop/src/cef/internal/browser_process_handler.rs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,14 @@ use cef::rc::{Rc, RcImpl};
22
use cef::sys::{_cef_browser_process_handler_t, cef_base_ref_counted_t, cef_browser_process_handler_t};
33
use cef::{BrowserProcessHandler, CefString, ImplBrowserProcessHandler, SchemeHandlerFactory, WrapBrowserProcessHandler};
44

5+
use crate::cef::CefEventHandler;
56
use crate::cef::scheme_handler::GraphiteSchemeHandlerFactory;
6-
use crate::cef::EventHandler;
77

8-
pub(crate) struct BrowserProcessHandlerImpl<H: EventHandler> {
8+
pub(crate) struct BrowserProcessHandlerImpl<H: CefEventHandler> {
99
object: *mut RcImpl<cef_browser_process_handler_t, Self>,
1010
event_handler: H,
1111
}
12-
impl<H: EventHandler> BrowserProcessHandlerImpl<H> {
12+
impl<H: CefEventHandler> BrowserProcessHandlerImpl<H> {
1313
pub(crate) fn new(event_handler: H) -> BrowserProcessHandler {
1414
BrowserProcessHandler::new(Self {
1515
object: std::ptr::null_mut(),
@@ -18,7 +18,7 @@ impl<H: EventHandler> BrowserProcessHandlerImpl<H> {
1818
}
1919
}
2020

21-
impl<H: EventHandler> ImplBrowserProcessHandler for BrowserProcessHandlerImpl<H> {
21+
impl<H: CefEventHandler> ImplBrowserProcessHandler for BrowserProcessHandlerImpl<H> {
2222
fn on_context_initialized(&self) {
2323
cef::register_scheme_handler_factory(Some(&CefString::from("graphite")), None, Some(&mut SchemeHandlerFactory::new(GraphiteSchemeHandlerFactory::new())));
2424
}
@@ -28,7 +28,7 @@ impl<H: EventHandler> ImplBrowserProcessHandler for BrowserProcessHandlerImpl<H>
2828
}
2929
}
3030

31-
impl<H: EventHandler> Clone for BrowserProcessHandlerImpl<H> {
31+
impl<H: CefEventHandler> Clone for BrowserProcessHandlerImpl<H> {
3232
fn clone(&self) -> Self {
3333
unsafe {
3434
let rc_impl = &mut *self.object;
@@ -40,15 +40,15 @@ impl<H: EventHandler> Clone for BrowserProcessHandlerImpl<H> {
4040
}
4141
}
4242
}
43-
impl<H: EventHandler> Rc for BrowserProcessHandlerImpl<H> {
43+
impl<H: CefEventHandler> Rc for BrowserProcessHandlerImpl<H> {
4444
fn as_base(&self) -> &cef_base_ref_counted_t {
4545
unsafe {
4646
let base = &*self.object;
4747
std::mem::transmute(&base.cef_object)
4848
}
4949
}
5050
}
51-
impl<H: EventHandler> WrapBrowserProcessHandler for BrowserProcessHandlerImpl<H> {
51+
impl<H: CefEventHandler> WrapBrowserProcessHandler for BrowserProcessHandlerImpl<H> {
5252
fn wrap_rc(&mut self, object: *mut RcImpl<_cef_browser_process_handler_t, Self>) {
5353
self.object = object;
5454
}

desktop/src/cef/internal/render_handler.rs

Lines changed: 16 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,26 @@
11
use cef::rc::{Rc, RcImpl};
22
use cef::sys::{_cef_render_handler_t, cef_base_ref_counted_t};
3-
use cef::{Browser, ImplBrowser, ImplBrowserHost, ImplRenderHandler, PaintElementType, Rect, RenderHandler, WrapRenderHandler};
3+
use cef::{Browser, ImplBrowser, ImplBrowserHost, ImplRenderHandler, PaintElementType, Rect, WrapRenderHandler};
44

5-
use crate::cef::EventHandler;
5+
use crate::FrameBuffer;
6+
use crate::cef::CefEventHandler;
67

7-
pub(crate) struct RenderHandlerImpl<H: EventHandler> {
8+
pub(crate) struct RenderHandlerImpl<H: CefEventHandler> {
89
object: *mut RcImpl<_cef_render_handler_t, Self>,
910
event_handler: H,
1011
}
11-
impl<H: EventHandler> RenderHandlerImpl<H> {
12-
pub(crate) fn new(event_handler: H) -> RenderHandler {
13-
RenderHandler::new(Self {
12+
impl<H: CefEventHandler> RenderHandlerImpl<H> {
13+
pub(crate) fn new(event_handler: H) -> Self {
14+
Self {
1415
object: std::ptr::null_mut(),
1516
event_handler,
16-
})
17+
}
1718
}
1819
}
19-
impl<H: EventHandler> ImplRenderHandler for RenderHandlerImpl<H> {
20+
impl<H: CefEventHandler> ImplRenderHandler for RenderHandlerImpl<H> {
2021
fn view_rect(&self, _browser: Option<&mut Browser>, rect: Option<&mut Rect>) {
2122
if let Some(rect) = rect {
22-
let view = self.event_handler.view();
23+
let view = self.event_handler.window_size();
2324
*rect = Rect {
2425
x: 0,
2526
y: 0,
@@ -41,7 +42,9 @@ impl<H: EventHandler> ImplRenderHandler for RenderHandlerImpl<H> {
4142
) {
4243
let buffer_size = (width * height * 4) as usize;
4344
let buffer_slice = unsafe { std::slice::from_raw_parts(buffer, buffer_size) };
44-
let draw_successful = self.event_handler.draw(buffer_slice.to_vec(), width as usize, height as usize);
45+
let frame_buffer = FrameBuffer::new(buffer_slice.to_vec(), width as usize, height as usize).expect("Failed to create frame buffer");
46+
47+
let draw_successful = self.event_handler.draw(frame_buffer);
4548
if !draw_successful {
4649
if let Some(browser) = browser {
4750
browser.host().unwrap().was_resized();
@@ -54,7 +57,7 @@ impl<H: EventHandler> ImplRenderHandler for RenderHandlerImpl<H> {
5457
}
5558
}
5659

57-
impl<H: EventHandler> Clone for RenderHandlerImpl<H> {
60+
impl<H: CefEventHandler> Clone for RenderHandlerImpl<H> {
5861
fn clone(&self) -> Self {
5962
unsafe {
6063
let rc_impl = &mut *self.object;
@@ -66,15 +69,15 @@ impl<H: EventHandler> Clone for RenderHandlerImpl<H> {
6669
}
6770
}
6871
}
69-
impl<H: EventHandler> Rc for RenderHandlerImpl<H> {
72+
impl<H: CefEventHandler> Rc for RenderHandlerImpl<H> {
7073
fn as_base(&self) -> &cef_base_ref_counted_t {
7174
unsafe {
7275
let base = &*self.object;
7376
std::mem::transmute(&base.cef_object)
7477
}
7578
}
7679
}
77-
impl<H: EventHandler> WrapRenderHandler for RenderHandlerImpl<H> {
80+
impl<H: CefEventHandler> WrapRenderHandler for RenderHandlerImpl<H> {
7881
fn wrap_rc(&mut self, object: *mut RcImpl<_cef_render_handler_t, Self>) {
7982
self.object = object;
8083
}

0 commit comments

Comments
 (0)