wayland: Send SDL_TOUCH_MOUSEID mouse events for touches.

This commit is contained in:
Ryan C. Gordon 2018-12-05 16:49:38 -05:00
parent 6259a72636
commit bd3ee07c83
2 changed files with 31 additions and 13 deletions

View File

@ -399,15 +399,21 @@ touch_handler_down(void *data, struct wl_touch *touch, unsigned int serial,
unsigned int timestamp, struct wl_surface *surface, unsigned int timestamp, struct wl_surface *surface,
int id, wl_fixed_t fx, wl_fixed_t fy) int id, wl_fixed_t fx, wl_fixed_t fy)
{ {
float x, y; SDL_WindowData *window_data = (SDL_WindowData *)wl_surface_get_user_data(surface);
SDL_WindowData* window; const double dblx = wl_fixed_to_double(fx);
const double dbly = wl_fixed_to_double(fy);
window = (SDL_WindowData *)wl_surface_get_user_data(surface); const float x = dblx / window_data->sdlwindow->w;
const float y = dbly / window_data->sdlwindow->h;
x = wl_fixed_to_double(fx) / window->sdlwindow->w;
y = wl_fixed_to_double(fy) / window->sdlwindow->h;
touch_add(id, x, y, surface); touch_add(id, x, y, surface);
if (!window_data->finger_touching) {
window_data->finger_touching = SDL_TRUE;
window_data->first_finger = id;
SDL_SendMouseMotion(window_data->sdlwindow, SDL_TOUCH_MOUSEID, 0, (int) dblx, (int) dbly);
SDL_SendMouseButton(window_data->sdlwindow, SDL_TOUCH_MOUSEID, SDL_PRESSED, SDL_BUTTON_LEFT);
}
SDL_SendTouch(1, (SDL_FingerID)id, SDL_TRUE, x, y, 1.0f); SDL_SendTouch(1, (SDL_FingerID)id, SDL_TRUE, x, y, 1.0f);
} }
@ -415,8 +421,14 @@ static void
touch_handler_up(void *data, struct wl_touch *touch, unsigned int serial, touch_handler_up(void *data, struct wl_touch *touch, unsigned int serial,
unsigned int timestamp, int id) unsigned int timestamp, int id)
{ {
SDL_WindowData *window_data = (SDL_WindowData *)wl_surface_get_user_data(touch_surface(id));
float x = 0, y = 0; float x = 0, y = 0;
if ((window_data->finger_touching) && (window_data->first_finger == id)) {
SDL_SendMouseButton(window_data->sdlwindow, SDL_TOUCH_MOUSEID, SDL_RELEASED, SDL_BUTTON_LEFT);
window_data->finger_touching = SDL_FALSE;
}
touch_del(id, &x, &y); touch_del(id, &x, &y);
SDL_SendTouch(1, (SDL_FingerID)id, SDL_FALSE, x, y, 0.0f); SDL_SendTouch(1, (SDL_FingerID)id, SDL_FALSE, x, y, 0.0f);
} }
@ -425,13 +437,15 @@ static void
touch_handler_motion(void *data, struct wl_touch *touch, unsigned int timestamp, touch_handler_motion(void *data, struct wl_touch *touch, unsigned int timestamp,
int id, wl_fixed_t fx, wl_fixed_t fy) int id, wl_fixed_t fx, wl_fixed_t fy)
{ {
float x, y; SDL_WindowData *window_data = (SDL_WindowData *)wl_surface_get_user_data(touch_surface(id));
SDL_WindowData* window; const double dblx = wl_fixed_to_double(fx);
const double dbly = wl_fixed_to_double(fy);
const float x = dblx / window_data->sdlwindow->w;
const float y = dbly / window_data->sdlwindow->h;
window = (SDL_WindowData *)wl_surface_get_user_data(touch_surface(id)); if ((window_data->finger_touching) && (window_data->first_finger == id)) {
SDL_SendMouseMotion(window_data->sdlwindow, SDL_TOUCH_MOUSEID, 0, (int) dblx, (int) dbly);
x = wl_fixed_to_double(fx) / window->sdlwindow->w; }
y = wl_fixed_to_double(fy) / window->sdlwindow->h;
touch_update(id, x, y); touch_update(id, x, y);
SDL_SendTouchMotion(1, (SDL_FingerID)id, x, y, 1.0f); SDL_SendTouchMotion(1, (SDL_FingerID)id, x, y, 1.0f);

View File

@ -26,6 +26,7 @@
#include "../SDL_sysvideo.h" #include "../SDL_sysvideo.h"
#include "SDL_syswm.h" #include "SDL_syswm.h"
#include "../../events/SDL_touch_c.h"
#include "SDL_waylandvideo.h" #include "SDL_waylandvideo.h"
@ -74,6 +75,9 @@ typedef struct {
uint32_t serial; uint32_t serial;
int width, height; int width, height;
} resize; } resize;
SDL_bool finger_touching; /* for mapping touch events to mice */
SDL_FingerID first_finger;
} SDL_WindowData; } SDL_WindowData;
extern void Wayland_ShowWindow(_THIS, SDL_Window *window); extern void Wayland_ShowWindow(_THIS, SDL_Window *window);