Implement ResizeObserver (#2859)
Co-authored-by: Liam Murphy <43807659+Liamolucko@users.noreply.github.com>
This commit is contained in:
parent
7ce86c3d2a
commit
9a9c9b15ba
12 changed files with 584 additions and 364 deletions
|
|
@ -8,6 +8,7 @@ use std::sync::Arc;
|
|||
|
||||
use raw_window_handle::{RawDisplayHandle, WebDisplayHandle};
|
||||
|
||||
use super::runner::EventWrapper;
|
||||
use super::{
|
||||
super::{monitor::MonitorHandle, KeyEventExtra},
|
||||
backend,
|
||||
|
|
@ -16,7 +17,6 @@ use super::{
|
|||
runner,
|
||||
window::WindowId,
|
||||
};
|
||||
use crate::dpi::Size;
|
||||
use crate::event::{
|
||||
DeviceEvent, DeviceId as RootDeviceId, ElementState, Event, KeyEvent, Touch, TouchPhase,
|
||||
WindowEvent,
|
||||
|
|
@ -71,10 +71,6 @@ impl<T> EventLoopWindowTarget<T> {
|
|||
|
||||
pub fn run(&self, event_handler: Box<runner::EventHandler<T>>) {
|
||||
self.runner.set_listener(event_handler);
|
||||
let runner = self.runner.clone();
|
||||
self.runner.set_on_scale_change(move |arg| {
|
||||
runner.handle_scale_changed(arg.old_scale, arg.new_scale)
|
||||
});
|
||||
}
|
||||
|
||||
pub fn generate_id(&self) -> WindowId {
|
||||
|
|
@ -595,35 +591,6 @@ impl<T> EventLoopWindowTarget<T> {
|
|||
prevent_default,
|
||||
);
|
||||
|
||||
// The size to restore to after exiting fullscreen.
|
||||
let mut intended_size = canvas.size().get();
|
||||
|
||||
canvas.on_fullscreen_change({
|
||||
let window = self.runner.window().clone();
|
||||
let runner = self.runner.clone();
|
||||
|
||||
move || {
|
||||
let canvas = canvas_clone.borrow();
|
||||
|
||||
// If the canvas is marked as fullscreen, it is moving *into* fullscreen
|
||||
// If it is not, it is moving *out of* fullscreen
|
||||
let new_size = if backend::is_fullscreen(&window, canvas.raw()) {
|
||||
intended_size = canvas.size().get();
|
||||
|
||||
backend::window_size(&window).to_physical(backend::scale_factor(&window))
|
||||
} else {
|
||||
intended_size
|
||||
};
|
||||
|
||||
backend::set_canvas_size(&canvas, Size::Physical(new_size));
|
||||
runner.send_event(Event::WindowEvent {
|
||||
window_id: RootWindowId(id),
|
||||
event: WindowEvent::Resized(new_size),
|
||||
});
|
||||
runner.request_redraw(RootWindowId(id));
|
||||
}
|
||||
});
|
||||
|
||||
let runner = self.runner.clone();
|
||||
canvas.on_touch_cancel(move |device_id, location, force| {
|
||||
runner.send_event(Event::WindowEvent {
|
||||
|
|
@ -650,6 +617,37 @@ impl<T> EventLoopWindowTarget<T> {
|
|||
event: WindowEvent::ThemeChanged(theme),
|
||||
});
|
||||
});
|
||||
|
||||
canvas.on_resize_scale(
|
||||
{
|
||||
let runner = self.runner.clone();
|
||||
let canvas = canvas_clone.clone();
|
||||
|
||||
move |size, scale| {
|
||||
runner.send_event(EventWrapper::ScaleChange {
|
||||
canvas: Rc::downgrade(&canvas),
|
||||
size,
|
||||
scale,
|
||||
})
|
||||
}
|
||||
},
|
||||
{
|
||||
let runner = self.runner.clone();
|
||||
|
||||
move |new_size| {
|
||||
let canvas = RefCell::borrow(&canvas_clone);
|
||||
canvas.set_current_size(new_size);
|
||||
if canvas.old_size() != new_size {
|
||||
canvas.set_old_size(new_size);
|
||||
runner.send_event(Event::WindowEvent {
|
||||
window_id: RootWindowId(id),
|
||||
event: WindowEvent::Resized(new_size),
|
||||
});
|
||||
runner.request_redraw(RootWindowId(id));
|
||||
}
|
||||
}
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
pub fn available_monitors(&self) -> VecDequeIter<MonitorHandle> {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue