mirror of https://github.com/encounter/SDL.git
wayland: Add support for display connect/disconnect events
This commit is contained in:
parent
c2464653d0
commit
a7a54e6452
|
@ -450,7 +450,7 @@ display_handle_done(void *data,
|
||||||
if (driverdata->index == -1) {
|
if (driverdata->index == -1) {
|
||||||
/* First time getting display info, create the VideoDisplay */
|
/* First time getting display info, create the VideoDisplay */
|
||||||
driverdata->placeholder.driverdata = driverdata;
|
driverdata->placeholder.driverdata = driverdata;
|
||||||
driverdata->index = SDL_AddVideoDisplay(&driverdata->placeholder, SDL_FALSE);
|
driverdata->index = SDL_AddVideoDisplay(&driverdata->placeholder, SDL_TRUE);
|
||||||
SDL_free(driverdata->placeholder.name);
|
SDL_free(driverdata->placeholder.name);
|
||||||
SDL_zero(driverdata->placeholder);
|
SDL_zero(driverdata->placeholder);
|
||||||
|
|
||||||
|
@ -490,6 +490,7 @@ Wayland_add_display(SDL_VideoData *d, uint32_t id)
|
||||||
data = SDL_malloc(sizeof *data);
|
data = SDL_malloc(sizeof *data);
|
||||||
SDL_zerop(data);
|
SDL_zerop(data);
|
||||||
data->output = output;
|
data->output = output;
|
||||||
|
data->registry_id = id;
|
||||||
data->scale_factor = 1.0;
|
data->scale_factor = 1.0;
|
||||||
data->index = -1;
|
data->index = -1;
|
||||||
|
|
||||||
|
@ -497,6 +498,35 @@ Wayland_add_display(SDL_VideoData *d, uint32_t id)
|
||||||
SDL_WAYLAND_register_output(output);
|
SDL_WAYLAND_register_output(output);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
Wayland_free_display(uint32_t id)
|
||||||
|
{
|
||||||
|
int num_displays = SDL_GetNumVideoDisplays();
|
||||||
|
SDL_VideoDisplay *display;
|
||||||
|
SDL_WaylandOutputData *data;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = 0; i < num_displays; i += 1) {
|
||||||
|
display = SDL_GetDisplay(i);
|
||||||
|
data = (SDL_WaylandOutputData *) display->driverdata;
|
||||||
|
if (data->registry_id == id) {
|
||||||
|
SDL_DelVideoDisplay(i);
|
||||||
|
wl_output_destroy(data->output);
|
||||||
|
SDL_free(data);
|
||||||
|
|
||||||
|
/* Update the index for all remaining displays */
|
||||||
|
num_displays -= 1;
|
||||||
|
for (; i < num_displays; i += 1) {
|
||||||
|
display = SDL_GetDisplay(i);
|
||||||
|
data = (SDL_WaylandOutputData *) display->driverdata;
|
||||||
|
data->index -= 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef SDL_VIDEO_DRIVER_WAYLAND_QT_TOUCH
|
#ifdef SDL_VIDEO_DRIVER_WAYLAND_QT_TOUCH
|
||||||
static void
|
static void
|
||||||
windowmanager_hints(void *data, struct qt_windowmanager *qt_windowmanager,
|
windowmanager_hints(void *data, struct qt_windowmanager *qt_windowmanager,
|
||||||
|
@ -593,7 +623,11 @@ display_handle_global(void *data, struct wl_registry *registry, uint32_t id,
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
display_remove_global(void *data, struct wl_registry *registry, uint32_t id) {}
|
display_remove_global(void *data, struct wl_registry *registry, uint32_t id)
|
||||||
|
{
|
||||||
|
/* We don't get an interface, just an ID, so assume it's a wl_output :shrug: */
|
||||||
|
Wayland_free_display(id);
|
||||||
|
}
|
||||||
|
|
||||||
static const struct wl_registry_listener registry_listener = {
|
static const struct wl_registry_listener registry_listener = {
|
||||||
display_handle_global,
|
display_handle_global,
|
||||||
|
|
|
@ -90,6 +90,7 @@ typedef struct {
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
struct wl_output *output;
|
struct wl_output *output;
|
||||||
|
uint32_t registry_id;
|
||||||
float scale_factor;
|
float scale_factor;
|
||||||
int x, y, width, height, refresh, transform;
|
int x, y, width, height, refresh, transform;
|
||||||
SDL_DisplayOrientation orientation;
|
SDL_DisplayOrientation orientation;
|
||||||
|
|
Loading…
Reference in New Issue