aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--types/wlr_wl_shell.c70
1 files changed, 26 insertions, 44 deletions
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;