MouseEvent.cpp 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. /*
  2. * Copyright (c) 2020, the SerenityOS developers.
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #include <LibGUI/Event.h>
  7. #include <LibWeb/HTML/EventNames.h>
  8. #include <LibWeb/UIEvents/EventNames.h>
  9. #include <LibWeb/UIEvents/MouseEvent.h>
  10. namespace Web::UIEvents {
  11. MouseEvent::MouseEvent(FlyString const& event_name, MouseEventInit const& event_init)
  12. : UIEvent(event_name, event_init)
  13. , m_offset_x(event_init.offset_x)
  14. , m_offset_y(event_init.offset_y)
  15. , m_client_x(event_init.client_x)
  16. , m_client_y(event_init.client_y)
  17. , m_button(event_init.button)
  18. {
  19. set_event_characteristics();
  20. }
  21. // https://www.w3.org/TR/uievents/#dom-mouseevent-button
  22. static i16 determine_button(unsigned mouse_button)
  23. {
  24. switch (mouse_button) {
  25. case GUI::MouseButton::Primary:
  26. return 0;
  27. case GUI::MouseButton::Middle:
  28. return 1;
  29. case GUI::MouseButton::Secondary:
  30. return 2;
  31. case GUI::MouseButton::Backward:
  32. return 3;
  33. case GUI::MouseButton::Forward:
  34. return 4;
  35. default:
  36. VERIFY_NOT_REACHED();
  37. }
  38. }
  39. NonnullRefPtr<MouseEvent> MouseEvent::create_from_platform_event(FlyString const& event_name, double offset_x, double offset_y, double client_x, double client_y, unsigned mouse_button)
  40. {
  41. MouseEventInit event_init {};
  42. event_init.offset_x = offset_x;
  43. event_init.offset_y = offset_y;
  44. event_init.client_x = client_x;
  45. event_init.client_y = client_y;
  46. event_init.button = determine_button(mouse_button);
  47. return MouseEvent::create(event_name, event_init);
  48. }
  49. void MouseEvent::set_event_characteristics()
  50. {
  51. if (type().is_one_of(EventNames::mousedown, EventNames::mousemove, EventNames::mouseout, EventNames::mouseover, EventNames::mouseup, HTML::EventNames::click)) {
  52. set_bubbles(true);
  53. set_cancelable(true);
  54. set_composed(true);
  55. }
  56. }
  57. }