mirror of
				https://github.com/godotengine/godot.git
				synced 2025-10-31 13:41:03 +00:00 
			
		
		
		
	Add support for pointer capture
This commit is contained in:
		
							parent
							
								
									92aedd5063
								
							
						
					
					
						commit
						5149311316
					
				
					 12 changed files with 205 additions and 48 deletions
				
			
		|  | @ -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) { | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Fredia Huya-Kouadio
						Fredia Huya-Kouadio