diff --git a/types/wlr_wl_shell.c b/types/wlr_wl_shell.c index 4abec95e..5bf1ec80 100644 --- a/types/wlr_wl_shell.c +++ b/types/wlr_wl_shell.c @@ -35,7 +35,6 @@ static void shell_surface_move(struct wl_client *client, wl_client_post_no_memory(client); return; } - event->client = client; event->surface = surface; event->seat_handle = seat_handle; @@ -60,7 +59,6 @@ static void shell_surface_resize(struct wl_client *client, wl_client_post_no_memory(client); return; } - event->client = client; event->surface = surface; event->seat_handle = seat_handle; @@ -72,18 +70,25 @@ static void shell_surface_resize(struct wl_client *client, free(event); } +static void shell_surface_set_state(struct wlr_wl_shell_surface *surface, + enum wlr_wl_shell_surface_state state, + struct wlr_wl_shell_surface_transient_state *transient_state, + struct wlr_wl_shell_surface_popup_state *popup_state) { + surface->state = state; + free(surface->transient_state); + surface->transient_state = transient_state; + free(surface->popup_state); + surface->popup_state = popup_state; + + wl_signal_emit(&surface->events.set_state, surface); +} + static void shell_surface_set_toplevel(struct wl_client *client, struct wl_resource *resource) { wlr_log(L_DEBUG, "got shell surface toplevel"); struct wlr_wl_shell_surface *surface = wl_resource_get_user_data(resource); - - if (surface->state != WLR_WL_SHELL_SURFACE_STATE_NONE) { - return; - } - - surface->state = WLR_WL_SHELL_SURFACE_STATE_TOPLEVEL; - - wl_signal_emit(&surface->events.set_state, surface); + shell_surface_set_state(surface, WLR_WL_SHELL_SURFACE_STATE_TOPLEVEL, NULL, + NULL); } static void shell_surface_set_transient(struct wl_client *client, @@ -95,28 +100,19 @@ static void shell_surface_set_transient(struct wl_client *client, wl_resource_get_user_data(parent_resource); // TODO: check if parent_resource == NULL? - if (surface->state != WLR_WL_SHELL_SURFACE_STATE_NONE) { - return; - } - - struct wlr_wl_shell_surface_transient_state *state = + struct wlr_wl_shell_surface_transient_state *transient_state = calloc(1, sizeof(struct wlr_wl_shell_surface_transient_state)); - if (state == NULL) { + if (transient_state == NULL) { wl_client_post_no_memory(client); return; } + transient_state->parent = parent; + transient_state->x = x; + transient_state->y = y; + transient_state->flags = flags; - state->parent = parent; - state->x = x; - state->y = y; - state->flags = flags; - - free(surface->transient_state); - surface->transient_state = state; - - surface->state = WLR_WL_SHELL_SURFACE_STATE_TRANSIENT; - - wl_signal_emit(&surface->events.set_state, surface); + shell_surface_set_state(surface, WLR_WL_SHELL_SURFACE_STATE_TRANSIENT, + transient_state, NULL); } static void shell_surface_set_fullscreen(struct wl_client *client, @@ -139,7 +135,6 @@ static void shell_surface_set_fullscreen(struct wl_client *client, wl_client_post_no_memory(client); return; } - event->client = client; event->surface = surface; event->method = method; @@ -163,17 +158,12 @@ static void shell_surface_set_popup(struct wl_client *client, wl_resource_get_user_data(parent_resource); // TODO: check if parent_resource == NULL? - if (surface->state != WLR_WL_SHELL_SURFACE_STATE_NONE) { - return; - } - struct wlr_wl_shell_surface_transient_state *transient_state = calloc(1, sizeof(struct wlr_wl_shell_surface_transient_state)); if (transient_state == NULL) { wl_client_post_no_memory(client); return; } - transient_state->parent = parent; transient_state->x = x; transient_state->y = y; @@ -182,22 +172,15 @@ static void shell_surface_set_popup(struct wl_client *client, struct wlr_wl_shell_surface_popup_state *popup_state = calloc(1, sizeof(struct wlr_wl_shell_surface_transient_state)); if (popup_state == NULL) { + free(transient_state); wl_client_post_no_memory(client); return; } - popup_state->seat_handle = seat_handle; popup_state->serial = serial; - free(surface->transient_state); - surface->transient_state = transient_state; - - free(surface->popup_state); - surface->popup_state = popup_state; - - surface->state = WLR_WL_SHELL_SURFACE_STATE_POPUP; - - wl_signal_emit(&surface->events.set_state, surface); + shell_surface_set_state(surface, WLR_WL_SHELL_SURFACE_STATE_POPUP, + transient_state, popup_state); } static void shell_surface_set_maximized(struct wl_client *client, @@ -219,7 +202,6 @@ static void shell_surface_set_maximized(struct wl_client *client, wl_client_post_no_memory(client); return; } - event->client = client; event->surface = surface; event->output = output;