Documentation
use raw_window_handle::{DisplayHandle, HandleError, HasDisplayHandle, HasWindowHandle, WindowHandle};
use crate::error::UiResult;
use crate::window::{UserEvent, WindowId};
use winit::dpi::PhysicalSize;

pub struct WInitWindowHandle {
    window: winit::window::Window,
    user_event: winit::event_loop::EventLoopProxy<(WindowId, UserEvent)>,
}

impl WInitWindowHandle {
    pub fn new(window: winit::window::Window, event: winit::event_loop::EventLoopProxy<(WindowId, UserEvent)>) -> Self {
        WInitWindowHandle {
            window,
            user_event: event,
        }
    }

    pub fn send_user_event(&self, wid: WindowId, event: UserEvent) -> UiResult<()> {
        self.user_event.send_event((wid, event))?;
        Ok(())
    }

    pub fn inner_size(&self) -> PhysicalSize<u32> {
        self.window.inner_size()
    }

    pub fn set_ime_position(&self, x: f32, y: f32) {
        let pos = winit::dpi::LogicalPosition::new(x, y);
        let size = winit::dpi::LogicalSize::new(100.0, 100.0);
        self.window.set_ime_cursor_area(pos, size);
    }

    pub fn request_redraw(&self) {
        self.window.request_redraw();
    }

    pub fn window_handle(&self) -> Result<WindowHandle<'_>, HandleError> {
        self.window.window_handle()
    }

    pub fn display_handle(&self) -> Result<DisplayHandle<'_>, HandleError> {
        self.window.display_handle()
    }
}