icon: refactor Icon to be dyn
Same as for `CustomCursor`. However, the API uses `dyn` stuff only because of `Windows` backend at the time of writing, generally, platforms should just have a separate method that deals with all of that, and e.g. top-level winit only guarantees `Rgba`.
This commit is contained in:
parent
cdbdd974fb
commit
07c25b9703
16 changed files with 230 additions and 211 deletions
|
|
@ -13,7 +13,6 @@ use crate::application::ApplicationHandler;
|
|||
use crate::dpi::Size;
|
||||
use crate::error::{EventLoopError, NotSupportedError};
|
||||
use crate::event_loop::ActiveEventLoop;
|
||||
pub(crate) use crate::icon::RgbaIcon as PlatformIcon;
|
||||
use crate::platform::pump_events::PumpStatus;
|
||||
#[cfg(x11_platform)]
|
||||
use crate::platform::x11::WindowType as XWindowType;
|
||||
|
|
|
|||
|
|
@ -28,15 +28,16 @@ use crate::dpi::{PhysicalInsets, PhysicalPosition, PhysicalSize, Position, Size}
|
|||
use crate::error::{NotSupportedError, RequestError};
|
||||
use crate::event::{SurfaceSizeWriter, WindowEvent};
|
||||
use crate::event_loop::AsyncRequestSerial;
|
||||
use crate::icon::RgbaIcon;
|
||||
use crate::monitor::{
|
||||
Fullscreen, MonitorHandle as CoreMonitorHandle, MonitorHandleProvider, VideoMode,
|
||||
};
|
||||
use crate::platform::x11::WindowType;
|
||||
use crate::platform_impl::common;
|
||||
use crate::platform_impl::x11::atoms::*;
|
||||
use crate::platform_impl::x11::{
|
||||
xinput_fp1616_to_float, MonitorHandle as X11MonitorHandle, WakeSender, X11Error,
|
||||
};
|
||||
use crate::platform_impl::{common, PlatformIcon};
|
||||
use crate::window::{
|
||||
CursorGrabMode, ImePurpose, ResizeDirection, Theme, UserAttentionType, Window as CoreWindow,
|
||||
WindowAttributes, WindowButtons, WindowId, WindowLevel,
|
||||
|
|
@ -203,7 +204,11 @@ impl CoreWindow for Window {
|
|||
}
|
||||
|
||||
fn set_window_icon(&self, window_icon: Option<crate::window::Icon>) {
|
||||
self.0.set_window_icon(window_icon.map(|inner| inner.inner))
|
||||
let icon = match window_icon.as_ref() {
|
||||
Some(icon) => icon.0.cast_ref::<RgbaIcon>(),
|
||||
None => None,
|
||||
};
|
||||
self.0.set_window_icon(icon)
|
||||
}
|
||||
|
||||
fn set_ime_cursor_area(&self, position: Position, size: Size) {
|
||||
|
|
@ -765,8 +770,10 @@ impl UnownedWindow {
|
|||
.check());
|
||||
|
||||
// Set window icons
|
||||
if let Some(icon) = window_attrs.window_icon {
|
||||
leap!(window.set_icon_inner(icon.inner)).ignore_error();
|
||||
if let Some(icon) =
|
||||
window_attrs.window_icon.as_ref().and_then(|icon| icon.0.cast_ref::<RgbaIcon>())
|
||||
{
|
||||
leap!(window.set_icon_inner(icon)).ignore_error();
|
||||
}
|
||||
|
||||
// Opt into handling window close and resize synchronization
|
||||
|
|
@ -1404,7 +1411,7 @@ impl UnownedWindow {
|
|||
self.xconn.flush_requests().expect("Failed to set window-level state");
|
||||
}
|
||||
|
||||
fn set_icon_inner(&self, icon: PlatformIcon) -> Result<VoidCookie<'_>, X11Error> {
|
||||
fn set_icon_inner(&self, icon: &RgbaIcon) -> Result<VoidCookie<'_>, X11Error> {
|
||||
let atoms = self.xconn.atoms();
|
||||
let icon_atom = atoms[_NET_WM_ICON];
|
||||
let data = icon.to_cardinals();
|
||||
|
|
@ -1431,7 +1438,7 @@ impl UnownedWindow {
|
|||
}
|
||||
|
||||
#[inline]
|
||||
pub(crate) fn set_window_icon(&self, icon: Option<PlatformIcon>) {
|
||||
pub(crate) fn set_window_icon(&self, icon: Option<&RgbaIcon>) {
|
||||
match icon {
|
||||
Some(icon) => self.set_icon_inner(icon),
|
||||
None => self.unset_icon_inner(),
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue