events.rs 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219
  1. //! Convert a serialized event to an event trigger
  2. use std::any::Any;
  3. use std::sync::Arc;
  4. use dioxus_core::{ElementId, EventPriority, UserEvent};
  5. use dioxus_html::event_bubbles;
  6. use dioxus_html::on::*;
  7. #[derive(serde::Serialize, serde::Deserialize)]
  8. pub(crate) struct IpcMessage {
  9. method: String,
  10. params: serde_json::Value,
  11. }
  12. impl IpcMessage {
  13. pub(crate) fn method(&self) -> &str {
  14. self.method.as_str()
  15. }
  16. pub(crate) fn params(self) -> serde_json::Value {
  17. self.params
  18. }
  19. }
  20. pub(crate) fn parse_ipc_message(payload: &str) -> Option<IpcMessage> {
  21. match serde_json::from_str(payload) {
  22. Ok(message) => Some(message),
  23. Err(e) => {
  24. log::error!("could not parse IPC message, error: {}", e);
  25. None
  26. }
  27. }
  28. }
  29. #[derive(serde::Serialize, serde::Deserialize)]
  30. struct ImEvent {
  31. event: String,
  32. mounted_dom_id: u64,
  33. contents: serde_json::Value,
  34. }
  35. pub fn trigger_from_serialized(val: serde_json::Value) -> UserEvent {
  36. let ImEvent {
  37. event,
  38. mounted_dom_id,
  39. contents,
  40. } = serde_json::from_value(val).unwrap();
  41. let mounted_dom_id = Some(ElementId(mounted_dom_id as usize));
  42. let name = event_name_from_type(&event);
  43. let event = make_synthetic_event(&event, contents);
  44. UserEvent {
  45. name,
  46. priority: EventPriority::Low,
  47. scope_id: None,
  48. element: mounted_dom_id,
  49. bubbles: event_bubbles(name),
  50. data: event,
  51. }
  52. }
  53. fn make_synthetic_event(name: &str, val: serde_json::Value) -> Arc<dyn Any + Send + Sync> {
  54. match name {
  55. "copy" | "cut" | "paste" => {
  56. //
  57. Arc::new(ClipboardData {})
  58. }
  59. "compositionend" | "compositionstart" | "compositionupdate" => {
  60. Arc::new(serde_json::from_value::<CompositionData>(val).unwrap())
  61. }
  62. "keydown" | "keypress" | "keyup" => {
  63. let evt = serde_json::from_value::<KeyboardData>(val).unwrap();
  64. Arc::new(evt)
  65. }
  66. "focus" | "blur" | "focusout" | "focusin" => {
  67. //
  68. Arc::new(FocusData {})
  69. }
  70. // todo: these handlers might get really slow if the input box gets large and allocation pressure is heavy
  71. // don't have a good solution with the serialized event problem
  72. "change" | "input" | "invalid" | "reset" | "submit" => {
  73. Arc::new(serde_json::from_value::<FormData>(val).unwrap())
  74. }
  75. "click" | "contextmenu" | "dblclick" | "doubleclick" | "drag" | "dragend" | "dragenter"
  76. | "dragexit" | "dragleave" | "dragover" | "dragstart" | "drop" | "mousedown"
  77. | "mouseenter" | "mouseleave" | "mousemove" | "mouseout" | "mouseover" | "mouseup" => {
  78. Arc::new(serde_json::from_value::<MouseData>(val).unwrap())
  79. }
  80. "pointerdown" | "pointermove" | "pointerup" | "pointercancel" | "gotpointercapture"
  81. | "lostpointercapture" | "pointerenter" | "pointerleave" | "pointerover" | "pointerout" => {
  82. Arc::new(serde_json::from_value::<PointerData>(val).unwrap())
  83. }
  84. "select" => {
  85. //
  86. Arc::new(serde_json::from_value::<SelectionData>(val).unwrap())
  87. }
  88. "touchcancel" | "touchend" | "touchmove" | "touchstart" => {
  89. Arc::new(serde_json::from_value::<TouchData>(val).unwrap())
  90. }
  91. "scroll" => Arc::new(()),
  92. "wheel" => Arc::new(serde_json::from_value::<WheelData>(val).unwrap()),
  93. "animationstart" | "animationend" | "animationiteration" => {
  94. Arc::new(serde_json::from_value::<AnimationData>(val).unwrap())
  95. }
  96. "transitionend" => Arc::new(serde_json::from_value::<TransitionData>(val).unwrap()),
  97. "abort" | "canplay" | "canplaythrough" | "durationchange" | "emptied" | "encrypted"
  98. | "ended" | "error" | "loadeddata" | "loadedmetadata" | "loadstart" | "pause" | "play"
  99. | "playing" | "progress" | "ratechange" | "seeked" | "seeking" | "stalled" | "suspend"
  100. | "timeupdate" | "volumechange" | "waiting" => {
  101. //
  102. Arc::new(MediaData {})
  103. }
  104. "toggle" => Arc::new(ToggleData {}),
  105. _ => Arc::new(()),
  106. }
  107. }
  108. fn event_name_from_type(typ: &str) -> &'static str {
  109. match typ {
  110. "copy" => "copy",
  111. "cut" => "cut",
  112. "paste" => "paste",
  113. "compositionend" => "compositionend",
  114. "compositionstart" => "compositionstart",
  115. "compositionupdate" => "compositionupdate",
  116. "keydown" => "keydown",
  117. "keypress" => "keypress",
  118. "keyup" => "keyup",
  119. "focus" => "focus",
  120. "focusout" => "focusout",
  121. "focusin" => "focusin",
  122. "blur" => "blur",
  123. "change" => "change",
  124. "input" => "input",
  125. "invalid" => "invalid",
  126. "reset" => "reset",
  127. "submit" => "submit",
  128. "click" => "click",
  129. "contextmenu" => "contextmenu",
  130. "doubleclick" => "doubleclick",
  131. "dblclick" => "dblclick",
  132. "drag" => "drag",
  133. "dragend" => "dragend",
  134. "dragenter" => "dragenter",
  135. "dragexit" => "dragexit",
  136. "dragleave" => "dragleave",
  137. "dragover" => "dragover",
  138. "dragstart" => "dragstart",
  139. "drop" => "drop",
  140. "mousedown" => "mousedown",
  141. "mouseenter" => "mouseenter",
  142. "mouseleave" => "mouseleave",
  143. "mousemove" => "mousemove",
  144. "mouseout" => "mouseout",
  145. "mouseover" => "mouseover",
  146. "mouseup" => "mouseup",
  147. "pointerdown" => "pointerdown",
  148. "pointermove" => "pointermove",
  149. "pointerup" => "pointerup",
  150. "pointercancel" => "pointercancel",
  151. "gotpointercapture" => "gotpointercapture",
  152. "lostpointercapture" => "lostpointercapture",
  153. "pointerenter" => "pointerenter",
  154. "pointerleave" => "pointerleave",
  155. "pointerover" => "pointerover",
  156. "pointerout" => "pointerout",
  157. "select" => "select",
  158. "touchcancel" => "touchcancel",
  159. "touchend" => "touchend",
  160. "touchmove" => "touchmove",
  161. "touchstart" => "touchstart",
  162. "scroll" => "scroll",
  163. "wheel" => "wheel",
  164. "animationstart" => "animationstart",
  165. "animationend" => "animationend",
  166. "animationiteration" => "animationiteration",
  167. "transitionend" => "transitionend",
  168. "abort" => "abort",
  169. "canplay" => "canplay",
  170. "canplaythrough" => "canplaythrough",
  171. "durationchange" => "durationchange",
  172. "emptied" => "emptied",
  173. "encrypted" => "encrypted",
  174. "ended" => "ended",
  175. "error" => "error",
  176. "loadeddata" => "loadeddata",
  177. "loadedmetadata" => "loadedmetadata",
  178. "loadstart" => "loadstart",
  179. "pause" => "pause",
  180. "play" => "play",
  181. "playing" => "playing",
  182. "progress" => "progress",
  183. "ratechange" => "ratechange",
  184. "seeked" => "seeked",
  185. "seeking" => "seeking",
  186. "stalled" => "stalled",
  187. "suspend" => "suspend",
  188. "timeupdate" => "timeupdate",
  189. "volumechange" => "volumechange",
  190. "waiting" => "waiting",
  191. "toggle" => "toggle",
  192. a => {
  193. panic!("unsupported event type {:?}", a);
  194. }
  195. }
  196. }