Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 6b57b8d

Browse files
respect scaling
1 parent 52e98ea commit 6b57b8d

File tree

11 files changed

+133
-67
lines changed

11 files changed

+133
-67
lines changed

‎desktop/src/app.rs‎

Lines changed: 23 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ use std::thread;
88
use std::time::Duration;
99
use std::time::Instant;
1010
use winit::application::ApplicationHandler;
11+
use winit::dpi::PhysicalSize;
1112
use winit::event::WindowEvent;
1213
use winit::event_loop::ActiveEventLoop;
1314
use winit::event_loop::ControlFlow;
@@ -25,8 +26,9 @@ use graphite_desktop_wrapper::{DesktopWrapper, NodeGraphExecutionResult, WgpuCon
2526
pub(crate) struct App {
2627
cef_context: Box<dyn cef::CefContext>,
2728
window: Option<Window>,
29+
window_scale: f64,
2830
cef_schedule: Option<Instant>,
29-
cef_window_size_sender: Sender<cef::WindowSize>,
31+
cef_view_info_sender: Sender<cef::ViewInfoUpdate>,
3032
graphics_state: Option<GraphicsState>,
3133
wgpu_context: WgpuContext,
3234
app_event_receiver: Receiver<AppEvent>,
@@ -44,7 +46,7 @@ pub(crate) struct App {
4446
impl App {
4547
pub(crate) fn new(
4648
cef_context: Box<dyn cef::CefContext>,
47-
window_size_sender: Sender<cef::WindowSize>,
49+
cef_view_info_sender: Sender<cef::ViewInfoUpdate>,
4850
wgpu_context: WgpuContext,
4951
app_event_receiver: Receiver<AppEvent>,
5052
app_event_scheduler: AppEventScheduler,
@@ -66,9 +68,10 @@ impl App {
6668
Self {
6769
cef_context,
6870
window: None,
71+
window_scale: 1.0,
6972
cef_schedule: Some(Instant::now()),
7073
graphics_state: None,
71-
cef_window_size_sender: window_size_sender,
74+
cef_view_info_sender,
7275
wgpu_context,
7376
app_event_receiver,
7477
app_event_scheduler,
@@ -344,14 +347,17 @@ impl App {
344347
impl ApplicationHandler for App {
345348
fn can_create_surfaces(&mut self, event_loop: &dyn ActiveEventLoop) {
346349
let window = Window::new(event_loop);
350+
351+
self.window_scale = window.scale_factor();
352+
let _ = self.cef_view_info_sender.send(cef::ViewInfoUpdate::Scale(self.window_scale));
353+
self.cef_context.notify_view_info_changed();
354+
347355
self.window = Some(window);
348356

349357
let graphics_state = GraphicsState::new(self.window.as_ref().unwrap(), self.wgpu_context.clone());
350358

351359
self.graphics_state = Some(graphics_state);
352360

353-
tracing::info!("Winit window created and ready");
354-
355361
self.desktop_wrapper.init(self.wgpu_context.clone());
356362

357363
#[cfg(target_os = "windows")]
@@ -370,20 +376,28 @@ impl ApplicationHandler for App {
370376
}
371377

372378
fn window_event(&mut self, event_loop: &dyn ActiveEventLoop, _window_id: WindowId, event: WindowEvent) {
373-
self.cef_context.handle_window_event(&event);
379+
self.cef_context.handle_window_event(&event,self.window_scale);
374380

375381
match event {
376382
WindowEvent::CloseRequested => {
377383
self.app_event_scheduler.schedule(AppEvent::CloseWindow);
378384
}
379-
WindowEvent::SurfaceResized(size) => {
380-
let _ = self.cef_window_size_sender.send(size.into());
381-
self.cef_context.notify_of_resize();
385+
WindowEvent::SurfaceResized(PhysicalSize { width, height }) => {
386+
let _ = self.cef_view_info_sender.send(cef::ViewInfoUpdate::Size {
387+
width: width as usize,
388+
height: height as usize,
389+
});
390+
self.cef_context.notify_view_info_changed();
382391
if let Some(window) = &self.window {
383392
let maximized = window.is_maximized();
384393
self.app_event_scheduler.schedule(AppEvent::DesktopWrapperMessage(DesktopWrapperMessage::UpdateMaximized { maximized }));
385394
}
386395
}
396+
WindowEvent::ScaleFactorChanged { scale_factor, .. } => {
397+
self.window_scale = scale_factor;
398+
let _ = self.cef_view_info_sender.send(cef::ViewInfoUpdate::Scale(self.window_scale));
399+
self.cef_context.notify_view_info_changed();
400+
}
387401
WindowEvent::RedrawRequested => {
388402
let Some(ref mut graphics_state) = self.graphics_state else { return };
389403
// Only rerender once we have a new UI texture to display

‎desktop/src/cef.rs‎

Lines changed: 51 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ use texture_import::SharedTextureHandle;
3939
pub(crate) use context::{CefContext, CefContextBuilder, InitError};
4040

4141
pub(crate) trait CefEventHandler: Clone + Send + Sync + 'static {
42-
fn window_size(&self) -> WindowSize;
42+
fn view_info(&self) -> ViewInfo;
4343
fn draw<'a>(&self, frame_buffer: FrameBufferRef<'a>);
4444
#[cfg(feature = "accelerated_paint")]
4545
fn draw_gpu(&self, shared_texture: SharedTextureHandle);
@@ -53,21 +53,45 @@ pub(crate) trait CefEventHandler: Clone + Send + Sync + 'static {
5353
}
5454

5555
#[derive(Clone, Copy)]
56-
pub(crate) struct WindowSize {
57-
pub(crate) width: usize,
58-
pub(crate) height: usize,
56+
pub(crate) struct ViewInfo {
57+
width: usize,
58+
height: usize,
59+
scale: f64,
5960
}
60-
impl WindowSize {
61-
pub(crate) fn new(width: usize, height: usize) -> Self {
62-
Self { width, height }
61+
impl ViewInfo {
62+
pub(crate) fn new() -> Self {
63+
Self { width: 1, height: 1, scale: 1.0 }
64+
}
65+
pub(crate) fn apply_update(&mut self, update: ViewInfoUpdate) {
66+
match update {
67+
ViewInfoUpdate::Size { width, height } if width > 0 && height > 0 => {
68+
self.width = width;
69+
self.height = height;
70+
}
71+
ViewInfoUpdate::Scale(scale) if scale > 0.0 => {
72+
self.scale = scale;
73+
}
74+
_ => {}
75+
}
76+
}
77+
pub(crate) fn scaled_width(&self) -> usize {
78+
(self.width as f64 / self.scale).round() as usize
79+
}
80+
pub(crate) fn scaled_height(&self) -> usize {
81+
(self.height as f64 / self.scale).round() as usize
6382
}
6483
}
65-
impl From<winit::dpi::PhysicalSize<u32>> for WindowSize {
66-
fn from(size: winit::dpi::PhysicalSize<u32>) -> Self {
67-
Self::new(size.widthasusize, size.heightasusize)
84+
impl Default for ViewInfo {
85+
fn default() -> Self {
86+
Self::new()
6887
}
6988
}
7089

90+
pub(crate) enum ViewInfoUpdate {
91+
Size { width: usize, height: usize },
92+
Scale(f64),
93+
}
94+
7195
#[derive(Clone)]
7296
pub(crate) struct Resource {
7397
pub(crate) reader: ResourceReader,
@@ -93,30 +117,30 @@ impl Read for ResourceReader {
93117
pub(crate) struct CefHandler {
94118
wgpu_context: WgpuContext,
95119
app_event_scheduler: AppEventScheduler,
96-
window_size_receiver: Arc<Mutex<WindowSizeReceiver>>,
120+
view_info_receiver: Arc<Mutex<ViewInfoReceiver>>,
97121
}
98122

99123
impl CefHandler {
100-
pub(crate) fn new(wgpu_context: WgpuContext, app_event_scheduler: AppEventScheduler, window_size_receiver: Receiver<WindowSize>) -> Self {
124+
pub(crate) fn new(wgpu_context: WgpuContext, app_event_scheduler: AppEventScheduler, view_info_receiver: Receiver<ViewInfoUpdate>) -> Self {
101125
Self {
102126
wgpu_context,
103127
app_event_scheduler,
104-
window_size_receiver: Arc::new(Mutex::new(WindowSizeReceiver::new(window_size_receiver))),
128+
view_info_receiver: Arc::new(Mutex::new(ViewInfoReceiver::new(view_info_receiver))),
105129
}
106130
}
107131
}
108132

109133
impl CefEventHandler for CefHandler {
110-
fn window_size(&self) -> WindowSize {
111-
let Ok(mut guard) = self.window_size_receiver.lock() else {
112-
tracing::error!("Failed to lock window_size_receiver");
113-
return WindowSize::new(1,1);
134+
fn view_info(&self) -> ViewInfo {
135+
let Ok(mut guard) = self.view_info_receiver.lock() else {
136+
tracing::error!("Failed to lock view_info_receiver");
137+
return ViewInfo::new();
114138
};
115-
let WindowSizeReceiver { receiver, window_size } = &mut *guard;
116-
for new_window_size in receiver.try_iter() {
117-
*window_size = new_window_size;
139+
let ViewInfoReceiver { receiver, view_info } = &mut *guard;
140+
for update in receiver.try_iter() {
141+
view_info.apply_update(update);
118142
}
119-
*window_size
143+
*view_info
120144
}
121145
fn draw<'a>(&self, frame_buffer: FrameBufferRef<'a>) {
122146
let width = frame_buffer.width() as u32;
@@ -246,15 +270,12 @@ impl CefEventHandler for CefHandler {
246270
}
247271
}
248272

249-
struct WindowSizeReceiver {
250-
window_size:WindowSize,
251-
receiver: Receiver<WindowSize>,
273+
struct ViewInfoReceiver {
274+
view_info:ViewInfo,
275+
receiver: Receiver<ViewInfoUpdate>,
252276
}
253-
impl WindowSizeReceiver {
254-
fn new(window_size_receiver: Receiver<WindowSize>) -> Self {
255-
Self {
256-
window_size: WindowSize { width: 1, height: 1 },
257-
receiver: window_size_receiver,
258-
}
277+
impl ViewInfoReceiver {
278+
fn new(receiver: Receiver<ViewInfoUpdate>) -> Self {
279+
Self { view_info: ViewInfo::new(), receiver }
259280
}
260281
}

‎desktop/src/cef/context.rs‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,9 @@ pub(crate) use builder::{CefContextBuilder, InitError};
88
pub(crate) trait CefContext {
99
fn work(&mut self);
1010

11-
fn handle_window_event(&mut self, event: &winit::event::WindowEvent);
11+
fn handle_window_event(&mut self, event: &winit::event::WindowEvent,scale:f64);
1212

13-
fn notify_of_resize(&self);
13+
fn notify_view_info_changed(&self);
1414

1515
fn send_web_message(&self, message: Vec<u8>);
1616
}

‎desktop/src/cef/context/multithreaded.rs‎

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,22 +19,22 @@ impl CefContext for MultiThreadedCefContextProxy {
1919
// CEF handles its own message loop in multi-threaded mode
2020
}
2121

22-
fn handle_window_event(&mut self, event: &WindowEvent) {
22+
fn handle_window_event(&mut self, event: &WindowEvent,scale:f64) {
2323
let event_clone = event.clone();
2424
run_on_ui_thread(move || {
2525
CONTEXT.with(|b| {
2626
if let Some(context) = b.borrow_mut().as_mut() {
27-
context.handle_window_event(&event_clone);
27+
context.handle_window_event(&event_clone, scale);
2828
}
2929
});
3030
});
3131
}
3232

33-
fn notify_of_resize(&self) {
33+
fn notify_view_info_changed(&self) {
3434
run_on_ui_thread(move || {
3535
CONTEXT.with(|b| {
3636
if let Some(context) = b.borrow_mut().as_mut() {
37-
context.notify_of_resize();
37+
context.notify_view_info_changed();
3838
}
3939
});
4040
});

‎desktop/src/cef/context/singlethreaded.rs‎

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
1-
use cef::{Browser, ImplBrowser,ImplBrowserHost};
1+
use cef::{Browser, ImplBrowser};
22
use winit::event::WindowEvent;
33

44
use crate::cef::input;
55
use crate::cef::input::InputState;
6+
use crate::cef::internal::NotifyViewInfoChanged;
67
use crate::cef::ipc::{MessageType, SendMessage};
78

89
use super::CefContext;
@@ -18,12 +19,12 @@ impl CefContext for SingleThreadedCefContext {
1819
cef::do_message_loop_work();
1920
}
2021

21-
fn handle_window_event(&mut self, event: &WindowEvent) {
22-
input::handle_window_event(&self.browser, &mut self.input_state, event)
22+
fn handle_window_event(&mut self, event: &WindowEvent,scale:f64) {
23+
input::handle_window_event(&self.browser, &mut self.input_state, event, scale)
2324
}
2425

25-
fn notify_of_resize(&self) {
26-
self.browser.host().unwrap().was_resized();
26+
fn notify_view_info_changed(&self) {
27+
self.browser.host().unwrap().notify_view_info_changed();
2728
}
2829

2930
fn send_web_message(&self, message: Vec<u8>) {

‎desktop/src/cef/input.rs‎

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,25 @@
11
use cef::sys::{cef_event_flags_t, cef_key_event_type_t, cef_mouse_button_type_t};
22
use cef::{Browser, ImplBrowser, ImplBrowserHost, KeyEvent, KeyEventType, MouseEvent};
33
use std::time::Instant;
4-
use winit::dpi::PhysicalPosition;
4+
use winit::dpi::LogicalPosition;
55
use winit::event::{ButtonSource, ElementState, MouseButton, MouseScrollDelta, WindowEvent};
66

77
mod keymap;
88
use keymap::{ToNativeKeycode, ToVKBits};
99

1010
use super::consts::{MULTICLICK_ALLOWED_TRAVEL, MULTICLICK_TIMEOUT, PINCH_ZOOM_SPEED, SCROLL_LINE_HEIGHT, SCROLL_LINE_WIDTH, SCROLL_SPEED_X, SCROLL_SPEED_Y};
1111

12-
pub(crate) fn handle_window_event(browser: &Browser, input_state: &mut InputState, event: &WindowEvent) {
12+
pub(crate) fn handle_window_event(browser: &Browser, input_state: &mut InputState, event: &WindowEvent,scale:f64) {
1313
match event {
1414
WindowEvent::PointerMoved { position, .. } | WindowEvent::PointerEntered { position, .. } => {
15-
input_state.cursor_move(position);
15+
input_state.cursor_move(&position.to_logical(2.0));
1616

1717
let Some(host) = browser.host() else { return };
1818
host.send_mouse_move_event(Some(&input_state.into()), 0);
1919
}
2020
WindowEvent::PointerLeft { position, .. } => {
2121
if let Some(position) = position {
22-
input_state.cursor_move(position);
22+
input_state.cursor_move(&position.to_logical(scale));
2323
}
2424

2525
let Some(host) = browser.host() else { return };
@@ -159,7 +159,7 @@ impl InputState {
159159
self.modifiers = *modifiers;
160160
}
161161

162-
fn cursor_move(&mut self, position: &PhysicalPosition<f64>) {
162+
fn cursor_move(&mut self, position: &LogicalPosition<f64>) {
163163
self.mouse_position = position.into();
164164
}
165165

@@ -206,8 +206,8 @@ pub(crate) struct MousePosition {
206206
x: usize,
207207
y: usize,
208208
}
209-
impl From<&PhysicalPosition<f64>> for MousePosition {
210-
fn from(position: &PhysicalPosition<f64>) -> Self {
209+
impl From<&LogicalPosition<f64>> for MousePosition {
210+
fn from(position: &LogicalPosition<f64>) -> Self {
211211
Self {
212212
x: position.x as usize,
213213
y: position.y as usize,

‎desktop/src/cef/internal.rs‎

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,3 +22,14 @@ pub(super) use browser_process_client::BrowserProcessClientImpl;
2222
pub(super) use render_handler::RenderHandlerImpl;
2323
pub(super) use render_process_app::RenderProcessAppImpl;
2424
pub(super) use scheme_handler_factory::SchemeHandlerFactoryImpl;
25+
26+
pub(super) trait NotifyViewInfoChanged {
27+
fn notify_view_info_changed(&self);
28+
}
29+
impl<T: cef::ImplBrowserHost> NotifyViewInfoChanged for T {
30+
fn notify_view_info_changed(&self) {
31+
self.notify_screen_info_changed();
32+
self.was_resized();
33+
}
34+
}
35+

‎desktop/src/cef/internal/render_handler.rs‎

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,16 +21,34 @@ impl<H: CefEventHandler> RenderHandlerImpl<H> {
2121
impl<H: CefEventHandler> ImplRenderHandler for RenderHandlerImpl<H> {
2222
fn view_rect(&self, _browser: Option<&mut Browser>, rect: Option<&mut Rect>) {
2323
if let Some(rect) = rect {
24-
let view = self.event_handler.window_size();
24+
let view_info = self.event_handler.view_info();
2525
*rect = Rect {
2626
x: 0,
2727
y: 0,
28-
width: view.width as i32,
29-
height: view.height as i32,
28+
width: view_info.scaled_width() as i32,
29+
height: view_info.scaled_height() as i32,
3030
};
3131
}
3232
}
3333

34+
fn screen_info(&self, _browser: Option<&mut Browser>, screen_info: Option<&mut cef::ScreenInfo>) -> std::ffi::c_int {
35+
if let Some(screen_info) = screen_info {
36+
let view_info = self.event_handler.view_info();
37+
38+
let rect = Rect {
39+
x: 0,
40+
y: 0,
41+
width: view_info.scaled_width() as i32,
42+
height: view_info.scaled_height() as i32,
43+
};
44+
screen_info.rect = rect.clone();
45+
screen_info.available_rect = rect;
46+
47+
return 1;
48+
}
49+
0
50+
}
51+
3452
fn on_paint(
3553
&self,
3654
_browser: Option<&mut Browser>,

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /