(
session: SimulatorSession,
bridge: NativeBridge,
udid: String,
mut receiver: mpsc::UnboundedReceiver<ControlMessage>,
)
| 2888 | } |
| 2889 | |
| 2890 | async fn run_control_queue( |
| 2891 | session: SimulatorSession, |
| 2892 | bridge: NativeBridge, |
| 2893 | udid: String, |
| 2894 | mut receiver: mpsc::UnboundedReceiver<ControlMessage>, |
| 2895 | ) { |
| 2896 | let mut pending = VecDeque::new(); |
| 2897 | let mut tvos_touch = TvosControlTouchGesture::default(); |
| 2898 | let mut multitouch_input_session: Option<Arc<NativeInputSession>> = None; |
| 2899 | loop { |
| 2900 | let mut message = match pending.pop_front() { |
| 2901 | Some(message) => message, |
| 2902 | None => { |
| 2903 | if multitouch_input_session.is_some() { |
| 2904 | tokio::select! { |
| 2905 | message = receiver.recv() => match message { |
| 2906 | Some(message) => message, |
| 2907 | None => break, |
| 2908 | }, |
| 2909 | _ = tokio::time::sleep(MULTITOUCH_INPUT_IDLE_TIMEOUT) => { |
| 2910 | multitouch_input_session = None; |
| 2911 | continue; |
| 2912 | } |
| 2913 | } |
| 2914 | } else { |
| 2915 | match receiver.recv().await { |
| 2916 | Some(message) => message, |
| 2917 | None => break, |
| 2918 | } |
| 2919 | } |
| 2920 | } |
| 2921 | }; |
| 2922 | if control_message_is_move(&message) { |
| 2923 | while let Ok(next_message) = receiver.try_recv() { |
| 2924 | if control_message_is_move(&next_message) { |
| 2925 | message = next_message; |
| 2926 | } else { |
| 2927 | pending.push_back(next_message); |
| 2928 | break; |
| 2929 | } |
| 2930 | } |
| 2931 | } |
| 2932 | if multitouch_input_session.is_some() |
| 2933 | && !matches!(message, ControlMessage::MultiTouch { .. }) |
| 2934 | { |
| 2935 | multitouch_input_session = None; |
| 2936 | } |
| 2937 | let result = match message { |
| 2938 | ControlMessage::ToggleAppearance => { |
| 2939 | run_toggle_appearance_control(bridge.clone(), udid.clone()).await |
| 2940 | } |
| 2941 | message if session.is_tvos() => { |
| 2942 | run_tvos_control_message(session.clone(), message, &mut tvos_touch).await |
| 2943 | } |
| 2944 | message @ ControlMessage::MultiTouch { .. } => { |
| 2945 | let should_clear_input = control_message_ends_touch(&message); |
| 2946 | let result = match bridge_input_session_for_control( |
| 2947 | &mut multitouch_input_session, |
no test coverage detected