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)11 static 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)38 static 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)67 void sdl_input_init_bottom(struct sdl_input_data *data)
68 {
69 	SDL_AddEventWatch(sdl_filter, data);
70 }
71