Skip to content

Commit e1c3a39

Browse files
Merge branch 'master' into desktop-rudimentary-custom-wgpu-adapter-selection
2 parents a2bdded + 4e47b5d commit e1c3a39

File tree

23 files changed

+562
-350
lines changed

23 files changed

+562
-350
lines changed

demo-artwork/parametric-dunescape.graphite

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

demo-artwork/procedural-string-lights.graphite

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

demo-artwork/red-dress.graphite

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

demo-artwork/valley-of-spires.graphite

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

desktop/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ windows = { version = "0.58.0", features = [
6060
"Win32_System_LibraryLoader",
6161
"Win32_UI_Controls",
6262
"Win32_UI_WindowsAndMessaging",
63+
"Win32_UI_HiDpi",
6364
], optional = true }
6465

6566
# macOS-specific dependencies

desktop/src/app.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -305,6 +305,11 @@ impl App {
305305
self.cef_schedule = Some(instant);
306306
}
307307
}
308+
AppEvent::CursorChange(cursor) => {
309+
if let Some(window) = &self.window {
310+
window.set_cursor(cursor);
311+
}
312+
}
308313
AppEvent::CloseWindow => {
309314
// TODO: Implement graceful shutdown
310315

desktop/src/cef.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ pub(crate) trait CefEventHandler: Clone + Send + Sync + 'static {
4444
#[cfg(feature = "accelerated_paint")]
4545
fn draw_gpu(&self, shared_texture: SharedTextureHandle);
4646
fn load_resource(&self, path: PathBuf) -> Option<Resource>;
47+
fn cursor_change(&self, cursor: winit::cursor::Cursor);
4748
/// Schedule the main event loop to run the CEF event loop after the timeout.
4849
/// See [`_cef_browser_process_handler_t::on_schedule_message_pump_work`] for more documentation.
4950
fn schedule_cef_message_loop_work(&self, scheduled_time: Instant);
@@ -224,6 +225,10 @@ impl CefEventHandler for CefHandler {
224225
None
225226
}
226227

228+
fn cursor_change(&self, cursor: winit::cursor::Cursor) {
229+
self.app_event_scheduler.schedule(AppEvent::CursorChange(cursor));
230+
}
231+
227232
fn schedule_cef_message_loop_work(&self, scheduled_time: std::time::Instant) {
228233
self.app_event_scheduler.schedule(AppEvent::ScheduleBrowserWork(scheduled_time));
229234
}

desktop/src/cef/internal.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ mod render_process_v8_handler;
1010
mod resource_handler;
1111
mod scheme_handler_factory;
1212

13+
mod display_handler;
14+
1315
pub(super) mod render_handler;
1416
pub(super) mod task;
1517

desktop/src/cef/internal/browser_process_client.rs

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,26 @@
11
use cef::rc::{Rc, RcImpl};
22
use cef::sys::{_cef_client_t, cef_base_ref_counted_t};
3-
use cef::{ImplClient, LifeSpanHandler, RenderHandler, WrapClient};
3+
use cef::{DisplayHandler, ImplClient, LifeSpanHandler, RenderHandler, WrapClient};
44

55
use crate::cef::CefEventHandler;
66
use crate::cef::ipc::{MessageType, UnpackMessage, UnpackedMessage};
77

88
use super::browser_process_life_span_handler::BrowserProcessLifeSpanHandlerImpl;
9+
use super::display_handler::DisplayHandlerImpl;
910

1011
pub(crate) struct BrowserProcessClientImpl<H: CefEventHandler> {
1112
object: *mut RcImpl<_cef_client_t, Self>,
1213
render_handler: RenderHandler,
1314
event_handler: H,
15+
display_handler: DisplayHandler,
1416
}
1517
impl<H: CefEventHandler> BrowserProcessClientImpl<H> {
1618
pub(crate) fn new(render_handler: RenderHandler, event_handler: H) -> Self {
1719
Self {
1820
object: std::ptr::null_mut(),
1921
render_handler,
20-
event_handler,
22+
event_handler: event_handler.clone(),
23+
display_handler: DisplayHandler::new(DisplayHandlerImpl::new(event_handler)),
2124
}
2225
}
2326
}
@@ -57,6 +60,10 @@ impl<H: CefEventHandler> ImplClient for BrowserProcessClientImpl<H> {
5760
Some(LifeSpanHandler::new(BrowserProcessLifeSpanHandlerImpl::new()))
5861
}
5962

63+
fn display_handler(&self) -> Option<cef::DisplayHandler> {
64+
Some(self.display_handler.clone())
65+
}
66+
6067
fn get_raw(&self) -> *mut _cef_client_t {
6168
self.object.cast()
6269
}
@@ -72,6 +79,7 @@ impl<H: CefEventHandler> Clone for BrowserProcessClientImpl<H> {
7279
object: self.object,
7380
render_handler: self.render_handler.clone(),
7481
event_handler: self.event_handler.clone(),
82+
display_handler: self.display_handler.clone(),
7583
}
7684
}
7785
}
Lines changed: 136 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,136 @@
1+
use cef::rc::{Rc, RcImpl};
2+
use cef::sys::{_cef_display_handler_t, cef_base_ref_counted_t, cef_cursor_type_t::*, cef_log_severity_t::*};
3+
use cef::{CefString, ImplDisplayHandler, WrapDisplayHandler};
4+
use winit::cursor::CursorIcon;
5+
6+
use crate::cef::CefEventHandler;
7+
8+
pub(crate) struct DisplayHandlerImpl<H: CefEventHandler> {
9+
object: *mut RcImpl<_cef_display_handler_t, Self>,
10+
event_handler: H,
11+
}
12+
13+
impl<H: CefEventHandler> DisplayHandlerImpl<H> {
14+
pub fn new(event_handler: H) -> Self {
15+
Self {
16+
object: std::ptr::null_mut(),
17+
event_handler,
18+
}
19+
}
20+
}
21+
22+
impl<H: CefEventHandler> ImplDisplayHandler for DisplayHandlerImpl<H> {
23+
fn on_cursor_change(&self, _browser: Option<&mut cef::Browser>, _cursor: cef::CursorHandle, cursor_type: cef::CursorType, _custom_cursor_info: Option<&cef::CursorInfo>) -> ::std::os::raw::c_int {
24+
let cursor = match cursor_type.into() {
25+
CT_POINTER => CursorIcon::Default,
26+
CT_CROSS => CursorIcon::Crosshair,
27+
CT_HAND => CursorIcon::Pointer,
28+
CT_IBEAM => CursorIcon::Text,
29+
CT_WAIT => CursorIcon::Wait,
30+
CT_HELP => CursorIcon::Help,
31+
CT_EASTRESIZE => CursorIcon::EResize,
32+
CT_NORTHRESIZE => CursorIcon::NResize,
33+
CT_NORTHEASTRESIZE => CursorIcon::NeResize,
34+
CT_NORTHWESTRESIZE => CursorIcon::NwResize,
35+
CT_SOUTHRESIZE => CursorIcon::SResize,
36+
CT_SOUTHEASTRESIZE => CursorIcon::SeResize,
37+
CT_SOUTHWESTRESIZE => CursorIcon::SwResize,
38+
CT_WESTRESIZE => CursorIcon::WResize,
39+
CT_NORTHSOUTHRESIZE => CursorIcon::NsResize,
40+
CT_EASTWESTRESIZE => CursorIcon::EwResize,
41+
CT_NORTHEASTSOUTHWESTRESIZE => CursorIcon::NeswResize,
42+
CT_NORTHWESTSOUTHEASTRESIZE => CursorIcon::NwseResize,
43+
CT_COLUMNRESIZE => CursorIcon::ColResize,
44+
CT_ROWRESIZE => CursorIcon::RowResize,
45+
CT_MIDDLEPANNING => CursorIcon::AllScroll,
46+
CT_EASTPANNING => CursorIcon::AllScroll,
47+
CT_NORTHPANNING => CursorIcon::AllScroll,
48+
CT_NORTHEASTPANNING => CursorIcon::AllScroll,
49+
CT_NORTHWESTPANNING => CursorIcon::AllScroll,
50+
CT_SOUTHPANNING => CursorIcon::AllScroll,
51+
CT_SOUTHEASTPANNING => CursorIcon::AllScroll,
52+
CT_SOUTHWESTPANNING => CursorIcon::AllScroll,
53+
CT_WESTPANNING => CursorIcon::AllScroll,
54+
CT_MOVE => CursorIcon::Move,
55+
CT_VERTICALTEXT => CursorIcon::VerticalText,
56+
CT_CELL => CursorIcon::Cell,
57+
CT_CONTEXTMENU => CursorIcon::ContextMenu,
58+
CT_ALIAS => CursorIcon::Alias,
59+
CT_PROGRESS => CursorIcon::Progress,
60+
CT_NODROP => CursorIcon::NoDrop,
61+
CT_COPY => CursorIcon::Copy,
62+
CT_NONE => CursorIcon::Default,
63+
CT_NOTALLOWED => CursorIcon::NotAllowed,
64+
CT_ZOOMIN => CursorIcon::ZoomIn,
65+
CT_ZOOMOUT => CursorIcon::ZoomOut,
66+
CT_GRAB => CursorIcon::Grab,
67+
CT_GRABBING => CursorIcon::Grabbing,
68+
CT_MIDDLE_PANNING_VERTICAL => CursorIcon::AllScroll,
69+
CT_MIDDLE_PANNING_HORIZONTAL => CursorIcon::AllScroll,
70+
CT_CUSTOM => CursorIcon::Default,
71+
CT_DND_NONE => CursorIcon::Default,
72+
CT_DND_MOVE => CursorIcon::Move,
73+
CT_DND_COPY => CursorIcon::Copy,
74+
CT_DND_LINK => CursorIcon::Alias,
75+
CT_NUM_VALUES => CursorIcon::Default,
76+
_ => CursorIcon::Default,
77+
};
78+
79+
self.event_handler.cursor_change(cursor.into());
80+
81+
1 // We handled the cursor change.
82+
}
83+
84+
fn on_console_message(
85+
&self,
86+
_browser: Option<&mut cef::Browser>,
87+
level: cef::LogSeverity,
88+
message: Option<&CefString>,
89+
source: Option<&CefString>,
90+
line: ::std::os::raw::c_int,
91+
) -> ::std::os::raw::c_int {
92+
let message = message.map(|m| m.to_string()).unwrap_or_default();
93+
let source = source.map(|s| s.to_string()).unwrap_or_default();
94+
let line = line as i64;
95+
let browser_source = format!("{source}:{line}");
96+
static BROWSER: &str = "browser";
97+
match level.as_ref() {
98+
LOGSEVERITY_FATAL | LOGSEVERITY_ERROR => tracing::error!(target: BROWSER, "{browser_source} {message}"),
99+
LOGSEVERITY_WARNING => tracing::warn!(target: BROWSER, "{browser_source} {message}"),
100+
LOGSEVERITY_INFO => tracing::info!(target: BROWSER, "{browser_source} {message}"),
101+
LOGSEVERITY_DEFAULT | LOGSEVERITY_VERBOSE => tracing::debug!(target: BROWSER, "{browser_source} {message}"),
102+
_ => tracing::trace!(target: BROWSER, "{browser_source} {message}"),
103+
}
104+
0
105+
}
106+
107+
fn get_raw(&self) -> *mut _cef_display_handler_t {
108+
self.object.cast()
109+
}
110+
}
111+
112+
impl<H: CefEventHandler> Clone for DisplayHandlerImpl<H> {
113+
fn clone(&self) -> Self {
114+
unsafe {
115+
let rc_impl = &mut *self.object;
116+
rc_impl.interface.add_ref();
117+
}
118+
Self {
119+
object: self.object,
120+
event_handler: self.event_handler.clone(),
121+
}
122+
}
123+
}
124+
impl<H: CefEventHandler> Rc for DisplayHandlerImpl<H> {
125+
fn as_base(&self) -> &cef_base_ref_counted_t {
126+
unsafe {
127+
let base = &*self.object;
128+
std::mem::transmute(&base.cef_object)
129+
}
130+
}
131+
}
132+
impl<H: CefEventHandler> WrapDisplayHandler for DisplayHandlerImpl<H> {
133+
fn wrap_rc(&mut self, object: *mut RcImpl<_cef_display_handler_t, Self>) {
134+
self.object = object;
135+
}
136+
}

0 commit comments

Comments
 (0)