Skip to content

Commit 9fb2adb

Browse files
committed
wip
1 parent 71ae1ee commit 9fb2adb

5 files changed

Lines changed: 112 additions & 49 deletions

File tree

examples/plugin_clack/src/gui.rs

Lines changed: 8 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,9 @@ impl PluginGuiImpl for ExamplePluginMainThread<'_> {
7171
return None;
7272
};
7373

74-
Some(window_size_to_gui_size(gui.handle.size()))
74+
let size = gui.handle.size().to_native_size();
75+
76+
Some(GuiSize { width: size.width, height: size.height })
7577
}
7678

7779
fn can_resize(&mut self) -> bool {
@@ -96,13 +98,13 @@ impl PluginGuiImpl for ExamplePluginMainThread<'_> {
9698
let scale_factor = gui.handle.size().scale_factor;
9799

98100
if let Some(max_size) = gui.handle.max_size() {
99-
let max_size = size_to_gui_size(max_size, scale_factor);
101+
let max_size = NativeSize::from_size(max_size, scale_factor);
100102
size.width = size.width.min(max_size.width);
101103
size.height = size.height.min(max_size.height);
102104
}
103105

104106
if let Some(min_size) = gui.handle.min_size() {
105-
let min_size = size_to_gui_size(min_size, scale_factor);
107+
let min_size = NativeSize::from_size(min_size, scale_factor);
106108
size.width = size.width.max(min_size.width);
107109
size.height = size.height.max(min_size.height);
108110
}
@@ -115,8 +117,7 @@ impl PluginGuiImpl for ExamplePluginMainThread<'_> {
115117
return Err(PluginError::Message("set_size called without a GUI active"));
116118
};
117119

118-
let size = gui_size_to_window_size(size);
119-
gui.handle.resize(size)?;
120+
gui.handle.resize(NativeSize { width: size.width, height: size.height })?;
120121

121122
Ok(())
122123
}
@@ -162,45 +163,6 @@ impl PluginGuiImpl for ExamplePluginMainThread<'_> {
162163
}
163164
}
164165

165-
fn size_to_gui_size(size: Size, scale_factor: f64) -> GuiSize {
166-
#[cfg(target_os = "macos")]
167-
{
168-
let size = size.to_logical(scale_factor);
169-
GuiSize { width: size.width, height: size.height }
170-
}
171-
172-
#[cfg(not(target_os = "macos"))]
173-
{
174-
let size = size.to_physical(scale_factor);
175-
GuiSize { width: size.width, height: size.height }
176-
}
177-
}
178-
179-
fn window_size_to_gui_size(size: WindowSize) -> GuiSize {
180-
#[cfg(target_os = "macos")]
181-
{
182-
let size = size.logical.cast();
183-
GuiSize { width: size.width, height: size.height }
184-
}
185-
186-
#[cfg(not(target_os = "macos"))]
187-
{
188-
let size = size.physical.cast();
189-
GuiSize { width: size.width, height: size.height }
190-
}
191-
}
192-
193-
fn gui_size_to_window_size(size: GuiSize) -> Size {
194-
#[cfg(target_os = "macos")]
195-
{
196-
Size::Logical(LogicalSize::new(size.width, size.height).cast())
197-
}
198-
#[cfg(not(target_os = "macos"))]
199-
{
200-
Size::Physical(PhysicalSize::new(size.width, size.height))
201-
}
202-
}
203-
204166
struct MainThreadHandler {
205167
host: HostSharedHandle<'static>,
206168
}
@@ -218,8 +180,8 @@ struct HostGuiCallbacks {
218180

219181
impl HostCallbacks for HostGuiCallbacks {
220182
fn request_resize(&mut self, new_size: WindowSize) -> Result<(), HandlerError> {
221-
let size = window_size_to_gui_size(new_size);
222-
self.ext.request_resize(&self.host, size.width, size.height)?;
183+
let new_size = new_size.to_native_size();
184+
self.ext.request_resize(&self.host, new_size.width, new_size.height)?;
223185
Ok(())
224186
}
225187

src/context.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use super::*;
2+
use crate::dpi::Size;
23
use crate::{platform, MouseCursor, WindowSize};
3-
use dpi::Size;
44
use raw_window_handle::{
55
DisplayHandle, HandleError, HasDisplayHandle, HasWindowHandle, WindowHandle,
66
};

src/dpi.rs

Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
use crate::WindowSize;
2+
pub use dpi::*;
3+
4+
#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash)]
5+
pub struct NativeSize<P> {
6+
pub width: P,
7+
pub height: P,
8+
}
9+
10+
impl<P> NativeSize<P> {
11+
#[inline]
12+
pub const fn new(width: P, height: P) -> Self {
13+
NativeSize { width, height }
14+
}
15+
}
16+
17+
impl<P: Pixel> NativeSize<P> {
18+
#[inline]
19+
pub fn from_size(size: Size, scale_factor: f64) -> Self {
20+
#[cfg(target_os = "macos")]
21+
{
22+
let size = size.to_logical(scale_factor);
23+
Self { width: size.width, height: size.height }
24+
}
25+
26+
#[cfg(not(target_os = "macos"))]
27+
{
28+
let size = size.to_physical(scale_factor);
29+
Self { width: size.width, height: size.height }
30+
}
31+
}
32+
33+
#[inline]
34+
pub fn cast<X: Pixel>(&self) -> NativeSize<X> {
35+
NativeSize { width: self.width.cast(), height: self.height.cast() }
36+
}
37+
38+
#[inline]
39+
pub fn to_physical(self, scale_factor: f64) -> PhysicalSize<P> {
40+
#[cfg(target_os = "macos")]
41+
{
42+
let size = LogicalSize { width: self.width, height: self.height };
43+
size.to_physical(scale_factor)
44+
}
45+
#[cfg(not(target_os = "macos"))]
46+
{
47+
let _ = scale_factor;
48+
PhysicalSize { width: self.width, height: self.height }
49+
}
50+
}
51+
52+
#[inline]
53+
pub fn to_logical(self, scale_factor: f64) -> LogicalSize<P> {
54+
#[cfg(target_os = "macos")]
55+
{
56+
let _ = scale_factor;
57+
LogicalSize { width: self.width, height: self.height }
58+
}
59+
#[cfg(not(target_os = "macos"))]
60+
{
61+
let size = PhysicalSize { width: self.width, height: self.height };
62+
size.to_logical(scale_factor)
63+
}
64+
}
65+
}
66+
67+
impl<P: Pixel> From<WindowSize> for NativeSize<P> {
68+
#[inline]
69+
fn from(size: WindowSize) -> Self {
70+
#[cfg(target_os = "macos")]
71+
{
72+
let size = size.logical.cast();
73+
Self { width: size.width, height: size.height }
74+
}
75+
76+
#[cfg(not(target_os = "macos"))]
77+
{
78+
let size = size.physical.cast();
79+
Self { width: size.width, height: size.height }
80+
}
81+
}
82+
}
83+
84+
impl<P: Pixel> From<NativeSize<P>> for Size {
85+
#[inline]
86+
fn from(size: NativeSize<P>) -> Self {
87+
#[cfg(target_os = "macos")]
88+
{
89+
Size::Logical(LogicalSize::new(size.width, size.height).cast())
90+
}
91+
#[cfg(not(target_os = "macos"))]
92+
{
93+
Size::Physical(PhysicalSize::new(size.width, size.height).cast())
94+
}
95+
}
96+
}

src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
mod clipboard;
22
mod context;
3+
pub mod dpi;
34
mod error;
45
mod event;
56
mod handler;
@@ -17,7 +18,6 @@ pub mod gl;
1718

1819
pub use clipboard::*;
1920
pub use context::{PlatformHandle, WindowContext};
20-
pub use dpi;
2121
pub use error::*;
2222
pub use event::*;
2323
pub use handler::WindowHandler;

src/window.rs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
1+
use crate::dpi::*;
12
use crate::handler::WindowHandlerBuilder;
23
use crate::host::Host;
34
use crate::platform;
45
use crate::*;
5-
use dpi::{LogicalSize, PhysicalSize, Pixel, Size};
66
use std::marker::PhantomData;
77

88
/// A handle to a Window created by baseview.
@@ -262,6 +262,11 @@ impl WindowSize {
262262
pub fn from_logical(logical: LogicalSize<f64>, scale_factor: f64) -> Self {
263263
Self { physical: logical.to_physical(scale_factor), logical, scale_factor }
264264
}
265+
266+
#[inline]
267+
pub fn to_native_size<P: Pixel>(&self) -> NativeSize<P> {
268+
(*self).into()
269+
}
265270
}
266271

267272
impl<P: Pixel> From<WindowSize> for PhysicalSize<P> {

0 commit comments

Comments
 (0)