denox_wsi 0.3.0

Window system integration for Denox
Documentation
use serde::{Serialize, Serializer};
use winit::{
  event::{
    ElementState, Force, MouseButton, MouseScrollDelta, TouchPhase,
    VirtualKeyCode,
  },
  window::Theme,
};

#[derive(Debug, Serialize)]
#[serde(rename_all = "kebab-case")]
pub enum WsiButtonState {
  Pressed,
  Released,
}

impl From<ElementState> for WsiButtonState {
  fn from(state: ElementState) -> Self {
    match state {
      ElementState::Pressed => Self::Pressed,
      ElementState::Released => Self::Released,
    }
  }
}

#[derive(Debug, Serialize)]
pub struct WsiKeyCode(#[serde(with = "WsiKeyCodeDef")] pub VirtualKeyCode);

#[derive(Serialize)]
#[serde(rename_all = "kebab-case", remote = "VirtualKeyCode")]
enum WsiKeyCodeDef {
  #[serde(rename = "1")]
  Key1,
  #[serde(rename = "2")]
  Key2,
  #[serde(rename = "3")]
  Key3,
  #[serde(rename = "4")]
  Key4,
  #[serde(rename = "5")]
  Key5,
  #[serde(rename = "6")]
  Key6,
  #[serde(rename = "7")]
  Key7,
  #[serde(rename = "8")]
  Key8,
  #[serde(rename = "9")]
  Key9,
  #[serde(rename = "0")]
  Key0,
  A,
  B,
  C,
  D,
  E,
  F,
  G,
  H,
  I,
  J,
  K,
  L,
  M,
  N,
  O,
  P,
  Q,
  R,
  S,
  T,
  U,
  V,
  W,
  X,
  Y,
  Z,
  Escape,
  F1,
  F2,
  F3,
  F4,
  F5,
  F6,
  F7,
  F8,
  F9,
  F10,
  F11,
  F12,
  F13,
  F14,
  F15,
  F16,
  F17,
  F18,
  F19,
  F20,
  F21,
  F22,
  F23,
  F24,
  Snapshot,
  Scroll,
  Pause,
  Insert,
  Home,
  Delete,
  End,
  PageDown,
  PageUp,
  Left,
  Up,
  Right,
  Down,
  Back,
  Return,
  Space,
  Compose,
  Caret,
  Numlock,
  #[serde(rename = "numpad-0")]
  Numpad0,
  #[serde(rename = "numpad-1")]
  Numpad1,
  #[serde(rename = "numpad-2")]
  Numpad2,
  #[serde(rename = "numpad-3")]
  Numpad3,
  #[serde(rename = "numpad-4")]
  Numpad4,
  #[serde(rename = "numpad-5")]
  Numpad5,
  #[serde(rename = "numpad-6")]
  Numpad6,
  #[serde(rename = "numpad-7")]
  Numpad7,
  #[serde(rename = "numpad-8")]
  Numpad8,
  #[serde(rename = "numpad-9")]
  Numpad9,
  NumpadAdd,
  NumpadDivide,
  NumpadDecimal,
  NumpadComma,
  NumpadEnter,
  NumpadEquals,
  NumpadMultiply,
  NumpadSubtract,
  AbntC1,
  AbntC2,
  Apostrophe,
  Apps,
  Asterisk,
  At,
  Ax,
  Backslash,
  Calculator,
  Capital,
  Colon,
  Comma,
  Convert,
  Equals,
  Grave,
  Kana,
  Kanji,
  #[serde(rename = "left-alt")]
  LAlt,
  #[serde(rename = "left-bracket")]
  LBracket,
  #[serde(rename = "left-ctrl")]
  LControl,
  #[serde(rename = "left-shift")]
  LShift,
  #[serde(rename = "left-gui")]
  LWin,
  Mail,
  MediaSelect,
  MediaStop,
  Minus,
  Mute,
  MyComputer,
  NavigateForward,
  NavigateBackward,
  NextTrack,
  NoConvert,
  #[serde(rename = "oem-102")]
  OEM102,
  Period,
  PlayPause,
  Plus,
  Power,
  PrevTrack,
  #[serde(rename = "right-alt")]
  RAlt,
  #[serde(rename = "right-bracket")]
  RBracket,
  #[serde(rename = "right-ctrl")]
  RControl,
  #[serde(rename = "right-shift")]
  RShift,
  #[serde(rename = "right-gui")]
  RWin,
  Semicolon,
  Slash,
  Sleep,
  Stop,
  Sysrq,
  Tab,
  Underline,
  Unlabeled,
  VolumeDown,
  VolumeUp,
  Wake,
  WebBack,
  WebFavorites,
  WebForward,
  WebHome,
  WebRefresh,
  WebSearch,
  WebStop,
  Yen,
  Copy,
  Paste,
  Cut,
}

#[derive(Debug)]
pub enum WsiMouseButton {
  Left,
  Right,
  Middle,
  Other(u16),
}

impl From<MouseButton> for WsiMouseButton {
  fn from(button: MouseButton) -> Self {
    match button {
      MouseButton::Left => Self::Left,
      MouseButton::Right => Self::Right,
      MouseButton::Middle => Self::Middle,
      MouseButton::Other(u) => Self::Other(u),
    }
  }
}

impl Serialize for WsiMouseButton {
  fn serialize<S: Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
    match self {
      Self::Left => s.serialize_str("left"),
      Self::Right => s.serialize_str("right"),
      Self::Middle => s.serialize_str("middle"),
      &Self::Other(u) => s.serialize_u16(u),
    }
  }
}

#[derive(Debug, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct WsiMouseDelta {
  x: f64,
  y: f64,
}

impl From<(f64, f64)> for WsiMouseDelta {
  fn from((x, y): (f64, f64)) -> Self {
    Self { x, y }
  }
}

#[derive(Debug, Serialize)]
#[serde(tag = "type", rename_all = "kebab-case")]
pub enum WsiScrollDelta {
  #[serde(rename_all = "camelCase")]
  LineDelta { x: f32, y: f32 },
  #[serde(rename_all = "camelCase")]
  PixelDelta { x: f64, y: f64 },
}

impl From<MouseScrollDelta> for WsiScrollDelta {
  fn from(delta: MouseScrollDelta) -> Self {
    match delta {
      MouseScrollDelta::LineDelta(x, y) => Self::LineDelta { x, y },
      MouseScrollDelta::PixelDelta(p) => Self::PixelDelta { x: p.x, y: p.y },
    }
  }
}

#[derive(Debug, Serialize)]
#[serde(tag = "type", rename_all = "kebab-case")]
pub enum WsiTouchForce {
  #[serde(rename_all = "camelCase")]
  Calibrated {
    value: f64,
    max_value: f64,
    altitude_angle: Option<f64>,
  },
  #[serde(rename_all = "camelCase")]
  Normalized { value: f64 },
}

impl From<Force> for WsiTouchForce {
  fn from(force: Force) -> Self {
    match force {
      Force::Calibrated {
        force,
        max_possible_force,
        altitude_angle,
      } => Self::Calibrated {
        value: force,
        max_value: max_possible_force,
        altitude_angle,
      },
      Force::Normalized(value) => Self::Normalized { value },
    }
  }
}

#[derive(Debug, Serialize)]
#[serde(rename_all = "kebab-case")]
pub enum WsiTouchPhase {
  Started,
  Moved,
  Ended,
  Cancelled,
}

impl From<TouchPhase> for WsiTouchPhase {
  fn from(phase: TouchPhase) -> Self {
    match phase {
      TouchPhase::Started => Self::Started,
      TouchPhase::Moved => Self::Moved,
      TouchPhase::Ended => Self::Ended,
      TouchPhase::Cancelled => Self::Cancelled,
    }
  }
}

#[derive(Debug, Serialize)]
#[serde(rename_all = "kebab-case")]
pub enum WsiWindowTheme {
  Light,
  Dark,
}

impl From<Theme> for WsiWindowTheme {
  fn from(theme: Theme) -> Self {
    match theme {
      Theme::Light => Self::Light,
      Theme::Dark => Self::Dark,
    }
  }
}