wayland: Changed output removal in handle_surface_leave() No longer needs an extra malloc, handles unexpected cases like the same output being listed twice.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
diff --git a/src/video/wayland/SDL_waylandwindow.c b/src/video/wayland/SDL_waylandwindow.c
index 830faba..b5dbbd0 100644
--- a/src/video/wayland/SDL_waylandwindow.c
+++ b/src/video/wayland/SDL_waylandwindow.c
@@ -406,21 +406,22 @@ static void
handle_surface_leave(void *data, struct wl_surface *surface,
struct wl_output *output) {
SDL_WindowData *window = data;
+ int num_outputs = 0;
int i;
- if (window->num_outputs > 1) {
- struct wl_output **new_outputs = SDL_malloc((window->num_outputs - 1) * sizeof *window->outputs), **iter = new_outputs;
- for (i=0; i < window->num_outputs; i++) {
- if (window->outputs[i] != output) {
- *iter = window->outputs[i];
- iter++;
- }
- }
- SDL_free(window->outputs);
- window->outputs = new_outputs;
- window->num_outputs--;
- } else {
- window->num_outputs = 0;
+ for (i = 0; i < window->num_outputs; i++) {
+ if (window->outputs[i] == output) { /* remove this one */
+ if (i == (window->num_outputs-1)) {
+ window->outputs[i] = NULL;
+ } else {
+ SDL_memmove(&window->outputs[i], &window->outputs[i+1], sizeof (output) * ((window->num_outputs - i) - 1));
+ }
+ window->num_outputs--;
+ i--;
+ }
+ }
+
+ if (window->num_outputs == 0) {
SDL_free(window->outputs);
window->outputs = NULL;
}