static void set_transient(struct wl_client * client, struct wl_resource * resource, struct wl_resource * parent_resource, int32_t x, int32_t y, uint32_t flags) { struct shell_surface * shell_surface = wl_resource_get_user_data(resource); struct swc_surface * parent_surface = wl_resource_get_user_data(parent_resource); struct compositor_view * parent_view = compositor_view(parent_surface->view); if (!parent_view || !parent_view->window) return; window_manage(&shell_surface->window); window_set_parent(&shell_surface->window, parent_view->window); }
static void set_popup(struct wl_client * client, struct wl_resource * resource, struct wl_resource * seat_resource, uint32_t serial, struct wl_resource * parent_resource, int32_t x, int32_t y, uint32_t flags) { struct shell_surface * shell_surface = wl_resource_get_user_data(resource); struct swc_surface * parent_surface = wl_resource_get_user_data(parent_resource); struct compositor_view * parent_view = compositor_view(parent_surface->view); if (!parent_view || !parent_view->window) return; window_unmanage(&shell_surface->window); window_set_parent(&shell_surface->window, parent_view->window); view_move(&shell_surface->window.view->base, parent_view->base.geometry.x + x, parent_view->base.geometry.y + y); }
struct xdg_popup * xdg_popup_new(struct wl_client *client, uint32_t version, uint32_t id, struct surface *surface, struct surface *parent_surface, int32_t x, int32_t y) { struct xdg_popup *popup; struct compositor_view *parent = compositor_view(parent_surface->view); if (!parent) goto error0; popup = malloc(sizeof *popup); if (!popup) goto error0; popup->resource = wl_resource_create(client, &xdg_popup_interface, version, id); if (!popup->resource) goto error1; popup->surface_destroy_listener.notify = &handle_surface_destroy; wl_resource_add_destroy_listener(surface->resource, &popup->surface_destroy_listener); wl_resource_set_implementation(popup->resource, &xdg_popup_implementation, popup, &destroy_popup); if (!(popup->view = compositor_create_view(surface))) goto error2; view_move(&popup->view->base, parent->base.geometry.x + x, parent->base.geometry.y + y); compositor_view_set_parent(popup->view, parent); return popup; error2: wl_resource_destroy(popup->resource); error1: free(popup); error0: return NULL; }