You've already forked godot
mirror of
https://github.com/godotengine/godot.git
synced 2025-11-05 12:10:55 +00:00
Add support for pointer capture
This commit is contained in:
@@ -207,7 +207,7 @@ void AndroidInputHandler::process_touch_event(int p_event, int p_pointer, const
|
||||
}
|
||||
}
|
||||
|
||||
void AndroidInputHandler::_parse_mouse_event_info(int buttons_mask, bool p_pressed, bool p_double_click) {
|
||||
void AndroidInputHandler::_parse_mouse_event_info(int buttons_mask, bool p_pressed, bool p_double_click, bool p_source_mouse_relative) {
|
||||
if (!mouse_event_info.valid) {
|
||||
return;
|
||||
}
|
||||
@@ -215,8 +215,14 @@ void AndroidInputHandler::_parse_mouse_event_info(int buttons_mask, bool p_press
|
||||
Ref<InputEventMouseButton> ev;
|
||||
ev.instance();
|
||||
_set_key_modifier_state(ev);
|
||||
ev->set_position(mouse_event_info.pos);
|
||||
ev->set_global_position(mouse_event_info.pos);
|
||||
if (p_source_mouse_relative) {
|
||||
ev->set_position(hover_prev_pos);
|
||||
ev->set_global_position(hover_prev_pos);
|
||||
} else {
|
||||
ev->set_position(mouse_event_info.pos);
|
||||
ev->set_global_position(mouse_event_info.pos);
|
||||
hover_prev_pos = mouse_event_info.pos;
|
||||
}
|
||||
ev->set_pressed(p_pressed);
|
||||
int changed_button_mask = buttons_state ^ buttons_mask;
|
||||
|
||||
@@ -226,15 +232,14 @@ void AndroidInputHandler::_parse_mouse_event_info(int buttons_mask, bool p_press
|
||||
ev->set_button_mask(buttons_mask);
|
||||
ev->set_doubleclick(p_double_click);
|
||||
input->parse_input_event(ev);
|
||||
hover_prev_pos = mouse_event_info.pos;
|
||||
}
|
||||
|
||||
void AndroidInputHandler::_release_mouse_event_info() {
|
||||
_parse_mouse_event_info(0, false, false);
|
||||
void AndroidInputHandler::_release_mouse_event_info(bool p_source_mouse_relative) {
|
||||
_parse_mouse_event_info(0, false, false, p_source_mouse_relative);
|
||||
mouse_event_info.valid = false;
|
||||
}
|
||||
|
||||
void AndroidInputHandler::process_mouse_event(int p_event_action, int p_event_android_buttons_mask, Point2 p_event_pos, Vector2 p_delta, bool p_double_click) {
|
||||
void AndroidInputHandler::process_mouse_event(int p_event_action, int p_event_android_buttons_mask, Point2 p_event_pos, Vector2 p_delta, bool p_double_click, bool p_source_mouse_relative) {
|
||||
int event_buttons_mask = _android_button_mask_to_godot_button_mask(p_event_android_buttons_mask);
|
||||
switch (p_event_action) {
|
||||
case AMOTION_EVENT_ACTION_HOVER_MOVE: // hover move
|
||||
@@ -259,13 +264,13 @@ void AndroidInputHandler::process_mouse_event(int p_event_action, int p_event_an
|
||||
|
||||
mouse_event_info.valid = true;
|
||||
mouse_event_info.pos = p_event_pos;
|
||||
_parse_mouse_event_info(event_buttons_mask, true, p_double_click);
|
||||
_parse_mouse_event_info(event_buttons_mask, true, p_double_click, p_source_mouse_relative);
|
||||
} break;
|
||||
|
||||
case AMOTION_EVENT_ACTION_UP:
|
||||
case AMOTION_EVENT_ACTION_CANCEL:
|
||||
case AMOTION_EVENT_ACTION_BUTTON_RELEASE: {
|
||||
_release_mouse_event_info();
|
||||
_release_mouse_event_info(p_source_mouse_relative);
|
||||
} break;
|
||||
|
||||
case AMOTION_EVENT_ACTION_MOVE: {
|
||||
@@ -276,21 +281,32 @@ void AndroidInputHandler::process_mouse_event(int p_event_action, int p_event_an
|
||||
Ref<InputEventMouseMotion> ev;
|
||||
ev.instance();
|
||||
_set_key_modifier_state(ev);
|
||||
ev->set_position(p_event_pos);
|
||||
ev->set_global_position(p_event_pos);
|
||||
ev->set_relative(p_event_pos - hover_prev_pos);
|
||||
if (p_source_mouse_relative) {
|
||||
ev->set_position(hover_prev_pos);
|
||||
ev->set_global_position(hover_prev_pos);
|
||||
ev->set_relative(p_event_pos);
|
||||
} else {
|
||||
ev->set_position(p_event_pos);
|
||||
ev->set_global_position(p_event_pos);
|
||||
ev->set_relative(p_event_pos - hover_prev_pos);
|
||||
mouse_event_info.pos = p_event_pos;
|
||||
hover_prev_pos = p_event_pos;
|
||||
}
|
||||
ev->set_button_mask(event_buttons_mask);
|
||||
input->parse_input_event(ev);
|
||||
mouse_event_info.pos = p_event_pos;
|
||||
hover_prev_pos = p_event_pos;
|
||||
} break;
|
||||
|
||||
case AMOTION_EVENT_ACTION_SCROLL: {
|
||||
Ref<InputEventMouseButton> ev;
|
||||
ev.instance();
|
||||
_set_key_modifier_state(ev);
|
||||
ev->set_position(p_event_pos);
|
||||
ev->set_global_position(p_event_pos);
|
||||
if (p_source_mouse_relative) {
|
||||
ev->set_position(hover_prev_pos);
|
||||
ev->set_global_position(hover_prev_pos);
|
||||
} else {
|
||||
ev->set_position(p_event_pos);
|
||||
ev->set_global_position(p_event_pos);
|
||||
}
|
||||
ev->set_pressed(true);
|
||||
buttons_state = event_buttons_mask;
|
||||
if (p_delta.y > 0) {
|
||||
|
||||
Reference in New Issue
Block a user