src/video/wayland/SDL_waylandmouse.c
author Sam Lantinga
Thu, 17 Apr 2014 20:21:10 -0700
changeset 8710 403c95143f8a
parent 8149 681eb46b8ac4
child 8711 46f85bfe9303
permissions -rw-r--r--
Fixed bug 2482 - Wayland_CreateSystemCursor trying to load nonexistent "wait" cursor

Bryan Cain

Wayland_CreateSystemCursor tries to load a cursor named "wait" for two of the system cursor categories. This causes a segmentation fault when one of these cursors is used, because "wait" is not an actual cursor name in X11/Wayland cursor themes.

I can't attach my patch since I'm on a mobile right now, but I can confirm that simply replacing "wait" with "watch" for both of its uses in Wayland_CreateSystemCursor (in SDL_waylandmouse.c) fixes the bug.
gabomdq@8062
     1
/*
gabomdq@8062
     2
  Simple DirectMedia Layer
slouken@8149
     3
  Copyright (C) 1997-2014 Sam Lantinga <slouken@libsdl.org>
gabomdq@8062
     4
gabomdq@8062
     5
  This software is provided 'as-is', without any express or implied
gabomdq@8062
     6
  warranty.  In no event will the authors be held liable for any damages
gabomdq@8062
     7
  arising from the use of this software.
gabomdq@8062
     8
gabomdq@8062
     9
  Permission is granted to anyone to use this software for any purpose,
gabomdq@8062
    10
  including commercial applications, and to alter it and redistribute it
gabomdq@8062
    11
  freely, subject to the following restrictions:
gabomdq@8062
    12
gabomdq@8062
    13
  1. The origin of this software must not be misrepresented; you must not
gabomdq@8062
    14
     claim that you wrote the original software. If you use this software
gabomdq@8062
    15
     in a product, an acknowledgment in the product documentation would be
gabomdq@8062
    16
     appreciated but is not required.
gabomdq@8062
    17
  2. Altered source versions must be plainly marked as such, and must not be
gabomdq@8062
    18
     misrepresented as being the original software.
gabomdq@8062
    19
  3. This notice may not be removed or altered from any source distribution.
gabomdq@8062
    20
*/
gabomdq@8062
    21
icculus@8116
    22
#include "../../SDL_internal.h"
icculus@8116
    23
icculus@8116
    24
#if SDL_VIDEO_DRIVER_WAYLAND
icculus@8116
    25
gabomdq@8062
    26
#ifndef _GNU_SOURCE
gabomdq@8062
    27
#define _GNU_SOURCE
gabomdq@8062
    28
#endif
gabomdq@8062
    29
gabomdq@8062
    30
#include <errno.h>
gabomdq@8062
    31
#include <sys/types.h>
gabomdq@8062
    32
#include <sys/mman.h>
gabomdq@8062
    33
#include <fcntl.h>
gabomdq@8062
    34
#include <unistd.h>
gabomdq@8062
    35
#include <stdlib.h>
gabomdq@8062
    36
#include <limits.h>
gabomdq@8062
    37
gabomdq@8062
    38
#include "../SDL_sysvideo.h"
gabomdq@8062
    39
gabomdq@8062
    40
#include "SDL_mouse.h"
gabomdq@8062
    41
#include "../../events/SDL_mouse_c.h"
gabomdq@8062
    42
#include "SDL_waylandvideo.h"
gabomdq@8062
    43
#include "SDL_waylandevents_c.h"
gabomdq@8062
    44
gabomdq@8104
    45
#include "SDL_waylanddyn.h"
gabomdq@8104
    46
#include "wayland-cursor.h"
gabomdq@8104
    47
gabomdq@8062
    48
#include "SDL_assert.h"
gabomdq@8062
    49
gabomdq@8062
    50
gabomdq@8062
    51
typedef struct {
gabomdq@8062
    52
    struct wl_buffer   *buffer;
gabomdq@8062
    53
    struct wl_surface  *surface;
gabomdq@8062
    54
gabomdq@8062
    55
    int                hot_x, hot_y;
gabomdq@8062
    56
gabomdq@8062
    57
    /* Either a preloaded cursor, or one we created ourselves */
gabomdq@8062
    58
    struct wl_cursor   *cursor;
gabomdq@8062
    59
    void               *shm_data;
gabomdq@8062
    60
} Wayland_CursorData;
gabomdq@8062
    61
gabomdq@8062
    62
static int
gabomdq@8062
    63
wayland_create_tmp_file(off_t size)
gabomdq@8062
    64
{
gabomdq@8062
    65
    static const char template[] = "/sdl-shared-XXXXXX";
gabomdq@8062
    66
    char *xdg_path;
gabomdq@8062
    67
    char tmp_path[PATH_MAX];
gabomdq@8062
    68
    int fd;
gabomdq@8062
    69
gabomdq@8062
    70
    xdg_path = SDL_getenv("XDG_RUNTIME_DIR");
gabomdq@8062
    71
    if (!xdg_path) {
gabomdq@8062
    72
        errno = ENOENT;
gabomdq@8062
    73
        return -1;
gabomdq@8062
    74
    }
gabomdq@8062
    75
gabomdq@8062
    76
    SDL_strlcpy(tmp_path, xdg_path, PATH_MAX);
gabomdq@8062
    77
    SDL_strlcat(tmp_path, template, PATH_MAX);
gabomdq@8062
    78
gabomdq@8062
    79
    fd = mkostemp(tmp_path, O_CLOEXEC);
gabomdq@8062
    80
    if (fd < 0)
gabomdq@8062
    81
        return -1;
gabomdq@8062
    82
gabomdq@8062
    83
    if (ftruncate(fd, size) < 0) {
gabomdq@8062
    84
        close(fd);
gabomdq@8062
    85
        return -1;
gabomdq@8062
    86
    }
gabomdq@8062
    87
gabomdq@8062
    88
    return fd;
gabomdq@8062
    89
}
gabomdq@8062
    90
gabomdq@8062
    91
static void
gabomdq@8062
    92
mouse_buffer_release(void *data, struct wl_buffer *buffer)
gabomdq@8062
    93
{
gabomdq@8062
    94
}
gabomdq@8062
    95
gabomdq@8062
    96
static const struct wl_buffer_listener mouse_buffer_listener = {
gabomdq@8062
    97
    mouse_buffer_release
gabomdq@8062
    98
};
gabomdq@8062
    99
gabomdq@8062
   100
static int
gabomdq@8062
   101
create_buffer_from_shm(Wayland_CursorData *d,
gabomdq@8062
   102
                       int width,
gabomdq@8062
   103
                       int height,
gabomdq@8062
   104
                       uint32_t format)
gabomdq@8062
   105
{
gabomdq@8062
   106
    SDL_VideoDevice *vd = SDL_GetVideoDevice();
gabomdq@8062
   107
    SDL_VideoData *data = (SDL_VideoData *) vd->driverdata;
gabomdq@8062
   108
gabomdq@8062
   109
    int stride = width * 4;
gabomdq@8062
   110
    int size = stride * height;
gabomdq@8062
   111
gabomdq@8062
   112
    int shm_fd;
gabomdq@8062
   113
gabomdq@8062
   114
    shm_fd = wayland_create_tmp_file(size);
gabomdq@8062
   115
    if (shm_fd < 0)
gabomdq@8062
   116
    {
gabomdq@8062
   117
        fprintf(stderr, "creating mouse cursor buffer failed!\n");
gabomdq@8062
   118
        return -1;
gabomdq@8062
   119
    }
gabomdq@8062
   120
gabomdq@8062
   121
    d->shm_data = mmap(NULL,
gabomdq@8062
   122
                       size,
gabomdq@8062
   123
                       PROT_READ | PROT_WRITE,
gabomdq@8062
   124
                       MAP_SHARED,
gabomdq@8062
   125
                       shm_fd,
gabomdq@8062
   126
                       0);
gabomdq@8062
   127
    if (data == MAP_FAILED) {
gabomdq@8062
   128
        d->shm_data = NULL;
gabomdq@8062
   129
        fprintf (stderr, "mmap () failed\n");
gabomdq@8062
   130
        close (shm_fd);
gabomdq@8062
   131
    }
gabomdq@8062
   132
gabomdq@8062
   133
    struct wl_shm_pool *shm_pool = wl_shm_create_pool(data->shm,
gabomdq@8062
   134
                                                      shm_fd,
gabomdq@8062
   135
                                                      size);
gabomdq@8062
   136
    d->buffer = wl_shm_pool_create_buffer(shm_pool,
gabomdq@8062
   137
                                          0,
gabomdq@8062
   138
                                          width,
gabomdq@8062
   139
                                          height,
gabomdq@8062
   140
                                          stride,
gabomdq@8062
   141
                                          format);
gabomdq@8062
   142
    wl_buffer_add_listener(d->buffer,
gabomdq@8062
   143
                           &mouse_buffer_listener,
gabomdq@8062
   144
                           d);
gabomdq@8062
   145
gabomdq@8062
   146
    wl_shm_pool_destroy (shm_pool);
gabomdq@8062
   147
    close (shm_fd);
gabomdq@8062
   148
gabomdq@8062
   149
    return 0;
gabomdq@8062
   150
}
gabomdq@8062
   151
gabomdq@8062
   152
static SDL_Cursor *
gabomdq@8062
   153
Wayland_CreateCursor(SDL_Surface *surface, int hot_x, int hot_y)
gabomdq@8062
   154
{
gabomdq@8062
   155
    SDL_Cursor *cursor;
gabomdq@8062
   156
gabomdq@8062
   157
    cursor = calloc(1, sizeof (*cursor));
gabomdq@8062
   158
    if (cursor) {
gabomdq@8062
   159
        SDL_VideoDevice *vd = SDL_GetVideoDevice ();
gabomdq@8062
   160
        SDL_VideoData *wd = (SDL_VideoData *) vd->driverdata;
gabomdq@8062
   161
        Wayland_CursorData *data = calloc (1, sizeof (Wayland_CursorData));
gabomdq@8062
   162
        cursor->driverdata = (void *) data;
gabomdq@8062
   163
gabomdq@8062
   164
        /* Assume ARGB8888 */
gabomdq@8062
   165
        SDL_assert(surface->format->format == SDL_PIXELFORMAT_ARGB8888);
gabomdq@8062
   166
        SDL_assert(surface->pitch == surface->w * 4);
gabomdq@8062
   167
gabomdq@8062
   168
        /* Allocate shared memory buffer for this cursor */
gabomdq@8062
   169
        if (create_buffer_from_shm (data,
gabomdq@8062
   170
                                    surface->w,
gabomdq@8062
   171
                                    surface->h,
gabomdq@8062
   172
                                    WL_SHM_FORMAT_XRGB8888) < 0)
gabomdq@8062
   173
        {
gabomdq@8062
   174
            free (cursor->driverdata);
gabomdq@8062
   175
            free (cursor);
gabomdq@8062
   176
            return NULL;
gabomdq@8062
   177
        }
gabomdq@8062
   178
gabomdq@8062
   179
        SDL_memcpy(data->shm_data,
gabomdq@8062
   180
                   surface->pixels,
gabomdq@8062
   181
                   surface->h * surface->pitch);
gabomdq@8062
   182
gabomdq@8062
   183
        data->surface = wl_compositor_create_surface(wd->compositor);
gabomdq@8135
   184
        wl_surface_set_user_data(data->surface, NULL);
gabomdq@8062
   185
        wl_surface_attach(data->surface,
gabomdq@8062
   186
                          data->buffer,
gabomdq@8062
   187
                          0,
gabomdq@8062
   188
                          0);
gabomdq@8062
   189
        wl_surface_damage(data->surface,
gabomdq@8062
   190
                          0,
gabomdq@8062
   191
                          0,
gabomdq@8062
   192
                          surface->w,
gabomdq@8062
   193
                          surface->h);
gabomdq@8062
   194
        wl_surface_commit(data->surface);
gabomdq@8062
   195
gabomdq@8062
   196
        data->hot_x = hot_x;
gabomdq@8062
   197
        data->hot_y = hot_y;
gabomdq@8062
   198
    }
gabomdq@8062
   199
gabomdq@8062
   200
    return cursor;
gabomdq@8062
   201
}
gabomdq@8062
   202
gabomdq@8062
   203
static SDL_Cursor *
gabomdq@8062
   204
CreateCursorFromWlCursor(SDL_VideoData *d, struct wl_cursor *wlcursor)
gabomdq@8062
   205
{
gabomdq@8062
   206
    SDL_Cursor *cursor;
gabomdq@8062
   207
gabomdq@8062
   208
    cursor = calloc(1, sizeof (*cursor));
gabomdq@8062
   209
    if (cursor) {
gabomdq@8062
   210
        Wayland_CursorData *data = calloc (1, sizeof (Wayland_CursorData));
gabomdq@8062
   211
        cursor->driverdata = (void *) data;
gabomdq@8062
   212
gabomdq@8062
   213
        /* The wl_buffer here will be destroyed from wl_cursor_theme_destroy
gabomdq@8062
   214
         * if we are fetching this from a wl_cursor_theme, so don't store a
gabomdq@8062
   215
         * reference to it here */
gabomdq@8062
   216
        data->buffer = NULL;
gabomdq@8062
   217
        data->surface = wl_compositor_create_surface(d->compositor);
gabomdq@8135
   218
        wl_surface_set_user_data(data->surface, NULL);
gabomdq@8062
   219
        wl_surface_attach(data->surface,
gabomdq@8104
   220
                          WAYLAND_wl_cursor_image_get_buffer(wlcursor->images[0]),
gabomdq@8062
   221
                          0,
gabomdq@8062
   222
                          0);
gabomdq@8062
   223
        wl_surface_damage(data->surface,
gabomdq@8062
   224
                          0,
gabomdq@8062
   225
                          0,
gabomdq@8062
   226
                          wlcursor->images[0]->width,
gabomdq@8062
   227
                          wlcursor->images[0]->height);
gabomdq@8062
   228
        wl_surface_commit(data->surface);
gabomdq@8062
   229
        data->hot_x = wlcursor->images[0]->hotspot_x;
gabomdq@8062
   230
        data->hot_y = wlcursor->images[0]->hotspot_y;
gabomdq@8062
   231
        data->cursor= wlcursor;
gabomdq@8062
   232
    } else {
gabomdq@8062
   233
        SDL_OutOfMemory ();
gabomdq@8062
   234
    }
gabomdq@8062
   235
gabomdq@8062
   236
    return cursor;
gabomdq@8062
   237
}
gabomdq@8062
   238
gabomdq@8062
   239
static SDL_Cursor *
gabomdq@8062
   240
Wayland_CreateDefaultCursor()
gabomdq@8062
   241
{
gabomdq@8062
   242
    SDL_VideoDevice *device = SDL_GetVideoDevice();
gabomdq@8062
   243
    SDL_VideoData *data = device->driverdata;
gabomdq@8062
   244
gabomdq@8062
   245
    return CreateCursorFromWlCursor (data,
gabomdq@8104
   246
                                     WAYLAND_wl_cursor_theme_get_cursor(data->cursor_theme,
gabomdq@8062
   247
                                                                "left_ptr"));
gabomdq@8062
   248
}
gabomdq@8062
   249
gabomdq@8062
   250
static SDL_Cursor *
gabomdq@8062
   251
Wayland_CreateSystemCursor(SDL_SystemCursor id)
gabomdq@8062
   252
{
gabomdq@8062
   253
    SDL_VideoDevice *vd = SDL_GetVideoDevice();
gabomdq@8062
   254
    SDL_VideoData *d = vd->driverdata;
gabomdq@8062
   255
gabomdq@8062
   256
    struct wl_cursor *cursor = NULL;
gabomdq@8062
   257
gabomdq@8062
   258
    switch(id)
gabomdq@8062
   259
    {
gabomdq@8062
   260
    default:
gabomdq@8062
   261
        SDL_assert(0);
gabomdq@8062
   262
        return NULL;
gabomdq@8062
   263
    case SDL_SYSTEM_CURSOR_ARROW:
gabomdq@8104
   264
        cursor = WAYLAND_wl_cursor_theme_get_cursor(d->cursor_theme, "left_ptr");
gabomdq@8062
   265
        break;
gabomdq@8062
   266
    case SDL_SYSTEM_CURSOR_IBEAM:
gabomdq@8104
   267
        cursor = WAYLAND_wl_cursor_theme_get_cursor(d->cursor_theme, "xterm");
gabomdq@8062
   268
        break;
gabomdq@8062
   269
    case SDL_SYSTEM_CURSOR_WAIT:
slouken@8710
   270
        cursor = WAYLAND_wl_cursor_theme_get_cursor(d->cursor_theme, "watch");
gabomdq@8062
   271
        break;
gabomdq@8062
   272
    case SDL_SYSTEM_CURSOR_CROSSHAIR:
gabomdq@8104
   273
        cursor = WAYLAND_wl_cursor_theme_get_cursor(d->cursor_theme, "hand1");
gabomdq@8062
   274
        break;
gabomdq@8062
   275
    case SDL_SYSTEM_CURSOR_WAITARROW:
slouken@8710
   276
        cursor = WAYLAND_wl_cursor_theme_get_cursor(d->cursor_theme, "watch");
gabomdq@8062
   277
        break;
gabomdq@8062
   278
    case SDL_SYSTEM_CURSOR_SIZENWSE:
gabomdq@8104
   279
        cursor = WAYLAND_wl_cursor_theme_get_cursor(d->cursor_theme, "hand1");
gabomdq@8062
   280
        break;
gabomdq@8062
   281
    case SDL_SYSTEM_CURSOR_SIZENESW:
gabomdq@8104
   282
        cursor = WAYLAND_wl_cursor_theme_get_cursor(d->cursor_theme, "hand1");
gabomdq@8062
   283
        break;
gabomdq@8062
   284
    case SDL_SYSTEM_CURSOR_SIZEWE:
gabomdq@8104
   285
        cursor = WAYLAND_wl_cursor_theme_get_cursor(d->cursor_theme, "hand1");
gabomdq@8062
   286
        break;
gabomdq@8062
   287
    case SDL_SYSTEM_CURSOR_SIZENS:
gabomdq@8104
   288
        cursor = WAYLAND_wl_cursor_theme_get_cursor(d->cursor_theme, "hand1");
gabomdq@8062
   289
        break;
gabomdq@8062
   290
    case SDL_SYSTEM_CURSOR_SIZEALL:
gabomdq@8104
   291
        cursor = WAYLAND_wl_cursor_theme_get_cursor(d->cursor_theme, "hand1");
gabomdq@8062
   292
        break;
gabomdq@8062
   293
    case SDL_SYSTEM_CURSOR_NO:
gabomdq@8104
   294
        cursor = WAYLAND_wl_cursor_theme_get_cursor(d->cursor_theme, "xterm");
gabomdq@8062
   295
        break;
gabomdq@8062
   296
    case SDL_SYSTEM_CURSOR_HAND:
gabomdq@8104
   297
        cursor = WAYLAND_wl_cursor_theme_get_cursor(d->cursor_theme, "hand1");
gabomdq@8062
   298
        break;
gabomdq@8062
   299
    }
gabomdq@8062
   300
gabomdq@8062
   301
    SDL_Cursor *sdl_cursor = CreateCursorFromWlCursor (d, cursor);
gabomdq@8062
   302
gabomdq@8062
   303
    return sdl_cursor;
gabomdq@8062
   304
}
gabomdq@8062
   305
gabomdq@8062
   306
static void
gabomdq@8062
   307
Wayland_FreeCursor(SDL_Cursor *cursor)
gabomdq@8062
   308
{
gabomdq@8062
   309
    if (!cursor)
gabomdq@8062
   310
        return;
gabomdq@8062
   311
gabomdq@8062
   312
    Wayland_CursorData *d = cursor->driverdata;
gabomdq@8062
   313
gabomdq@8062
   314
    /* Probably not a cursor we own */
gabomdq@8062
   315
    if (!d)
gabomdq@8062
   316
        return;
gabomdq@8062
   317
gabomdq@8062
   318
    if (d->buffer)
gabomdq@8062
   319
        wl_buffer_destroy(d->buffer);
gabomdq@8062
   320
gabomdq@8062
   321
    if (d->surface)
gabomdq@8062
   322
        wl_surface_destroy(d->surface);
gabomdq@8062
   323
gabomdq@8062
   324
    /* Not sure what's meant to happen to shm_data */
gabomdq@8062
   325
    free (cursor->driverdata);
gabomdq@8062
   326
    SDL_free(cursor);
gabomdq@8062
   327
}
gabomdq@8062
   328
gabomdq@8062
   329
static int
gabomdq@8062
   330
Wayland_ShowCursor(SDL_Cursor *cursor)
gabomdq@8062
   331
{
gabomdq@8062
   332
    SDL_VideoDevice *vd = SDL_GetVideoDevice();
gabomdq@8062
   333
    SDL_VideoData *d = vd->driverdata;
gabomdq@8062
   334
gabomdq@8062
   335
    struct wl_pointer *pointer = d->pointer;
gabomdq@8062
   336
gabomdq@8062
   337
    if (!pointer)
gabomdq@8062
   338
        return -1;
gabomdq@8062
   339
gabomdq@8062
   340
    if (cursor)
gabomdq@8062
   341
    {
gabomdq@8062
   342
        Wayland_CursorData *data = cursor->driverdata;
gabomdq@8062
   343
gabomdq@8062
   344
        wl_pointer_set_cursor (pointer, 0,
gabomdq@8062
   345
                               data->surface,
gabomdq@8062
   346
                               data->hot_x,
gabomdq@8062
   347
                               data->hot_y);
gabomdq@8062
   348
    }
gabomdq@8062
   349
    else
gabomdq@8062
   350
    {
gabomdq@8062
   351
        wl_pointer_set_cursor (pointer, 0,
gabomdq@8062
   352
                               NULL,
gabomdq@8062
   353
                               0,
gabomdq@8062
   354
                               0);
gabomdq@8062
   355
    }
gabomdq@8062
   356
    
gabomdq@8062
   357
    return 0;
gabomdq@8062
   358
}
gabomdq@8062
   359
gabomdq@8062
   360
static void
gabomdq@8062
   361
Wayland_WarpMouse(SDL_Window *window, int x, int y)
gabomdq@8062
   362
{
gabomdq@8062
   363
    SDL_Unsupported();
gabomdq@8062
   364
    return;
gabomdq@8062
   365
}
gabomdq@8062
   366
gabomdq@8062
   367
static int
gabomdq@8062
   368
Wayland_SetRelativeMouseMode(SDL_bool enabled)
gabomdq@8062
   369
{
gabomdq@8062
   370
    SDL_Unsupported();
gabomdq@8062
   371
    return -1;
gabomdq@8062
   372
}
gabomdq@8062
   373
gabomdq@8062
   374
void
gabomdq@8062
   375
Wayland_InitMouse(void)
gabomdq@8062
   376
{
gabomdq@8062
   377
    SDL_Mouse *mouse = SDL_GetMouse();
gabomdq@8062
   378
gabomdq@8062
   379
    mouse->CreateCursor = Wayland_CreateCursor;
gabomdq@8062
   380
    mouse->CreateSystemCursor = Wayland_CreateSystemCursor;
gabomdq@8062
   381
    mouse->ShowCursor = Wayland_ShowCursor;
gabomdq@8062
   382
    mouse->FreeCursor = Wayland_FreeCursor;
gabomdq@8062
   383
    mouse->WarpMouse = Wayland_WarpMouse;
gabomdq@8062
   384
    mouse->SetRelativeMouseMode = Wayland_SetRelativeMouseMode;
gabomdq@8062
   385
gabomdq@8062
   386
    SDL_SetDefaultCursor(Wayland_CreateDefaultCursor());
gabomdq@8062
   387
}
gabomdq@8062
   388
gabomdq@8062
   389
void
gabomdq@8062
   390
Wayland_FiniMouse(void)
gabomdq@8062
   391
{
gabomdq@8062
   392
    /* This effectively assumes that nobody else
gabomdq@8062
   393
     * touches SDL_Mouse which is effectively
gabomdq@8062
   394
     * a singleton */
gabomdq@8062
   395
gabomdq@8062
   396
    SDL_Mouse *mouse = SDL_GetMouse();
gabomdq@8062
   397
gabomdq@8062
   398
    /* Free the current cursor if not the same pointer as
gabomdq@8062
   399
     * the default cursor */
gabomdq@8062
   400
    if (mouse->def_cursor != mouse->cur_cursor)
gabomdq@8062
   401
        Wayland_FreeCursor (mouse->cur_cursor);
gabomdq@8062
   402
gabomdq@8062
   403
    Wayland_FreeCursor (mouse->def_cursor);
gabomdq@8062
   404
    mouse->def_cursor = NULL;
gabomdq@8062
   405
    mouse->cur_cursor = NULL;
gabomdq@8062
   406
gabomdq@8062
   407
    mouse->CreateCursor =  NULL;
gabomdq@8062
   408
    mouse->CreateSystemCursor = NULL;
gabomdq@8062
   409
    mouse->ShowCursor = NULL;
gabomdq@8062
   410
    mouse->FreeCursor = NULL;
gabomdq@8062
   411
    mouse->WarpMouse = NULL;
gabomdq@8062
   412
    mouse->SetRelativeMouseMode = NULL;
gabomdq@8062
   413
}
icculus@8116
   414
#endif  /* SDL_VIDEO_DRIVER_WAYLAND */