int WIN_GLES_SetupWindow(_THIS, SDL_Window * window) { /* The current context is lost in here; save it and reset it. */ SDL_WindowData *windowdata = (SDL_WindowData *) window->driverdata; SDL_Window *current_win = SDL_GL_GetCurrentWindow(); SDL_GLContext current_ctx = SDL_GL_GetCurrentContext(); if (_this->egl_data == NULL) { if (SDL_EGL_LoadLibrary(_this, NULL, EGL_DEFAULT_DISPLAY) < 0) { SDL_EGL_UnloadLibrary(_this); return -1; } } /* Create the GLES window surface */ windowdata->egl_surface = SDL_EGL_CreateSurface(_this, (NativeWindowType)windowdata->hwnd); if (windowdata->egl_surface == EGL_NO_SURFACE) { return SDL_SetError("Could not create GLES window surface"); } return WIN_GLES_MakeCurrent(_this, current_win, current_ctx); }
int Android_CreateWindow(_THIS, SDL_Window * window) { SDL_WindowData *data; if (Android_Window) { return SDL_SetError("Android only supports one window"); } Android_PauseSem = SDL_CreateSemaphore(0); Android_ResumeSem = SDL_CreateSemaphore(0); /* Adjust the window data to match the screen */ window->x = 0; window->y = 0; window->w = Android_ScreenWidth; window->h = Android_ScreenHeight; window->flags &= ~SDL_WINDOW_RESIZABLE; /* window is NEVER resizeable */ window->flags |= SDL_WINDOW_FULLSCREEN; /* window is always fullscreen */ window->flags &= ~SDL_WINDOW_HIDDEN; window->flags |= SDL_WINDOW_SHOWN; /* only one window on Android */ window->flags |= SDL_WINDOW_INPUT_FOCUS; /* always has input focus */ /* One window, it always has focus */ SDL_SetMouseFocus(window); SDL_SetKeyboardFocus(window); data = (SDL_WindowData *) SDL_calloc(1, sizeof(*data)); if (!data) { return SDL_OutOfMemory(); } data->native_window = Android_JNI_GetNativeWindow(); if (!data->native_window) { SDL_free(data); return SDL_SetError("Could not fetch native window"); } /* Do not create EGLSurface for Vulkan window since it will then make the window incompatible with vkCreateAndroidSurfaceKHR */ if ((window->flags & SDL_WINDOW_VULKAN) == 0) { data->egl_surface = SDL_EGL_CreateSurface(_this, (NativeWindowType) data->native_window); if (data->egl_surface == EGL_NO_SURFACE) { ANativeWindow_release(data->native_window); SDL_free(data); return SDL_SetError("Could not create GLES window surface"); } } window->driverdata = data; Android_Window = window; return 0; }
int FB_CreateWindow(_THIS, SDL_Window * window) { SDL_WindowData *wdata; SDL_VideoDisplay *display; /* Allocate window internal data */ wdata = (SDL_WindowData *) SDL_calloc(1, sizeof(SDL_WindowData)); if (wdata == NULL) { return SDL_OutOfMemory(); } display = SDL_GetDisplayForWindow(window); /* Windows have one size for now */ window->w = display->desktop_mode.w; window->h = display->desktop_mode.h; /* OpenGL ES is the law here, buddy */ window->flags |= SDL_WINDOW_OPENGL; if (!_this->egl_data) { if (SDL_GL_LoadLibrary(NULL) < 0) { return -1; } } wdata->egl_surface = SDL_EGL_CreateSurface(_this, 0); if (wdata->egl_surface == EGL_NO_SURFACE) { return SDL_SetError("Could not create GLES window surface"); } /* Setup driver data for this window */ window->driverdata = wdata; /* One window, it always has focus */ SDL_SetMouseFocus(window); SDL_SetKeyboardFocus(window); /* Window has been successfully created */ return 0; }
int VIVANTE_CreateWindow(_THIS, SDL_Window * window) { SDL_VideoData *videodata = (SDL_VideoData *)_this->driverdata; SDL_DisplayData *displaydata; SDL_WindowData *data; displaydata = SDL_GetDisplayDriverData(0); /* Allocate window internal data */ data = (SDL_WindowData *) SDL_calloc(1, sizeof(SDL_WindowData)); if (data == NULL) { return SDL_OutOfMemory(); } /* Setup driver data for this window */ window->driverdata = data; #if SDL_VIDEO_DRIVER_VIVANTE_VDK data->native_window = vdkCreateWindow(displaydata->native_display, window->x, window->y, window->w, window->h); #else data->native_window = videodata->fbCreateWindow(displaydata->native_display, window->x, window->y, window->w, window->h); #endif if (!data->native_window) { return SDL_SetError("VIVANTE: Can't create native window"); } #if SDL_VIDEO_OPENGL_EGL if (window->flags & SDL_WINDOW_OPENGL) { data->egl_surface = SDL_EGL_CreateSurface(_this, data->native_window); if (data->egl_surface == EGL_NO_SURFACE) { return SDL_SetError("VIVANTE: Can't create EGL surface"); } } else { data->egl_surface = EGL_NO_SURFACE; } #endif /* Window has been successfully created */ return 0; }
int MIR_CreateWindow(_THIS, SDL_Window* window) { MIR_Window* mir_window; MIR_Data* mir_data; MirSurfaceParameters surfaceparm = { .name = "MirSurface", .width = window->w, .height = window->h, .pixel_format = mir_pixel_format_invalid, .buffer_usage = mir_buffer_usage_hardware, .output_id = mir_display_output_id_invalid }; MirEventDelegate delegate = { MIR_HandleInput, window }; mir_window = SDL_calloc(1, sizeof(MIR_Window)); if (!mir_window) return SDL_OutOfMemory(); mir_data = _this->driverdata; window->driverdata = mir_window; if (mir_data->software) surfaceparm.buffer_usage = mir_buffer_usage_software; if (window->x == SDL_WINDOWPOS_UNDEFINED) window->x = 0; if (window->y == SDL_WINDOWPOS_UNDEFINED) window->y = 0; mir_window->mir_data = mir_data; mir_window->sdl_window = window; surfaceparm.pixel_format = FindValidPixelFormat(mir_data); if (surfaceparm.pixel_format == mir_pixel_format_invalid) { return SDL_SetError("Failed to find a valid pixel format."); } mir_window->surface = MIR_mir_connection_create_surface_sync(mir_data->connection, &surfaceparm); if (!MIR_mir_surface_is_valid(mir_window->surface)) { const char* error = MIR_mir_surface_get_error_message(mir_window->surface); return SDL_SetError("Failed to created a mir surface: %s", error); } if (window->flags & SDL_WINDOW_OPENGL) { EGLNativeWindowType egl_native_window = (EGLNativeWindowType)MIR_mir_surface_get_egl_native_window(mir_window->surface); mir_window->egl_surface = SDL_EGL_CreateSurface(_this, egl_native_window); if (mir_window->egl_surface == EGL_NO_SURFACE) { return SDL_SetError("Failed to created a window surface %p", _this->egl_data->egl_display); } } else { mir_window->egl_surface = EGL_NO_SURFACE; } MIR_mir_surface_set_event_handler(mir_window->surface, &delegate); return 0; } void MIR_DestroyWindow(_THIS, SDL_Window* window) { MIR_Data* mir_data = _this->driverdata; MIR_Window* mir_window = window->driverdata; if (mir_data) { SDL_EGL_DestroySurface(_this, mir_window->egl_surface); MIR_mir_surface_release_sync(mir_window->surface); SDL_free(mir_window); } window->driverdata = NULL; }
int MIR_CreateWindow(_THIS, SDL_Window* window) { MIR_Window* mir_window; MIR_Data* mir_data; MirPixelFormat pixel_format; MirBufferUsage buffer_usage; MirSurfaceSpec* spec; mir_window = SDL_calloc(1, sizeof(MIR_Window)); if (!mir_window) return SDL_OutOfMemory(); mir_data = _this->driverdata; window->driverdata = mir_window; if (window->x == SDL_WINDOWPOS_UNDEFINED) window->x = 0; if (window->y == SDL_WINDOWPOS_UNDEFINED) window->y = 0; mir_window->mir_data = mir_data; mir_window->sdl_window = window; if (window->flags & SDL_WINDOW_OPENGL) { pixel_format = MIR_mir_connection_get_egl_pixel_format(mir_data->connection, _this->egl_data->egl_display, _this->egl_data->egl_config); } else { pixel_format = FindValidPixelFormat(mir_data); } mir_data->pixel_format = pixel_format; if (pixel_format == mir_pixel_format_invalid) { return SDL_SetError("Failed to find a valid pixel format."); } buffer_usage = mir_buffer_usage_hardware; if (mir_data->software) buffer_usage = mir_buffer_usage_software; spec = MIR_mir_connection_create_spec_for_normal_surface(mir_data->connection, window->w, window->h, pixel_format); MIR_mir_surface_spec_set_buffer_usage(spec, buffer_usage); MIR_mir_surface_spec_set_name(spec, "Mir surface"); if (window->flags & SDL_WINDOW_INPUT_FOCUS) SDL_SetKeyboardFocus(window); mir_window->surface = MIR_mir_surface_create_sync(spec); MIR_mir_surface_set_event_handler(mir_window->surface, MIR_HandleEvent, window); MIR_mir_surface_spec_release(spec); if (!MIR_mir_surface_is_valid(mir_window->surface)) { return SDL_SetError("Failed to created a mir surface: %s", MIR_mir_surface_get_error_message(mir_window->surface)); } if (window->flags & SDL_WINDOW_OPENGL) { EGLNativeWindowType egl_native_window = (EGLNativeWindowType)MIR_mir_buffer_stream_get_egl_native_window( MIR_mir_surface_get_buffer_stream(mir_window->surface)); mir_window->egl_surface = SDL_EGL_CreateSurface(_this, egl_native_window); if (mir_window->egl_surface == EGL_NO_SURFACE) { return SDL_SetError("Failed to created a window surface %p", _this->egl_data->egl_display); } } else { mir_window->egl_surface = EGL_NO_SURFACE; } mir_data->current_window = mir_window; return 0; }
int Wayland_CreateWindow(_THIS, SDL_Window *window) { SDL_WindowData *data; SDL_VideoData *c; struct wl_region *region; data = calloc(1, sizeof *data); if (data == NULL) return 0; c = _this->driverdata; window->driverdata = data; if (!(window->flags & SDL_WINDOW_OPENGL)) { SDL_GL_LoadLibrary(NULL); window->flags |= SDL_WINDOW_OPENGL; } if (window->x == SDL_WINDOWPOS_UNDEFINED) { window->x = 0; } if (window->y == SDL_WINDOWPOS_UNDEFINED) { window->y = 0; } data->waylandData = c; data->sdlwindow = window; data->surface = wl_compositor_create_surface(c->compositor); wl_surface_set_user_data(data->surface, data); data->shell_surface = wl_shell_get_shell_surface(c->shell, data->surface); #ifdef SDL_VIDEO_DRIVER_WAYLAND_QT_TOUCH if (c->surface_extension) { data->extended_surface = qt_surface_extension_get_extended_surface( c->surface_extension, data->surface); } #endif /* SDL_VIDEO_DRIVER_WAYLAND_QT_TOUCH */ /** * If the user specified 0x0 as the size (turned to 1x1 by SDL_CreateWindow * in SDL_video.c), we want to make the window fill the whole screen **/ if (window->w == 1) { window->w = c->screen_allocation.width; } if (window->h == 1) { window->h = c->screen_allocation.height; } data->egl_window = WAYLAND_wl_egl_window_create(data->surface, window->w, window->h); /* Create the GLES window surface */ data->egl_surface = SDL_EGL_CreateSurface(_this, (NativeWindowType) data->egl_window); if (data->egl_surface == EGL_NO_SURFACE) { SDL_SetError("failed to create a window surface"); return -1; } if (data->shell_surface) { wl_shell_surface_set_user_data(data->shell_surface, data); wl_shell_surface_add_listener(data->shell_surface, &shell_surface_listener, data); } #ifdef SDL_VIDEO_DRIVER_WAYLAND_QT_TOUCH if (data->extended_surface) { qt_extended_surface_set_user_data(data->extended_surface, data); qt_extended_surface_add_listener(data->extended_surface, &extended_surface_listener, data); } #endif /* SDL_VIDEO_DRIVER_WAYLAND_QT_TOUCH */ region = wl_compositor_create_region(c->compositor); wl_region_add(region, 0, 0, window->w, window->h); wl_surface_set_opaque_region(data->surface, region); wl_region_destroy(region); WAYLAND_wl_display_flush(c->display); return 0; }
int Wayland_CreateWindow(_THIS, SDL_Window *window) { SDL_WindowData *data; SDL_VideoData *c; struct wl_region *region; data = calloc(1, sizeof *data); if (data == NULL) return SDL_OutOfMemory(); c = _this->driverdata; window->driverdata = data; if (!(window->flags & SDL_WINDOW_OPENGL)) { SDL_GL_LoadLibrary(NULL); window->flags |= SDL_WINDOW_OPENGL; } if (window->x == SDL_WINDOWPOS_UNDEFINED) { window->x = 0; } if (window->y == SDL_WINDOWPOS_UNDEFINED) { window->y = 0; } data->waylandData = c; data->sdlwindow = window; data->surface = wl_compositor_create_surface(c->compositor); wl_surface_set_user_data(data->surface, data); if (c->shell.xdg) { data->shell_surface.xdg.surface = xdg_wm_base_get_xdg_surface(c->shell.xdg, data->surface); /* !!! FIXME: add popup role */ data->shell_surface.xdg.roleobj.toplevel = xdg_surface_get_toplevel(data->shell_surface.xdg.surface); xdg_toplevel_add_listener(data->shell_surface.xdg.roleobj.toplevel, &toplevel_listener_xdg, data); xdg_toplevel_set_app_id(data->shell_surface.xdg.roleobj.toplevel, c->classname); } else if (c->shell.zxdg) { data->shell_surface.zxdg.surface = zxdg_shell_v6_get_xdg_surface(c->shell.zxdg, data->surface); /* !!! FIXME: add popup role */ data->shell_surface.zxdg.roleobj.toplevel = zxdg_surface_v6_get_toplevel(data->shell_surface.zxdg.surface); zxdg_toplevel_v6_add_listener(data->shell_surface.zxdg.roleobj.toplevel, &toplevel_listener_zxdg, data); zxdg_toplevel_v6_set_app_id(data->shell_surface.zxdg.roleobj.toplevel, c->classname); } else { data->shell_surface.wl = wl_shell_get_shell_surface(c->shell.wl, data->surface); wl_shell_surface_set_class(data->shell_surface.wl, c->classname); } #ifdef SDL_VIDEO_DRIVER_WAYLAND_QT_TOUCH if (c->surface_extension) { data->extended_surface = qt_surface_extension_get_extended_surface( c->surface_extension, data->surface); QtExtendedSurface_Subscribe(data->extended_surface, SDL_HINT_QTWAYLAND_CONTENT_ORIENTATION); QtExtendedSurface_Subscribe(data->extended_surface, SDL_HINT_QTWAYLAND_WINDOW_FLAGS); } #endif /* SDL_VIDEO_DRIVER_WAYLAND_QT_TOUCH */ data->egl_window = WAYLAND_wl_egl_window_create(data->surface, window->w, window->h); /* Create the GLES window surface */ data->egl_surface = SDL_EGL_CreateSurface(_this, (NativeWindowType) data->egl_window); if (data->egl_surface == EGL_NO_SURFACE) { return SDL_SetError("failed to create a window surface"); } if (c->shell.xdg) { if (data->shell_surface.xdg.surface) { xdg_surface_set_user_data(data->shell_surface.xdg.surface, data); xdg_surface_add_listener(data->shell_surface.xdg.surface, &shell_surface_listener_xdg, data); } } else if (c->shell.zxdg) { if (data->shell_surface.zxdg.surface) { zxdg_surface_v6_set_user_data(data->shell_surface.zxdg.surface, data); zxdg_surface_v6_add_listener(data->shell_surface.zxdg.surface, &shell_surface_listener_zxdg, data); } } else { if (data->shell_surface.wl) { wl_shell_surface_set_user_data(data->shell_surface.wl, data); wl_shell_surface_add_listener(data->shell_surface.wl, &shell_surface_listener_wl, data); } } #ifdef SDL_VIDEO_DRIVER_WAYLAND_QT_TOUCH if (data->extended_surface) { qt_extended_surface_set_user_data(data->extended_surface, data); qt_extended_surface_add_listener(data->extended_surface, &extended_surface_listener, data); } #endif /* SDL_VIDEO_DRIVER_WAYLAND_QT_TOUCH */ region = wl_compositor_create_region(c->compositor); wl_region_add(region, 0, 0, window->w, window->h); wl_surface_set_opaque_region(data->surface, region); wl_region_destroy(region); if (c->relative_mouse_mode) { Wayland_input_lock_pointer(c->input); } wl_surface_commit(data->surface); WAYLAND_wl_display_flush(c->display); /* we have to wait until the surface gets a "configure" event, or use of this surface will fail. This is a new rule for xdg_shell. */ if (c->shell.xdg) { if (data->shell_surface.xdg.surface) { while (!data->shell_surface.xdg.initial_configure_seen) { WAYLAND_wl_display_flush(c->display); WAYLAND_wl_display_dispatch(c->display); } } } else if (c->shell.zxdg) { if (data->shell_surface.zxdg.surface) { while (!data->shell_surface.zxdg.initial_configure_seen) { WAYLAND_wl_display_flush(c->display); WAYLAND_wl_display_dispatch(c->display); } } } return 0; }
int RPI_CreateWindow(_THIS, SDL_Window * window) { SDL_WindowData *wdata; SDL_VideoDisplay *display; SDL_DisplayData *displaydata; VC_RECT_T dst_rect; VC_RECT_T src_rect; VC_DISPMANX_ALPHA_T dispman_alpha; DISPMANX_UPDATE_HANDLE_T dispman_update; /* Disable alpha, otherwise the app looks composed with whatever dispman is showing (X11, console,etc) */ dispman_alpha.flags = DISPMANX_FLAGS_ALPHA_FIXED_ALL_PIXELS; dispman_alpha.opacity = 0xFF; dispman_alpha.mask = 0; /* Allocate window internal data */ wdata = (SDL_WindowData *) SDL_calloc(1, sizeof(SDL_WindowData)); if (wdata == NULL) { return SDL_OutOfMemory(); } display = SDL_GetDisplayForWindow(window); displaydata = (SDL_DisplayData *) display->driverdata; /* Windows have one size for now */ window->w = display->desktop_mode.w; window->h = display->desktop_mode.h; /* OpenGL ES is the law here, buddy */ window->flags |= SDL_WINDOW_OPENGL; /* Create a dispman element and associate a window to it */ dst_rect.x = 0; dst_rect.y = 0; dst_rect.width = window->w; dst_rect.height = window->h; src_rect.x = 0; src_rect.y = 0; src_rect.width = window->w << 16; src_rect.height = window->h << 16; dispman_update = vc_dispmanx_update_start( 0 ); wdata->dispman_window.element = vc_dispmanx_element_add ( dispman_update, displaydata->dispman_display, SDL_RPI_VIDEOLAYER /* layer */, &dst_rect, 0/*src*/, &src_rect, DISPMANX_PROTECTION_NONE, &dispman_alpha /*alpha*/, 0/*clamp*/, 0/*transform*/); wdata->dispman_window.width = window->w; wdata->dispman_window.height = window->h; vc_dispmanx_update_submit_sync( dispman_update ); if (!_this->egl_data) { if (SDL_GL_LoadLibrary(NULL) < 0) { return -1; } } wdata->egl_surface = SDL_EGL_CreateSurface(_this, (NativeWindowType) &wdata->dispman_window); if (wdata->egl_surface == EGL_NO_SURFACE) { return SDL_SetError("Could not create GLES window surface"); } /* Setup driver data for this window */ window->driverdata = wdata; /* One window, it always has focus */ SDL_SetMouseFocus(window); SDL_SetKeyboardFocus(window); /* Window has been successfully created */ return 0; }
int KMSDRM_CreateWindow(_THIS, SDL_Window * window) { SDL_WindowData *wdata; SDL_VideoDisplay *display; SDL_VideoData *vdata = ((SDL_VideoData *)_this->driverdata); Uint32 surface_fmt, surface_flags; /* Allocate window internal data */ wdata = (SDL_WindowData *) SDL_calloc(1, sizeof(SDL_WindowData)); if (wdata == NULL) { SDL_OutOfMemory(); goto error; } wdata->waiting_for_flip = SDL_FALSE; display = SDL_GetDisplayForWindow(window); /* Windows have one size for now */ window->w = display->desktop_mode.w; window->h = display->desktop_mode.h; /* Maybe you didn't ask for a fullscreen OpenGL window, but that's what you get */ window->flags |= (SDL_WINDOW_FULLSCREEN | SDL_WINDOW_OPENGL); surface_fmt = GBM_FORMAT_XRGB8888; surface_flags = GBM_BO_USE_SCANOUT | GBM_BO_USE_RENDERING; if (!KMSDRM_gbm_device_is_format_supported(vdata->gbm, surface_fmt, surface_flags)) { SDL_LogWarn(SDL_LOG_CATEGORY_VIDEO, "GBM surface format not supported. Trying anyway."); } wdata->gs = KMSDRM_gbm_surface_create(vdata->gbm, window->w, window->h, surface_fmt, surface_flags); #if SDL_VIDEO_OPENGL_EGL if (!_this->egl_data) { if (SDL_GL_LoadLibrary(NULL) < 0) { goto error; } } wdata->egl_surface = SDL_EGL_CreateSurface(_this, (NativeWindowType) wdata->gs); if (wdata->egl_surface == EGL_NO_SURFACE) { SDL_SetError("Could not create EGL window surface"); goto error; } #endif /* SDL_VIDEO_OPENGL_EGL */ /* In case we want low-latency, double-buffer video, we take note here */ wdata->double_buffer = SDL_FALSE; if (SDL_GetHintBoolean(SDL_HINT_VIDEO_DOUBLE_BUFFER, SDL_FALSE)) { wdata->double_buffer = SDL_TRUE; } /* Window is created, but we have yet to set up CRTC to one of the GBM buffers if we want drmModePageFlip to work, and we can't do it until EGL is completely setup, because we need to do eglSwapBuffers so we can get a valid GBM buffer object to call drmModeSetCrtc on it. */ wdata->crtc_ready = SDL_FALSE; /* Setup driver data for this window */ window->driverdata = wdata; /* One window, it always has focus */ SDL_SetMouseFocus(window); SDL_SetKeyboardFocus(window); /* Window has been successfully created */ return 0; error: if (wdata != NULL) { #if SDL_VIDEO_OPENGL_EGL if (wdata->egl_surface != EGL_NO_SURFACE) SDL_EGL_DestroySurface(_this, wdata->egl_surface); #endif /* SDL_VIDEO_OPENGL_EGL */ if (wdata->gs != NULL) KMSDRM_gbm_surface_destroy(wdata->gs); SDL_free(wdata); } return -1; }
int Wayland_CreateWindow(_THIS, SDL_Window *window) { SDL_WindowData *data; SDL_VideoData *c; struct wl_region *region; data = calloc(1, sizeof *data); if (data == NULL) return SDL_OutOfMemory(); c = _this->driverdata; window->driverdata = data; if (!(window->flags & SDL_WINDOW_OPENGL)) { SDL_GL_LoadLibrary(NULL); window->flags |= SDL_WINDOW_OPENGL; } if (window->x == SDL_WINDOWPOS_UNDEFINED) { window->x = 0; } if (window->y == SDL_WINDOWPOS_UNDEFINED) { window->y = 0; } data->waylandData = c; data->sdlwindow = window; data->surface = wl_compositor_create_surface(c->compositor); wl_surface_set_user_data(data->surface, data); data->shell_surface = wl_shell_get_shell_surface(c->shell, data->surface); wl_shell_surface_set_class (data->shell_surface, c->classname); #ifdef SDL_VIDEO_DRIVER_WAYLAND_QT_TOUCH if (c->surface_extension) { data->extended_surface = qt_surface_extension_get_extended_surface( c->surface_extension, data->surface); QtExtendedSurface_Subscribe(data->extended_surface, SDL_HINT_QTWAYLAND_CONTENT_ORIENTATION); QtExtendedSurface_Subscribe(data->extended_surface, SDL_HINT_QTWAYLAND_WINDOW_FLAGS); } #endif /* SDL_VIDEO_DRIVER_WAYLAND_QT_TOUCH */ data->egl_window = WAYLAND_wl_egl_window_create(data->surface, window->w, window->h); /* Create the GLES window surface */ data->egl_surface = SDL_EGL_CreateSurface(_this, (NativeWindowType) data->egl_window); if (data->egl_surface == EGL_NO_SURFACE) { return SDL_SetError("failed to create a window surface"); } if (data->shell_surface) { wl_shell_surface_set_user_data(data->shell_surface, data); wl_shell_surface_add_listener(data->shell_surface, &shell_surface_listener, data); } #ifdef SDL_VIDEO_DRIVER_WAYLAND_QT_TOUCH if (data->extended_surface) { qt_extended_surface_set_user_data(data->extended_surface, data); qt_extended_surface_add_listener(data->extended_surface, &extended_surface_listener, data); } #endif /* SDL_VIDEO_DRIVER_WAYLAND_QT_TOUCH */ region = wl_compositor_create_region(c->compositor); wl_region_add(region, 0, 0, window->w, window->h); wl_surface_set_opaque_region(data->surface, region); wl_region_destroy(region); if (c->relative_mouse_mode) { Wayland_input_lock_pointer(c->input); } WAYLAND_wl_display_flush(c->display); return 0; }