mirror of https://github.com/encounter/SDL.git
wayland: Set/unset the opaque regions on surfaces when transparency is toggled
Caches the SDL_HINT_VIDEO_EGL_ALLOW_TRANSPARENCY hint at init time and registers a callback, which is fired when the hint is changed during runtime and toggles the opaque region for existing surfaces.
This commit is contained in:
parent
ea5958009c
commit
c2b0c41c0a
|
@ -992,6 +992,7 @@ Wayland_VideoInit(_THIS)
|
||||||
WAYLAND_wl_display_flush(data->display);
|
WAYLAND_wl_display_flush(data->display);
|
||||||
|
|
||||||
Wayland_InitKeyboard(_this);
|
Wayland_InitKeyboard(_this);
|
||||||
|
Wayland_InitWin(data);
|
||||||
|
|
||||||
data->initializing = SDL_FALSE;
|
data->initializing = SDL_FALSE;
|
||||||
|
|
||||||
|
@ -1033,6 +1034,7 @@ Wayland_VideoQuit(_THIS)
|
||||||
SDL_VideoData *data = _this->driverdata;
|
SDL_VideoData *data = _this->driverdata;
|
||||||
int i, j;
|
int i, j;
|
||||||
|
|
||||||
|
Wayland_QuitWin(data);
|
||||||
Wayland_FiniMouse(data);
|
Wayland_FiniMouse(data);
|
||||||
|
|
||||||
for (i = 0; i < _this->num_displays; ++i) {
|
for (i = 0; i < _this->num_displays; ++i) {
|
||||||
|
|
|
@ -95,6 +95,7 @@ typedef struct {
|
||||||
char *classname;
|
char *classname;
|
||||||
|
|
||||||
int relative_mouse_mode;
|
int relative_mouse_mode;
|
||||||
|
SDL_bool egl_transparency_enabled;
|
||||||
} SDL_VideoData;
|
} SDL_VideoData;
|
||||||
|
|
||||||
struct SDL_WaylandOutputData {
|
struct SDL_WaylandOutputData {
|
||||||
|
|
|
@ -32,6 +32,7 @@
|
||||||
#include "SDL_waylandvideo.h"
|
#include "SDL_waylandvideo.h"
|
||||||
#include "SDL_waylandtouch.h"
|
#include "SDL_waylandtouch.h"
|
||||||
#include "SDL_hints.h"
|
#include "SDL_hints.h"
|
||||||
|
#include "../../SDL_hints_c.h"
|
||||||
#include "SDL_events.h"
|
#include "SDL_events.h"
|
||||||
|
|
||||||
#include "xdg-shell-client-protocol.h"
|
#include "xdg-shell-client-protocol.h"
|
||||||
|
@ -46,12 +47,6 @@
|
||||||
|
|
||||||
#define FULLSCREEN_MASK (SDL_WINDOW_FULLSCREEN | SDL_WINDOW_FULLSCREEN_DESKTOP)
|
#define FULLSCREEN_MASK (SDL_WINDOW_FULLSCREEN | SDL_WINDOW_FULLSCREEN_DESKTOP)
|
||||||
|
|
||||||
SDL_FORCE_INLINE SDL_bool
|
|
||||||
EGLTransparencyEnabled()
|
|
||||||
{
|
|
||||||
return SDL_GetHintBoolean(SDL_HINT_VIDEO_EGL_ALLOW_TRANSPARENCY, SDL_FALSE);
|
|
||||||
}
|
|
||||||
|
|
||||||
SDL_FORCE_INLINE SDL_bool
|
SDL_FORCE_INLINE SDL_bool
|
||||||
FloatEqual(float a, float b)
|
FloatEqual(float a, float b)
|
||||||
{
|
{
|
||||||
|
@ -296,7 +291,7 @@ ConfigureWindowGeometry(SDL_Window *window)
|
||||||
* if the output size has changed.
|
* if the output size has changed.
|
||||||
*/
|
*/
|
||||||
if (window_size_changed) {
|
if (window_size_changed) {
|
||||||
if (!EGLTransparencyEnabled()) {
|
if (!viddata->egl_transparency_enabled) {
|
||||||
region = wl_compositor_create_region(viddata->compositor);
|
region = wl_compositor_create_region(viddata->compositor);
|
||||||
wl_region_add(region, 0, 0,
|
wl_region_add(region, 0, 0,
|
||||||
data->window_width, data->window_height);
|
data->window_width, data->window_height);
|
||||||
|
@ -2310,6 +2305,48 @@ void Wayland_DestroyWindow(_THIS, SDL_Window *window)
|
||||||
window->driverdata = NULL;
|
window->driverdata = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
EGLTransparencyChangedCallback(void *userdata, const char *name, const char *oldValue, const char *newValue)
|
||||||
|
{
|
||||||
|
const SDL_bool oldval = SDL_GetStringBoolean(oldValue, SDL_FALSE);
|
||||||
|
const SDL_bool newval = SDL_GetStringBoolean(newValue, SDL_FALSE);
|
||||||
|
|
||||||
|
if (oldval != newval) {
|
||||||
|
SDL_Window *window;
|
||||||
|
SDL_VideoData *viddata = (SDL_VideoData *) userdata;
|
||||||
|
SDL_VideoDevice *dev = SDL_GetVideoDevice();
|
||||||
|
|
||||||
|
viddata->egl_transparency_enabled = newval;
|
||||||
|
|
||||||
|
/* Iterate over all windows and update the surface opaque regions */
|
||||||
|
for (window = dev->windows; window != NULL; window = window->next) {
|
||||||
|
SDL_WindowData *wind = (SDL_WindowData *) window->driverdata;
|
||||||
|
|
||||||
|
if (!newval) {
|
||||||
|
struct wl_region *region = wl_compositor_create_region(wind->waylandData->compositor);
|
||||||
|
wl_region_add(region, 0, 0, wind->window_width, wind->window_height);
|
||||||
|
wl_surface_set_opaque_region(wind->surface, region);
|
||||||
|
wl_region_destroy(region);
|
||||||
|
} else {
|
||||||
|
wl_surface_set_opaque_region(wind->surface, NULL);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
Wayland_InitWin(SDL_VideoData *data)
|
||||||
|
{
|
||||||
|
data->egl_transparency_enabled = SDL_GetHintBoolean(SDL_HINT_VIDEO_EGL_ALLOW_TRANSPARENCY, SDL_FALSE);
|
||||||
|
SDL_AddHintCallback(SDL_HINT_VIDEO_EGL_ALLOW_TRANSPARENCY, EGLTransparencyChangedCallback, data);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
Wayland_QuitWin(SDL_VideoData *data)
|
||||||
|
{
|
||||||
|
SDL_DelHintCallback(SDL_HINT_VIDEO_EGL_ALLOW_TRANSPARENCY, EGLTransparencyChangedCallback, data);
|
||||||
|
}
|
||||||
|
|
||||||
#endif /* SDL_VIDEO_DRIVER_WAYLAND */
|
#endif /* SDL_VIDEO_DRIVER_WAYLAND */
|
||||||
|
|
||||||
/* vi: set ts=4 sw=4 expandtab: */
|
/* vi: set ts=4 sw=4 expandtab: */
|
||||||
|
|
|
@ -142,6 +142,9 @@ Wayland_GetWindowWMInfo(_THIS, SDL_Window * window, SDL_SysWMinfo * info);
|
||||||
extern int Wayland_SetWindowHitTest(SDL_Window *window, SDL_bool enabled);
|
extern int Wayland_SetWindowHitTest(SDL_Window *window, SDL_bool enabled);
|
||||||
extern int Wayland_FlashWindow(_THIS, SDL_Window * window, SDL_FlashOperation operation);
|
extern int Wayland_FlashWindow(_THIS, SDL_Window * window, SDL_FlashOperation operation);
|
||||||
|
|
||||||
|
extern void Wayland_InitWin(SDL_VideoData *data);
|
||||||
|
extern void Wayland_QuitWin(SDL_VideoData *data);
|
||||||
|
|
||||||
#endif /* SDL_waylandwindow_h_ */
|
#endif /* SDL_waylandwindow_h_ */
|
||||||
|
|
||||||
/* vi: set ts=4 sw=4 expandtab: */
|
/* vi: set ts=4 sw=4 expandtab: */
|
||||||
|
|
Loading…
Reference in New Issue