|
|
@ -18,16 +18,9 @@ static void convert_to_renderer_coordinates(SDL_Renderer *renderer, int *x, int
|
|
|
|
*y = (int) (*y / scale_y) - viewport.y;
|
|
|
|
*y = (int) (*y / scale_y) - viewport.y;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static struct point get_mouse_point(struct screen *screen) {
|
|
|
|
static void get_mouse_point(struct screen *screen, int *x, int *y) {
|
|
|
|
int x;
|
|
|
|
SDL_GetMouseState(x, y);
|
|
|
|
int y;
|
|
|
|
convert_to_renderer_coordinates(screen->renderer, x, y);
|
|
|
|
SDL_GetMouseState(&x, &y);
|
|
|
|
|
|
|
|
convert_to_renderer_coordinates(screen->renderer, &x, &y);
|
|
|
|
|
|
|
|
SDL_assert_release(x >= 0 && x < 0x10000 && y >= 0 && y < 0x10000);
|
|
|
|
|
|
|
|
return (struct point) {
|
|
|
|
|
|
|
|
.x = (Uint16) x,
|
|
|
|
|
|
|
|
.y = (Uint16) y,
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static const int ACTION_DOWN = 1;
|
|
|
|
static const int ACTION_DOWN = 1;
|
|
|
@ -271,8 +264,18 @@ void input_manager_process_mouse_motion(struct input_manager *input_manager,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static SDL_bool is_outside_device_screen(struct input_manager *input_manager,
|
|
|
|
|
|
|
|
int x, int y)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
return x < 0 || x >= input_manager->screen->frame_size.width ||
|
|
|
|
|
|
|
|
y < 0 || y >= input_manager->screen->frame_size.height;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void input_manager_process_mouse_button(struct input_manager *input_manager,
|
|
|
|
void input_manager_process_mouse_button(struct input_manager *input_manager,
|
|
|
|
const SDL_MouseButtonEvent *event) {
|
|
|
|
const SDL_MouseButtonEvent *event) {
|
|
|
|
|
|
|
|
SDL_bool outside_device_screen = is_outside_device_screen(input_manager,
|
|
|
|
|
|
|
|
event->x,
|
|
|
|
|
|
|
|
event->y);
|
|
|
|
if (event->type == SDL_MOUSEBUTTONDOWN) {
|
|
|
|
if (event->type == SDL_MOUSEBUTTONDOWN) {
|
|
|
|
if (event->button == SDL_BUTTON_RIGHT) {
|
|
|
|
if (event->button == SDL_BUTTON_RIGHT) {
|
|
|
|
press_back_or_turn_screen_on(input_manager->controller);
|
|
|
|
press_back_or_turn_screen_on(input_manager->controller);
|
|
|
@ -283,17 +286,19 @@ void input_manager_process_mouse_button(struct input_manager *input_manager,
|
|
|
|
return;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// double-click on black borders resize to fit the device screen
|
|
|
|
// double-click on black borders resize to fit the device screen
|
|
|
|
if (event->button == SDL_BUTTON_LEFT && event->clicks == 2) {
|
|
|
|
if (event->button == SDL_BUTTON_LEFT && event->clicks == 2
|
|
|
|
SDL_bool outside_device_screen =
|
|
|
|
&& outside_device_screen) {
|
|
|
|
event->x < 0 || event->x >= input_manager->screen->frame_size.width ||
|
|
|
|
|
|
|
|
event->y < 0 || event->y >= input_manager->screen->frame_size.height;
|
|
|
|
|
|
|
|
if (outside_device_screen) {
|
|
|
|
|
|
|
|
screen_resize_to_fit(input_manager->screen);
|
|
|
|
screen_resize_to_fit(input_manager->screen);
|
|
|
|
return;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// otherwise, send the click event to the device
|
|
|
|
// otherwise, send the click event to the device
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (outside_device_screen) {
|
|
|
|
|
|
|
|
// ignore
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
struct control_event control_event;
|
|
|
|
struct control_event control_event;
|
|
|
|
if (mouse_button_from_sdl_to_android(event, input_manager->screen->frame_size, &control_event)) {
|
|
|
|
if (mouse_button_from_sdl_to_android(event, input_manager->screen->frame_size, &control_event)) {
|
|
|
|
if (!controller_push_event(input_manager->controller, &control_event)) {
|
|
|
|
if (!controller_push_event(input_manager->controller, &control_event)) {
|
|
|
@ -304,9 +309,22 @@ void input_manager_process_mouse_button(struct input_manager *input_manager,
|
|
|
|
|
|
|
|
|
|
|
|
void input_manager_process_mouse_wheel(struct input_manager *input_manager,
|
|
|
|
void input_manager_process_mouse_wheel(struct input_manager *input_manager,
|
|
|
|
const SDL_MouseWheelEvent *event) {
|
|
|
|
const SDL_MouseWheelEvent *event) {
|
|
|
|
|
|
|
|
int x;
|
|
|
|
|
|
|
|
int y;
|
|
|
|
|
|
|
|
get_mouse_point(input_manager->screen, &x, &y);
|
|
|
|
|
|
|
|
if (is_outside_device_screen(input_manager, x, y)) {
|
|
|
|
|
|
|
|
// ignore
|
|
|
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
SDL_assert_release(x >= 0 && x < 0x10000 && y >= 0 && y < 0x10000);
|
|
|
|
|
|
|
|
|
|
|
|
struct position position = {
|
|
|
|
struct position position = {
|
|
|
|
.screen_size = input_manager->screen->frame_size,
|
|
|
|
.screen_size = input_manager->screen->frame_size,
|
|
|
|
.point = get_mouse_point(input_manager->screen),
|
|
|
|
.point = {
|
|
|
|
|
|
|
|
.x = (Uint16) x,
|
|
|
|
|
|
|
|
.y = (Uint16) y,
|
|
|
|
|
|
|
|
},
|
|
|
|
};
|
|
|
|
};
|
|
|
|
struct control_event control_event;
|
|
|
|
struct control_event control_event;
|
|
|
|
if (mouse_wheel_from_sdl_to_android(event, position, &control_event)) {
|
|
|
|
if (mouse_wheel_from_sdl_to_android(event, position, &control_event)) {
|
|
|
|