@@ -634,18 +634,18 @@ Point2i DisplayServerWeb::mouse_get_position() const {
634634}
635635
636636// Wheel
637- int DisplayServerWeb::mouse_wheel_callback (double p_delta_x, double p_delta_y) {
637+ int DisplayServerWeb::mouse_wheel_callback (int p_delta_mode, double p_delta_x, double p_delta_y) {
638638#ifdef PROXY_TO_PTHREAD_ENABLED
639639 if (!Thread::is_main_thread ()) {
640- callable_mp_static (DisplayServerWeb::_mouse_wheel_callback).call_deferred (p_delta_x, p_delta_y);
640+ callable_mp_static (DisplayServerWeb::_mouse_wheel_callback).call_deferred (p_delta_mode, p_delta_x, p_delta_y);
641641 return true ;
642642 }
643643#endif
644644
645- return _mouse_wheel_callback (p_delta_x, p_delta_y);
645+ return _mouse_wheel_callback (p_delta_mode, p_delta_x, p_delta_y);
646646}
647647
648- int DisplayServerWeb::_mouse_wheel_callback (double p_delta_x, double p_delta_y) {
648+ int DisplayServerWeb::_mouse_wheel_callback (int p_delta_mode, double p_delta_x, double p_delta_y) {
649649 if (!godot_js_display_canvas_is_focused () && !godot_js_is_ime_focused ()) {
650650 if (get_singleton ()->cursor_inside_canvas ) {
651651 godot_js_display_canvas_focus ();
@@ -665,21 +665,44 @@ int DisplayServerWeb::_mouse_wheel_callback(double p_delta_x, double p_delta_y)
665665 ev->set_ctrl_pressed (input->is_key_pressed (Key::CTRL));
666666 ev->set_meta_pressed (input->is_key_pressed (Key::META));
667667
668+ enum DeltaMode {
669+ DELTA_MODE_PIXEL = 0 ,
670+ DELTA_MODE_LINE = 1 ,
671+ DELTA_MODE_PAGE = 2 ,
672+ };
673+ const float MOUSE_WHEEL_PIXEL_FACTOR = 0 .03f ;
674+ const float MOUSE_WHEEL_LINE_FACTOR = 0 .3f ;
675+ const float MOUSE_WHEEL_PAGE_FACTOR = 1 .0f ;
676+ float mouse_wheel_factor;
677+
678+ switch (p_delta_mode) {
679+ case DELTA_MODE_PIXEL: {
680+ mouse_wheel_factor = MOUSE_WHEEL_PIXEL_FACTOR;
681+ } break ;
682+ case DELTA_MODE_LINE: {
683+ mouse_wheel_factor = MOUSE_WHEEL_LINE_FACTOR;
684+ } break ;
685+ case DELTA_MODE_PAGE: {
686+ mouse_wheel_factor = MOUSE_WHEEL_PAGE_FACTOR;
687+ } break ;
688+ }
689+
668690 if (p_delta_y < 0 ) {
669691 ev->set_button_index (MouseButton::WHEEL_UP);
692+ ev->set_factor (-p_delta_y * mouse_wheel_factor);
670693 } else if (p_delta_y > 0 ) {
671694 ev->set_button_index (MouseButton::WHEEL_DOWN);
695+ ev->set_factor (p_delta_y * mouse_wheel_factor);
672696 } else if (p_delta_x > 0 ) {
673697 ev->set_button_index (MouseButton::WHEEL_LEFT);
698+ ev->set_factor (p_delta_x * mouse_wheel_factor);
674699 } else if (p_delta_x < 0 ) {
675700 ev->set_button_index (MouseButton::WHEEL_RIGHT);
701+ ev->set_factor (-p_delta_x * mouse_wheel_factor);
676702 } else {
677703 return false ;
678704 }
679705
680- // Different browsers give wildly different delta values, and we can't
681- // interpret deltaMode, so use default value for wheel events' factor.
682-
683706 MouseButtonMask button_flag = mouse_button_to_mask (ev->get_button_index ());
684707 BitField<MouseButtonMask> button_mask = input->get_mouse_button_mask ();
685708 button_mask.set_flag (button_flag);
0 commit comments