Use BitField<> in core type masks
* All core types masks are now correctly marked as bitfields. * The enum hacks in MouseButtonMask and many other types are gone. This ensures that binders to other languages non C++ can actually implement type safe bitmasks. * Most bitmask operations replaced by functions in BitField<> * Key is still a problem because its enum and mask at the same time. While it kind of works in C++, this most likely can't be implemented safely in other languages and will have to be changed at some point. Mostly left as-is. * Documentation and API dump updated to reflect bitfields in core types.
This commit is contained in:
@@ -193,12 +193,12 @@ int DisplayServerWeb::mouse_button_callback(int p_pressed, int p_button, double
|
||||
}
|
||||
}
|
||||
|
||||
MouseButton mask = Input::get_singleton()->get_mouse_button_mask();
|
||||
MouseButton button_flag = mouse_button_to_mask(ev->get_button_index());
|
||||
BitField<MouseButtonMask> mask = Input::get_singleton()->get_mouse_button_mask();
|
||||
MouseButtonMask button_flag = mouse_button_to_mask(ev->get_button_index());
|
||||
if (ev->is_pressed()) {
|
||||
mask |= button_flag;
|
||||
} else if ((mask & button_flag) != MouseButton::NONE) {
|
||||
mask &= ~button_flag;
|
||||
mask.set_flag(button_flag);
|
||||
} else if (mask.has_flag(button_flag)) {
|
||||
mask.clear_flag(button_flag);
|
||||
} else {
|
||||
// Received release event, but press was outside the canvas, so ignore.
|
||||
return false;
|
||||
@@ -218,10 +218,10 @@ int DisplayServerWeb::mouse_button_callback(int p_pressed, int p_button, double
|
||||
}
|
||||
|
||||
void DisplayServerWeb::mouse_move_callback(double p_x, double p_y, double p_rel_x, double p_rel_y, int p_modifiers) {
|
||||
MouseButton input_mask = Input::get_singleton()->get_mouse_button_mask();
|
||||
BitField<MouseButtonMask> input_mask = Input::get_singleton()->get_mouse_button_mask();
|
||||
// For motion outside the canvas, only read mouse movement if dragging
|
||||
// started inside the canvas; imitating desktop app behavior.
|
||||
if (!get_singleton()->cursor_inside_canvas && input_mask == MouseButton::NONE) {
|
||||
if (!get_singleton()->cursor_inside_canvas && input_mask.is_empty()) {
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -525,15 +525,17 @@ int DisplayServerWeb::mouse_wheel_callback(double p_delta_x, double p_delta_y) {
|
||||
// Different browsers give wildly different delta values, and we can't
|
||||
// interpret deltaMode, so use default value for wheel events' factor.
|
||||
|
||||
MouseButton button_flag = mouse_button_to_mask(ev->get_button_index());
|
||||
MouseButtonMask button_flag = mouse_button_to_mask(ev->get_button_index());
|
||||
BitField<MouseButtonMask> button_mask = input->get_mouse_button_mask();
|
||||
button_mask.set_flag(button_flag);
|
||||
|
||||
ev->set_pressed(true);
|
||||
ev->set_button_mask(input->get_mouse_button_mask() | button_flag);
|
||||
ev->set_button_mask(button_mask);
|
||||
input->parse_input_event(ev);
|
||||
|
||||
Ref<InputEventMouseButton> release = ev->duplicate();
|
||||
release->set_pressed(false);
|
||||
release->set_button_mask(MouseButton(input->get_mouse_button_mask() & ~button_flag));
|
||||
release->set_button_mask(input->get_mouse_button_mask());
|
||||
input->parse_input_event(release);
|
||||
|
||||
return true;
|
||||
|
||||
Reference in New Issue
Block a user