@@ -311,103 +311,57 @@ namespace uiwidgets
311311 vsync_batons_.push_back (baton);
312312 }
313313
314- void UIWidgetsPanel::SetEventPhaseFromCursorButtonState (
315- UIWidgetsPointerEvent *event_data)
316- {
317- MouseState state = GetMouseState ();
318- event_data->phase = state.buttons == 0
319- ? state.state_is_down ? UIWidgetsPointerPhase::kUp
320- : UIWidgetsPointerPhase::kHover
321- : state.state_is_down ? UIWidgetsPointerPhase::kMove
322- : UIWidgetsPointerPhase::kDown ;
323- }
324-
325- void UIWidgetsPanel::SendMouseMove (float x, float y)
326- {
327- UIWidgetsPointerEvent event = {};
328- event.x = x;
329- event.y = y;
330- SetEventPhaseFromCursorButtonState (&event);
331- SendPointerEventWithData (event);
332- }
333-
334- void UIWidgetsPanel::SendMouseDown (float x, float y)
335- {
336- UIWidgetsPointerEvent event = {};
337- SetEventPhaseFromCursorButtonState (&event);
338- event.x = x;
339- event.y = y;
340- SendPointerEventWithData (event);
341- SetMouseStateDown (true );
342- }
343-
344- void UIWidgetsPanel::SendMouseUp (float x, float y)
345- {
346- UIWidgetsPointerEvent event = {};
347- SetEventPhaseFromCursorButtonState (&event);
348- event.x = x;
349- event.y = y;
350- SendPointerEventWithData (event);
351- if (event.phase == UIWidgetsPointerPhase::kUp )
352- {
353- SetMouseStateDown (false );
354- }
355- }
356-
357- void UIWidgetsPanel::SendMouseLeave ()
358- {
359- UIWidgetsPointerEvent event = {};
360- event.phase = UIWidgetsPointerPhase::kRemove ;
361- SendPointerEventWithData (event);
362- }
363-
364- void UIWidgetsPanel::SendPointerEventWithData (
365- const UIWidgetsPointerEvent &event_data)
366- {
367- MouseState mouse_state = GetMouseState ();
368- // If sending anything other than an add, and the pointer isn't already added,
369- // synthesize an add to satisfy Flutter's expectations about events.
370- if (!mouse_state.state_is_added &&
371- event_data.phase != UIWidgetsPointerPhase::kAdd )
372- {
373- UIWidgetsPointerEvent event = {};
374- event.phase = UIWidgetsPointerPhase::kAdd ;
375- event.x = event_data.x ;
376- event.y = event_data.y ;
377- event.buttons = 0 ;
378- SendPointerEventWithData (event);
379- }
380- // Don't double-add (e.g., if events are delivered out of order, so an add has
381- // already been synthesized).
382- if (mouse_state.state_is_added &&
383- event_data.phase == UIWidgetsPointerPhase::kAdd )
384- {
385- return ;
386- }
314+ void UIWidgetsPanel::dispatchTouches (float x, float y, int button, UIWidgetsTouchPhase phase)
315+ {
316+ PointerData pointer_data;
317+ pointer_data.Clear ();
387318
388- UIWidgetsPointerEvent event = event_data;
389- event.device_kind = kUIWidgetsPointerDeviceKindMouse ;
390- event.buttons = mouse_state.buttons ;
319+ auto packet = std::make_unique<PointerDataPacket>(1 );
391320
392- // Set metadata that's always the same regardless of the event.
393- event.struct_size = sizeof (event);
394- event.timestamp =
395- std::chrono::duration_cast<std::chrono::microseconds>(
321+ pointer_data.time_stamp = std::chrono::duration_cast<std::chrono::microseconds>(
396322 std::chrono::high_resolution_clock::now ().time_since_epoch ())
397323 .count ();
398-
399- UIWidgetsEngineSendPointerEvent (engine_, &event, 1 );
400-
401- if (event_data.phase == UIWidgetsPointerPhase::kAdd )
402- {
403- SetMouseStateAdded (true );
404- }
405- else if (event_data.phase == UIWidgetsPointerPhase::kRemove )
406- {
407- SetMouseStateAdded (false );
408- ResetMouseState ();
409- }
410- }
324+
325+ pointer_data.change = UIWidgetsPanel::PointerDataChangeFromUITouchPhase (phase);
326+ pointer_data.kind = UIWidgetsPanel::DeviceKindFromTouchType ();
327+ pointer_data.device = -button;
328+ pointer_data.pointer_identifier = 0 ;
329+ pointer_data.physical_x = x;
330+ pointer_data.physical_y = y;
331+ pointer_data.physical_delta_x = 0.0 ;
332+ pointer_data.physical_delta_y = 0.0 ;
333+ pointer_data.pressure = 1.0 ;
334+ pointer_data.pressure_max = 1.0 ;
335+ pointer_data.signal_kind = PointerData::SignalKind::kNone ;
336+ packet->SetPointerData (0 , pointer_data);
337+
338+ reinterpret_cast <EmbedderEngine*>(engine_)->DispatchPointerDataPacket (
339+ std::move (packet));
340+ }
341+
342+ PointerData::Change UIWidgetsPanel::PointerDataChangeFromUITouchPhase (UIWidgetsTouchPhase phase)
343+ {
344+ switch (phase) {
345+ case TouchBegan:
346+ return PointerData::Change::kDown ;
347+ case TouchMoved:
348+ return PointerData::Change::kMove ;
349+ case TouchEnded:
350+ return PointerData::Change::kUp ;
351+ case TouchCancelled:
352+ return PointerData::Change::kCancel ;
353+ default :
354+ std::cerr << " Unhandled touch phase: " << phase << std::endl;
355+ break ;
356+ }
357+
358+ return PointerData::Change::kCancel ;
359+ }
360+
361+ PointerData::DeviceKind UIWidgetsPanel::DeviceKindFromTouchType ()
362+ {
363+ return PointerData::DeviceKind::kTouch ;
364+ }
411365
412366 void UIWidgetsPanel::OnKeyDown (int keyCode, bool isKeyDown)
413367 {
@@ -428,63 +382,34 @@ namespace uiwidgets
428382 }
429383 }
430384
431- void UIWidgetsPanel::OnMouseMove (float x, float y)
385+ void UIWidgetsPanel::OnMouseMove (float x, float y, int button )
432386 {
433387 if (process_events_)
434388 {
435- SendMouseMove (x, y);
436- }
437- }
438-
439- static uint64_t ConvertToUIWidgetsButton (int button)
440- {
441- switch (button)
442- {
443- case -1 :
444- return kUIWidgetsPointerButtonMousePrimary ;
445- case -2 :
446- return kUIWidgetsPointerButtonMouseSecondary ;
447- case -3 :
448- return kUIWidgetsPointerButtonMouseMiddle ;
389+ dispatchTouches (x, y, button, TouchMoved);
449390 }
450- std::cerr << " Mouse button not recognized: " << button << std::endl;
451- return 0 ;
452391 }
453392
454393 void UIWidgetsPanel::OnMouseDown (float x, float y, int button)
455394 {
456395 if (process_events_)
457396 {
458- uint64_t uiwidgets_button = ConvertToUIWidgetsButton (button);
459- if (uiwidgets_button != 0 )
460- {
461- uint64_t mouse_buttons = GetMouseState ().buttons | uiwidgets_button;
462- SetMouseButtons (mouse_buttons);
463- SendMouseDown (x, y);
464- }
397+ dispatchTouches (x, y, button, TouchBegan);
465398 }
466399 }
467400
468401 void UIWidgetsPanel::OnMouseUp (float x, float y, int button)
469402 {
470403 if (process_events_)
471404 {
472- uint64_t uiwidgets_button = ConvertToUIWidgetsButton (button);
473- if (uiwidgets_button != 0 )
474- {
475- uint64_t mouse_buttons = GetMouseState ().buttons & ~uiwidgets_button;
476- SetMouseButtons (mouse_buttons);
477- SendMouseUp (x, y);
478- }
405+ dispatchTouches (x, y, button, TouchEnded);
479406 }
480407 }
481408
482409 void UIWidgetsPanel::OnMouseLeave ()
483410 {
484- if (process_events_)
485- {
486- SendMouseLeave ();
487- }
411+ // there should not be mouse leave events on iPhone!
412+ std::cerr << " Invalid input on iPhone: mouse leave" << std::endl;
488413 }
489414
490415 UIWIDGETS_API (UIWidgetsPanel *)
@@ -563,7 +488,7 @@ namespace uiwidgets
563488 UIWIDGETS_API (void )
564489 UIWidgetsPanel_onMouseMove (UIWidgetsPanel *panel, float x, float y, int button)
565490 {
566- panel->OnMouseMove (x, y);
491+ panel->OnMouseMove (x, y, button );
567492 }
568493
569494 UIWIDGETS_API (void )
0 commit comments