use embedder_traits::{EmbedderProxy, EventLoopWaker};
use euclid::Scale;
use keyboard_types::KeyboardEvent;
use msg::constellation_msg::{PipelineId, TopLevelBrowsingContextId, TraversalDirection};
use script_traits::{MediaSessionActionType, MouseButton, TouchEventType, TouchId, WheelDelta};
use servo_geometry::DeviceIndependentPixel;
use servo_media::player::context::{GlApi, GlContext, NativeDisplay};
use servo_url::ServoUrl;
use std::fmt::{Debug, Error, Formatter};
use std::time::Duration;
use style_traits::DevicePixel;
use webrender_api::units::DevicePoint;
use webrender_api::units::{DeviceIntPoint, DeviceIntRect, DeviceIntSize};
use webrender_api::ScrollLocation;
use webrender_surfman::WebrenderSurfman;
#[derive(Clone)]
pub enum MouseWindowEvent {
Click(MouseButton, DevicePoint),
MouseDown(MouseButton, DevicePoint),
MouseUp(MouseButton, DevicePoint),
}
#[derive(Clone)]
pub enum WebRenderDebugOption {
Profiler,
TextureCacheDebug,
RenderTargetDebug,
}
#[derive(Clone)]
pub enum WindowEvent {
Idle,
Refresh,
Resize,
AllowNavigationResponse(PipelineId, bool),
LoadUrl(TopLevelBrowsingContextId, ServoUrl),
MouseWindowEventClass(MouseWindowEvent),
MouseWindowMoveEventClass(DevicePoint),
Touch(TouchEventType, TouchId, DevicePoint),
Wheel(WheelDelta, DevicePoint),
Scroll(ScrollLocation, DeviceIntPoint, TouchEventType),
Zoom(f32),
PinchZoom(f32),
ResetZoom,
Navigation(TopLevelBrowsingContextId, TraversalDirection),
Quit,
ExitFullScreen(TopLevelBrowsingContextId),
Keyboard(KeyboardEvent),
Reload(TopLevelBrowsingContextId),
NewBrowser(ServoUrl, TopLevelBrowsingContextId),
CloseBrowser(TopLevelBrowsingContextId),
SendError(Option<TopLevelBrowsingContextId>, String),
SelectBrowser(TopLevelBrowsingContextId),
ToggleWebRenderDebug(WebRenderDebugOption),
CaptureWebRender,
ClearCache,
ToggleSamplingProfiler(Duration, Duration),
MediaSessionAction(MediaSessionActionType),
ChangeBrowserVisibility(TopLevelBrowsingContextId, bool),
IMEDismissed,
}
impl Debug for WindowEvent {
fn fmt(&self, f: &mut Formatter) -> Result<(), Error> {
match *self {
WindowEvent::Idle => write!(f, "Idle"),
WindowEvent::Refresh => write!(f, "Refresh"),
WindowEvent::Resize => write!(f, "Resize"),
WindowEvent::Keyboard(..) => write!(f, "Keyboard"),
WindowEvent::AllowNavigationResponse(..) => write!(f, "AllowNavigationResponse"),
WindowEvent::LoadUrl(..) => write!(f, "LoadUrl"),
WindowEvent::MouseWindowEventClass(..) => write!(f, "Mouse"),
WindowEvent::MouseWindowMoveEventClass(..) => write!(f, "MouseMove"),
WindowEvent::Touch(..) => write!(f, "Touch"),
WindowEvent::Wheel(..) => write!(f, "Wheel"),
WindowEvent::Scroll(..) => write!(f, "Scroll"),
WindowEvent::Zoom(..) => write!(f, "Zoom"),
WindowEvent::PinchZoom(..) => write!(f, "PinchZoom"),
WindowEvent::ResetZoom => write!(f, "ResetZoom"),
WindowEvent::Navigation(..) => write!(f, "Navigation"),
WindowEvent::Quit => write!(f, "Quit"),
WindowEvent::Reload(..) => write!(f, "Reload"),
WindowEvent::NewBrowser(..) => write!(f, "NewBrowser"),
WindowEvent::SendError(..) => write!(f, "SendError"),
WindowEvent::CloseBrowser(..) => write!(f, "CloseBrowser"),
WindowEvent::SelectBrowser(..) => write!(f, "SelectBrowser"),
WindowEvent::ToggleWebRenderDebug(..) => write!(f, "ToggleWebRenderDebug"),
WindowEvent::CaptureWebRender => write!(f, "CaptureWebRender"),
WindowEvent::ToggleSamplingProfiler(..) => write!(f, "ToggleSamplingProfiler"),
WindowEvent::ExitFullScreen(..) => write!(f, "ExitFullScreen"),
WindowEvent::MediaSessionAction(..) => write!(f, "MediaSessionAction"),
WindowEvent::ChangeBrowserVisibility(..) => write!(f, "ChangeBrowserVisibility"),
WindowEvent::IMEDismissed => write!(f, "IMEDismissed"),
WindowEvent::ClearCache => write!(f, "ClearCache"),
}
}
}
#[derive(Clone, Copy, Debug, PartialEq)]
pub enum AnimationState {
Idle,
Animating,
}
pub trait WindowMethods {
fn get_coordinates(&self) -> EmbedderCoordinates;
fn set_animation_state(&self, _state: AnimationState);
fn get_gl_context(&self) -> GlContext;
fn get_native_display(&self) -> NativeDisplay;
fn get_gl_api(&self) -> GlApi;
fn webrender_surfman(&self) -> WebrenderSurfman;
}
pub trait EmbedderMethods {
fn create_event_loop_waker(&mut self) -> Box<dyn EventLoopWaker>;
fn register_webxr(&mut self, _: &mut webxr::MainThreadRegistry, _: EmbedderProxy) {}
fn get_user_agent_string(&self) -> Option<String> {
None
}
}
#[derive(Clone, Copy, Debug)]
pub struct EmbedderCoordinates {
pub hidpi_factor: Scale<f32, DeviceIndependentPixel, DevicePixel>,
pub screen: DeviceIntSize,
pub screen_avail: DeviceIntSize,
pub window: (DeviceIntSize, DeviceIntPoint),
pub framebuffer: DeviceIntSize,
pub viewport: DeviceIntRect,
}
impl EmbedderCoordinates {
pub fn get_flipped_viewport(&self) -> DeviceIntRect {
let fb_height = self.framebuffer.height;
let mut view = self.viewport.clone();
view.origin.y = fb_height - view.origin.y - view.size.height;
DeviceIntRect::from_untyped(&view.to_untyped())
}
}