Skip to content

Commit

Permalink
Implemented SetWindowHitTest() for Wayland (thanks, x414e54!).
Browse files Browse the repository at this point in the history
Fixes Bugzilla #2941.
  • Loading branch information
icculus committed Apr 13, 2015
1 parent c6538cb commit d10201b
Show file tree
Hide file tree
Showing 4 changed files with 83 additions and 1 deletion.
76 changes: 75 additions & 1 deletion src/video/wayland/SDL_waylandevents.c
Expand Up @@ -52,6 +52,10 @@ struct SDL_WaylandInput {
SDL_WindowData *pointer_focus; SDL_WindowData *pointer_focus;
SDL_WindowData *keyboard_focus; SDL_WindowData *keyboard_focus;


/* Last motion location */
wl_fixed_t sx_w;
wl_fixed_t sy_w;

struct { struct {
struct xkb_keymap *keymap; struct xkb_keymap *keymap;
struct xkb_state *state; struct xkb_state *state;
Expand Down Expand Up @@ -119,13 +123,79 @@ pointer_handle_motion(void *data, struct wl_pointer *pointer,
{ {
struct SDL_WaylandInput *input = data; struct SDL_WaylandInput *input = data;
SDL_WindowData *window = input->pointer_focus; SDL_WindowData *window = input->pointer_focus;
input->sx_w = sx_w;
input->sy_w = sy_w;
int sx = wl_fixed_to_int(sx_w); int sx = wl_fixed_to_int(sx_w);
int sy = wl_fixed_to_int(sy_w); int sy = wl_fixed_to_int(sy_w);
if (input->pointer_focus) { if (input->pointer_focus) {
SDL_SendMouseMotion(window->sdlwindow, 0, 0, sx, sy); SDL_SendMouseMotion(window->sdlwindow, 0, 0, sx, sy);
} }
} }


static SDL_bool
ProcessHitTest(struct SDL_WaylandInput *input, uint32_t serial)
{
SDL_WindowData *window_data = input->pointer_focus;
SDL_Window *window = window_data->sdlwindow;
SDL_bool ret = SDL_FALSE;

if (window->hit_test) {
const SDL_Point point = { wl_fixed_to_int(input->sx_w), wl_fixed_to_int(input->sy_w) };
const SDL_HitTestResult rc = window->hit_test(window, &point, window->hit_test_data);
switch (rc) {
case SDL_HITTEST_DRAGGABLE: {
wl_shell_surface_move(window_data->shell_surface, input->seat, serial);
ret = SDL_TRUE;
}
break;
case SDL_HITTEST_RESIZE_TOPLEFT: {
wl_shell_surface_resize(window_data->shell_surface, input->seat, serial, WL_SHELL_SURFACE_RESIZE_TOP_LEFT);
ret = SDL_TRUE;
}
break;
case SDL_HITTEST_RESIZE_TOP: {
wl_shell_surface_resize(window_data->shell_surface, input->seat, serial, WL_SHELL_SURFACE_RESIZE_TOP);
ret = SDL_TRUE;
}
break;
case SDL_HITTEST_RESIZE_TOPRIGHT: {
wl_shell_surface_resize(window_data->shell_surface, input->seat, serial, WL_SHELL_SURFACE_RESIZE_TOP_RIGHT);
ret = SDL_TRUE;
}
break;
case SDL_HITTEST_RESIZE_RIGHT: {
wl_shell_surface_resize(window_data->shell_surface, input->seat, serial, WL_SHELL_SURFACE_RESIZE_RIGHT);
ret = SDL_TRUE;
}
break;
case SDL_HITTEST_RESIZE_BOTTOMRIGHT: {
wl_shell_surface_resize(window_data->shell_surface, input->seat, serial, WL_SHELL_SURFACE_RESIZE_BOTTOM_RIGHT);
ret = SDL_TRUE;
}
break;
case SDL_HITTEST_RESIZE_BOTTOM: {
wl_shell_surface_resize(window_data->shell_surface, input->seat, serial, WL_SHELL_SURFACE_RESIZE_BOTTOM);
ret = SDL_TRUE;
}
break;
case SDL_HITTEST_RESIZE_BOTTOMLEFT: {
wl_shell_surface_resize(window_data->shell_surface, input->seat, serial, WL_SHELL_SURFACE_RESIZE_BOTTOM_LEFT);
ret = SDL_TRUE;
}
break;
case SDL_HITTEST_RESIZE_LEFT: {
wl_shell_surface_resize(window_data->shell_surface, input->seat, serial, WL_SHELL_SURFACE_RESIZE_LEFT);
ret = SDL_TRUE;
}
break;
default:
break;
}
}

return ret;
}

static void static void
pointer_handle_button(void *data, struct wl_pointer *pointer, uint32_t serial, pointer_handle_button(void *data, struct wl_pointer *pointer, uint32_t serial,
uint32_t time, uint32_t button, uint32_t state_w) uint32_t time, uint32_t button, uint32_t state_w)
Expand All @@ -139,6 +209,9 @@ pointer_handle_button(void *data, struct wl_pointer *pointer, uint32_t serial,
switch (button) { switch (button) {
case BTN_LEFT: case BTN_LEFT:
sdl_button = SDL_BUTTON_LEFT; sdl_button = SDL_BUTTON_LEFT;
if (ProcessHitTest(data, serial)) {
return; /* don't pass this event on to app. */
}
break; break;
case BTN_MIDDLE: case BTN_MIDDLE:
sdl_button = SDL_BUTTON_MIDDLE; sdl_button = SDL_BUTTON_MIDDLE;
Expand Down Expand Up @@ -364,7 +437,8 @@ Wayland_display_add_input(SDL_VideoData *d, uint32_t id)


input->display = d; input->display = d;
input->seat = wl_registry_bind(d->registry, id, &wl_seat_interface, 1); input->seat = wl_registry_bind(d->registry, id, &wl_seat_interface, 1);

input->sx_w = wl_fixed_from_int(0);
input->sy_w = wl_fixed_from_int(0);
d->input = input; d->input = input;


wl_seat_add_listener(input->seat, &seat_listener, input); wl_seat_add_listener(input->seat, &seat_listener, input);
Expand Down
1 change: 1 addition & 0 deletions src/video/wayland/SDL_waylandvideo.c
Expand Up @@ -119,6 +119,7 @@ Wayland_CreateDevice(int devindex)
device->SetWindowFullscreen = Wayland_SetWindowFullscreen; device->SetWindowFullscreen = Wayland_SetWindowFullscreen;
device->SetWindowSize = Wayland_SetWindowSize; device->SetWindowSize = Wayland_SetWindowSize;
device->DestroyWindow = Wayland_DestroyWindow; device->DestroyWindow = Wayland_DestroyWindow;
device->SetWindowHitTest = Wayland_SetWindowHitTest;


device->free = Wayland_DeleteDevice; device->free = Wayland_DeleteDevice;


Expand Down
6 changes: 6 additions & 0 deletions src/video/wayland/SDL_waylandwindow.c
Expand Up @@ -109,6 +109,12 @@ Wayland_GetWindowWMInfo(_THIS, SDL_Window * window, SDL_SysWMinfo * info)
return SDL_TRUE; return SDL_TRUE;
} }


int
Wayland_SetWindowHitTest(SDL_Window *window, SDL_bool enabled)
{
return 0; /* just succeed, the real work is done elsewhere. */
}

void Wayland_ShowWindow(_THIS, SDL_Window *window) void Wayland_ShowWindow(_THIS, SDL_Window *window)
{ {
SDL_WindowData *wind = window->driverdata; SDL_WindowData *wind = window->driverdata;
Expand Down
1 change: 1 addition & 0 deletions src/video/wayland/SDL_waylandwindow.h
Expand Up @@ -55,6 +55,7 @@ extern void Wayland_DestroyWindow(_THIS, SDL_Window *window);


extern SDL_bool extern SDL_bool
Wayland_GetWindowWMInfo(_THIS, SDL_Window * window, SDL_SysWMinfo * info); Wayland_GetWindowWMInfo(_THIS, SDL_Window * window, SDL_SysWMinfo * info);
extern int Wayland_SetWindowHitTest(SDL_Window *window, SDL_bool enabled);


#endif /* _SDL_waylandwindow_h */ #endif /* _SDL_waylandwindow_h */


Expand Down

0 comments on commit d10201b

Please sign in to comment.