diff --git a/cageng.c b/cageng.c index b4c9026..330ced6 100644 --- a/cageng.c +++ b/cageng.c @@ -21,9 +21,11 @@ #include #include #include +#include #include #include "desktop/output.h" +#include "desktop/xdg_shell.h" #include "serverng.h" static int @@ -154,6 +156,49 @@ handle_signal(int signal, void *user_data) } } +static void +handle_view_unmapped(struct wl_listener *listener, void *user_data) +{ + // struct cg_server *server = wl_container_of(listener, server, view_unmapped); + // struct cg_view *view = user_data; + + // no-op +} + +static void +handle_view_mapped(struct wl_listener *listener, void *user_data) +{ + // struct cg_server *server = wl_container_of(listener, server, view_mapped); + // struct cg_view *view = user_data; + + // no-op +} + +static void +handle_xdg_shell_surface_new(struct wl_listener *listener, void *user_data) +{ + struct cg_server *server = wl_container_of(listener, server, new_xdg_shell_surface); + struct wlr_xdg_surface *xdg_surface = user_data; + + if (xdg_surface->role != WLR_XDG_SURFACE_ROLE_TOPLEVEL) { + return; + } + + struct cg_xdg_shell_view *xdg_shell_view = calloc(1, sizeof(struct cg_xdg_shell_view)); + if (!xdg_shell_view) { + wlr_log(WLR_ERROR, "Failed to allocate XDG Shell view"); + return; + } + + struct cg_output *output = wl_container_of(server->outputs.next, output, link); + cage_xdg_shell_view_init(xdg_shell_view, xdg_surface, output); + + server->view_mapped.notify = handle_view_mapped; + wl_signal_add(&xdg_shell_view->view.events.map, &server->view_mapped); + server->view_unmapped.notify = handle_view_unmapped; + wl_signal_add(&xdg_shell_view->view.events.unmap, &server->view_unmapped); +} + static void handle_new_output(struct wl_listener *listener, void *user_data) { @@ -223,6 +268,7 @@ main(int argc, char *argv[]) struct wlr_backend *backend = NULL; struct wlr_renderer *renderer = NULL; struct wlr_compositor *compositor = NULL; + struct wlr_xdg_shell *xdg_shell = NULL; pid_t pid = 0; int ret = 0; @@ -285,6 +331,15 @@ main(int argc, char *argv[]) server.new_output.notify = handle_new_output; wl_signal_add(&backend->events.new_output, &server.new_output); + xdg_shell = wlr_xdg_shell_create(server.wl_display); + if (!xdg_shell) { + wlr_log(WLR_ERROR, "Unable to create the XDG shell interface"); + ret = 1; + goto end; + } + server.new_xdg_shell_surface.notify = handle_xdg_shell_surface_new; + wl_signal_add(&xdg_shell->events.new_surface, &server.new_xdg_shell_surface); + const char *socket = wl_display_add_socket_auto(server.wl_display); if (!socket) { wlr_log_errno(WLR_ERROR, "Unable to open Wayland socket"); diff --git a/desktop/view.c b/desktop/view.c index e4c6348..f221974 100644 --- a/desktop/view.c +++ b/desktop/view.c @@ -17,7 +17,7 @@ #include "view.h" static bool -cage_view_extends_output_layout(struct cg_view *view, struct wlr_box *output_box) +cage_view_extends_output(struct cg_view *view, struct wlr_box *output_box) { assert(view->impl->get_geometry != NULL); @@ -57,7 +57,7 @@ cage_view_position(struct cg_view *view) struct wlr_box output_box = {0}; cage_output_get_geometry(view->output, &output_box); - if (cage_view_is_primary(view) || cage_view_extends_output_layout(view, &output_box)) { + if (cage_view_is_primary(view) || cage_view_extends_output(view, &output_box)) { cage_view_maximize(view, &output_box); } else { cage_view_center(view, &output_box); diff --git a/serverng.h b/serverng.h index 16a25d2..49ab224 100644 --- a/serverng.h +++ b/serverng.h @@ -13,6 +13,11 @@ struct cg_server { struct wl_list outputs; // cg_output::link struct wlr_output_layout *output_layout; struct wl_listener new_output; + + struct wl_listener new_xdg_shell_surface; + + struct wl_listener view_mapped; + struct wl_listener view_unmapped; }; #endif