utils: add cast_* methods to allow more type-safe casting
Relying on just `as_any` was error prone and will become redundant in the future, once upcasting will be stable, we also won't to impose a restriction on to which concrete type we're casting, since casting to a type that doesn't implement a base trait doesn't make much sense. Co-authored-by: Kirill Chibisov <contact@kchibisov.com>
This commit is contained in:
parent
5cada36ae8
commit
16d5f46db1
19 changed files with 158 additions and 136 deletions
|
|
@ -556,7 +556,7 @@ fn new_window(
|
|||
let screen = match attrs.fullscreen.clone() {
|
||||
Some(Fullscreen::Borderless(Some(monitor)))
|
||||
| Some(Fullscreen::Exclusive(monitor, _)) => {
|
||||
let monitor = monitor.as_any().downcast_ref::<MonitorHandle>().unwrap();
|
||||
let monitor = monitor.cast_ref::<MonitorHandle>().unwrap();
|
||||
monitor.ns_screen(mtm).or_else(|| NSScreen::mainScreen(mtm))
|
||||
},
|
||||
Some(Fullscreen::Borderless(None)) => NSScreen::mainScreen(mtm),
|
||||
|
|
@ -1460,7 +1460,7 @@ impl WindowDelegate {
|
|||
if let Some(ref fullscreen) = fullscreen {
|
||||
let new_screen = match fullscreen {
|
||||
Fullscreen::Borderless(Some(monitor)) | Fullscreen::Exclusive(monitor, _) => {
|
||||
let monitor = monitor.as_any().downcast_ref::<MonitorHandle>().unwrap();
|
||||
let monitor = monitor.cast_ref::<MonitorHandle>().unwrap();
|
||||
monitor.ns_screen(mtm)
|
||||
},
|
||||
Fullscreen::Borderless(None) => {
|
||||
|
|
@ -1519,7 +1519,7 @@ impl WindowDelegate {
|
|||
cgerr(CGDisplayCapture(display_id)).unwrap();
|
||||
}
|
||||
|
||||
let monitor = monitor.as_any().downcast_ref::<MonitorHandle>().unwrap();
|
||||
let monitor = monitor.cast_ref::<MonitorHandle>().unwrap();
|
||||
let video_mode =
|
||||
match monitor.video_mode_handles().find(|mode| &mode.mode == video_mode) {
|
||||
Some(video_mode) => video_mode,
|
||||
|
|
@ -1587,7 +1587,7 @@ impl WindowDelegate {
|
|||
toggle_fullscreen(self.window());
|
||||
},
|
||||
(Some(Fullscreen::Exclusive(monitor, _)), None) => {
|
||||
let monitor = monitor.as_any().downcast_ref::<MonitorHandle>().unwrap();
|
||||
let monitor = monitor.cast_ref::<MonitorHandle>().unwrap();
|
||||
restore_and_release_display(monitor);
|
||||
toggle_fullscreen(self.window());
|
||||
},
|
||||
|
|
@ -1618,7 +1618,7 @@ impl WindowDelegate {
|
|||
);
|
||||
app.setPresentationOptions(presentation_options);
|
||||
|
||||
let monitor = monitor.as_any().downcast_ref::<MonitorHandle>().unwrap();
|
||||
let monitor = monitor.cast_ref::<MonitorHandle>().unwrap();
|
||||
restore_and_release_display(monitor);
|
||||
|
||||
// Restore the normal window level following the Borderless fullscreen
|
||||
|
|
|
|||
|
|
@ -81,7 +81,7 @@ impl WinitUIWindow {
|
|||
|
||||
match window_attributes.fullscreen.clone() {
|
||||
Some(Fullscreen::Exclusive(monitor, ref video_mode)) => {
|
||||
let monitor = monitor.as_any().downcast_ref::<MonitorHandle>().unwrap();
|
||||
let monitor = monitor.cast_ref::<MonitorHandle>().unwrap();
|
||||
let screen = monitor.ui_screen(mtm);
|
||||
if let Some(video_mode) =
|
||||
monitor.video_modes_handles().find(|mode| &mode.mode == video_mode)
|
||||
|
|
@ -91,7 +91,7 @@ impl WinitUIWindow {
|
|||
this.setScreen(screen);
|
||||
},
|
||||
Some(Fullscreen::Borderless(Some(ref monitor))) => {
|
||||
let monitor = monitor.as_any().downcast_ref::<MonitorHandle>().unwrap();
|
||||
let monitor = monitor.cast_ref::<MonitorHandle>().unwrap();
|
||||
let screen = monitor.ui_screen(mtm);
|
||||
this.setScreen(screen);
|
||||
},
|
||||
|
|
@ -306,7 +306,7 @@ impl Inner {
|
|||
let mtm = MainThreadMarker::new().unwrap();
|
||||
let uiscreen = match &monitor {
|
||||
Some(Fullscreen::Exclusive(monitor, video_mode)) => {
|
||||
let monitor = monitor.as_any().downcast_ref::<MonitorHandle>().unwrap();
|
||||
let monitor = monitor.cast_ref::<MonitorHandle>().unwrap();
|
||||
let uiscreen = monitor.ui_screen(mtm);
|
||||
if let Some(video_mode) =
|
||||
monitor.video_modes_handles().find(|mode| &mode.mode == video_mode)
|
||||
|
|
@ -316,7 +316,7 @@ impl Inner {
|
|||
uiscreen.clone()
|
||||
},
|
||||
Some(Fullscreen::Borderless(Some(monitor))) => {
|
||||
monitor.as_any().downcast_ref::<MonitorHandle>().unwrap().ui_screen(mtm).clone()
|
||||
monitor.cast_ref::<MonitorHandle>().unwrap().ui_screen(mtm).clone()
|
||||
},
|
||||
Some(Fullscreen::Borderless(None)) => {
|
||||
self.current_monitor_inner().ui_screen(mtm).clone()
|
||||
|
|
@ -492,7 +492,7 @@ impl Window {
|
|||
let screen = match fullscreen {
|
||||
Some(Fullscreen::Exclusive(ref monitor, _))
|
||||
| Some(Fullscreen::Borderless(Some(ref monitor))) => {
|
||||
let monitor = monitor.as_any().downcast_ref::<MonitorHandle>().unwrap();
|
||||
let monitor = monitor.cast_ref::<MonitorHandle>().unwrap();
|
||||
monitor.ui_screen(mtm)
|
||||
},
|
||||
Some(Fullscreen::Borderless(None)) | None => &main_screen,
|
||||
|
|
|
|||
|
|
@ -23,7 +23,6 @@ use crate::event::{Ime, WindowEvent};
|
|||
use crate::event_loop::AsyncRequestSerial;
|
||||
use crate::monitor::{Fullscreen, MonitorHandle as CoreMonitorHandle};
|
||||
use crate::platform_impl::wayland::output;
|
||||
use crate::utils::AsAny;
|
||||
use crate::window::{
|
||||
Cursor, CursorGrabMode, ImePurpose, ResizeDirection, Theme, UserAttentionType,
|
||||
Window as CoreWindow, WindowAttributes, WindowButtons, WindowId, WindowLevel,
|
||||
|
|
@ -146,10 +145,7 @@ impl Window {
|
|||
#[cfg_attr(not(x11_platform), allow(clippy::bind_instead_of_map))]
|
||||
Some(Fullscreen::Borderless(monitor)) => {
|
||||
let output = monitor.as_ref().and_then(|monitor| {
|
||||
monitor
|
||||
.as_any()
|
||||
.downcast_ref::<output::MonitorHandle>()
|
||||
.map(|handle| &handle.proxy)
|
||||
monitor.cast_ref::<output::MonitorHandle>().map(|handle| &handle.proxy)
|
||||
});
|
||||
|
||||
window.set_fullscreen(output)
|
||||
|
|
@ -446,10 +442,7 @@ impl CoreWindow for Window {
|
|||
#[cfg_attr(not(x11_platform), allow(clippy::bind_instead_of_map))]
|
||||
Some(Fullscreen::Borderless(monitor)) => {
|
||||
let output = monitor.as_ref().and_then(|monitor| {
|
||||
monitor
|
||||
.as_any()
|
||||
.downcast_ref::<output::MonitorHandle>()
|
||||
.map(|handle| &handle.proxy)
|
||||
monitor.cast_ref::<output::MonitorHandle>().map(|handle| &handle.proxy)
|
||||
});
|
||||
|
||||
self.window.set_fullscreen(output)
|
||||
|
|
|
|||
|
|
@ -1067,13 +1067,11 @@ impl UnownedWindow {
|
|||
let (monitor, video_mode): (Cow<'_, X11MonitorHandle>, Option<&VideoMode>) =
|
||||
match &fullscreen {
|
||||
Fullscreen::Exclusive(monitor, video_mode) => {
|
||||
let monitor =
|
||||
monitor.as_any().downcast_ref::<X11MonitorHandle>().unwrap();
|
||||
let monitor = monitor.cast_ref::<X11MonitorHandle>().unwrap();
|
||||
(Cow::Borrowed(monitor), Some(video_mode))
|
||||
},
|
||||
Fullscreen::Borderless(Some(monitor)) => {
|
||||
let monitor =
|
||||
monitor.as_any().downcast_ref::<X11MonitorHandle>().unwrap();
|
||||
let monitor = monitor.cast_ref::<X11MonitorHandle>().unwrap();
|
||||
(Cow::Borrowed(monitor), None)
|
||||
},
|
||||
Fullscreen::Borderless(None) => {
|
||||
|
|
|
|||
|
|
@ -65,7 +65,7 @@ pub(crate) fn request_fullscreen(
|
|||
return;
|
||||
}
|
||||
|
||||
let monitor = monitor.as_any().downcast_ref::<MonitorHandle>().unwrap();
|
||||
let monitor = monitor.cast_ref::<MonitorHandle>().unwrap();
|
||||
|
||||
if let Some(monitor) = monitor.detailed(main_thread) {
|
||||
let options: FullscreenOptions = Object::new().unchecked_into();
|
||||
|
|
|
|||
|
|
@ -790,7 +790,7 @@ impl CoreWindow for Window {
|
|||
// fullscreen
|
||||
match (&old_fullscreen, &fullscreen) {
|
||||
(_, Some(Fullscreen::Exclusive(monitor, video_mode))) => {
|
||||
let monitor = monitor.as_any().downcast_ref::<MonitorHandle>().unwrap();
|
||||
let monitor = monitor.cast_ref::<MonitorHandle>().unwrap();
|
||||
let video_mode =
|
||||
match monitor.video_mode_handles().find(|mode| &mode.mode == video_mode) {
|
||||
Some(monitor) => monitor,
|
||||
|
|
@ -882,9 +882,9 @@ impl CoreWindow for Window {
|
|||
|
||||
let monitor = match &fullscreen {
|
||||
Fullscreen::Exclusive(monitor, _)
|
||||
| Fullscreen::Borderless(Some(monitor)) => Some(Cow::Borrowed(
|
||||
monitor.as_any().downcast_ref::<MonitorHandle>().unwrap(),
|
||||
)),
|
||||
| Fullscreen::Borderless(Some(monitor)) => {
|
||||
Some(Cow::Borrowed(monitor.cast_ref::<MonitorHandle>().unwrap()))
|
||||
},
|
||||
Fullscreen::Borderless(None) => None,
|
||||
};
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue