1 /* 2 * Copyright (c) 2020 Jabil Inc. 3 * Copyright (c) 2023 Nordic Semiconductor 4 * 5 * SPDX-License-Identifier: Apache-2.0 6 */ 7 8 #include <SDL.h> 9 #include "input_sdl_touch_bottom.h" 10 event_targets_display(SDL_Event * event,struct sdl_input_data * data)11static bool event_targets_display(SDL_Event *event, struct sdl_input_data *data) 12 { 13 SDL_Window *window = NULL; 14 const void *display_dev; 15 16 if (!data->display_dev) { 17 return true; 18 } 19 20 if (event->type == SDL_MOUSEBUTTONDOWN || event->type == SDL_MOUSEBUTTONUP) { 21 window = SDL_GetWindowFromID(event->button.windowID); 22 } else if (event->type == SDL_MOUSEMOTION) { 23 window = SDL_GetWindowFromID(event->motion.windowID); 24 } else { 25 return false; 26 } 27 28 if (!window) { 29 return false; 30 } 31 32 /* Get the zephyr display associated with the window */ 33 display_dev = SDL_GetWindowData(window, "zephyr_display"); 34 35 return !display_dev || display_dev == data->display_dev; 36 } 37 sdl_filter(void * arg,SDL_Event * event)38static int sdl_filter(void *arg, SDL_Event *event) 39 { 40 struct sdl_input_data *data = arg; 41 42 if (!event_targets_display(event, data)) { 43 return 1; 44 } 45 46 switch (event->type) { 47 case SDL_MOUSEBUTTONUP: 48 data->pressed = false; 49 data->just_released = true; 50 break; 51 case SDL_MOUSEBUTTONDOWN: 52 data->pressed = true; 53 break; 54 case SDL_MOUSEMOTION: 55 data->x = event->button.x; 56 data->y = event->button.y; 57 break; 58 default: 59 return 1; 60 } 61 62 data->callback(data); 63 64 return 1; 65 } 66 sdl_input_init_bottom(struct sdl_input_data * data)67void sdl_input_init_bottom(struct sdl_input_data *data) 68 { 69 SDL_AddEventWatch(sdl_filter, data); 70 } 71