You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
70 lines
1.4 KiB
70 lines
1.4 KiB
/* |
|
* Copyright (c) 2020 Jabil Inc. |
|
* Copyright (c) 2023 Nordic Semiconductor |
|
* |
|
* SPDX-License-Identifier: Apache-2.0 |
|
*/ |
|
|
|
#include <SDL.h> |
|
#include "input_sdl_touch_bottom.h" |
|
|
|
static bool event_targets_display(SDL_Event *event, struct sdl_input_data *data) |
|
{ |
|
SDL_Window *window = NULL; |
|
const void *display_dev; |
|
|
|
if (!data->display_dev) { |
|
return true; |
|
} |
|
|
|
if (event->type == SDL_MOUSEBUTTONDOWN || event->type == SDL_MOUSEBUTTONUP) { |
|
window = SDL_GetWindowFromID(event->button.windowID); |
|
} else if (event->type == SDL_MOUSEMOTION) { |
|
window = SDL_GetWindowFromID(event->motion.windowID); |
|
} else { |
|
return false; |
|
} |
|
|
|
if (!window) { |
|
return false; |
|
} |
|
|
|
/* Get the zephyr display associated with the window */ |
|
display_dev = SDL_GetWindowData(window, "zephyr_display"); |
|
|
|
return !display_dev || display_dev == data->display_dev; |
|
} |
|
|
|
static int sdl_filter(void *arg, SDL_Event *event) |
|
{ |
|
struct sdl_input_data *data = arg; |
|
|
|
if (!event_targets_display(event, data)) { |
|
return 1; |
|
} |
|
|
|
switch (event->type) { |
|
case SDL_MOUSEBUTTONUP: |
|
data->pressed = false; |
|
data->just_released = true; |
|
break; |
|
case SDL_MOUSEBUTTONDOWN: |
|
data->pressed = true; |
|
break; |
|
case SDL_MOUSEMOTION: |
|
data->x = event->button.x; |
|
data->y = event->button.y; |
|
break; |
|
default: |
|
return 1; |
|
} |
|
|
|
data->callback(data); |
|
|
|
return 1; |
|
} |
|
|
|
void sdl_input_init_bottom(struct sdl_input_data *data) |
|
{ |
|
SDL_AddEventWatch(sdl_filter, data); |
|
}
|
|
|