diff --git a/include/scene_surface b/include/scene_surface new file mode 100644 index 0000000..e69de29 diff --git a/include/types.h b/include/types.h index 894424f..8a48b9e 100644 --- a/include/types.h +++ b/include/types.h @@ -136,6 +136,8 @@ struct absinthe_toplevel { struct wlr_scene_rect *border[4]; struct wlr_xdg_toplevel_decoration_v1 *decoration; + bool floating; + bool tiled; bool fullscreen; bool performing_resize; diff --git a/src/main.c b/src/main.c index eaf0aa6..f3bb24a 100644 --- a/src/main.c +++ b/src/main.c @@ -155,6 +155,7 @@ int main(int argc, char **argv) wl_signal_add(&server.xwayland->events.new_surface, &server.xwayland_new_surface); setenv("DISPLAY", server.xwayland->display_name, 1); + wlr_log(WLR_INFO, "Running XWayland, DISPLAY=%s", server.xwayland->display_name); } else { wlr_log(WLR_ERROR, "Failed to setup XWayland, continuing without it"); } diff --git a/src/server.c b/src/server.c index b576c7e..943db7d 100644 --- a/src/server.c +++ b/src/server.c @@ -64,13 +64,10 @@ void server_new_xdg_toplevel(struct wl_listener *listener, void *data) struct wlr_xdg_toplevel *xdg_toplevel = data; struct absinthe_toplevel *toplevel = malloc(sizeof(*toplevel)); - toplevel->server = server; toplevel->type = ABSINTHE_TOPLEVEL_XDG; + toplevel->server = server; toplevel->toplevel.xdg = xdg_toplevel; - toplevel->scene_tree = wlr_scene_tree_create(&toplevel->server->scene->tree); - toplevel->scene_tree->node.data = toplevel; - toplevel->scene_surface = wlr_scene_xdg_surface_create(toplevel->scene_tree, xdg_toplevel->base); - xdg_toplevel->base->data = toplevel; + toplevel->toplevel.xdg->base->data = toplevel; toplevel->map.notify = xdg_toplevel_map; wl_signal_add(&xdg_toplevel->base->surface->events.map, &toplevel->map); @@ -124,9 +121,6 @@ void server_new_xdg_decoration(struct wl_listener *listener, void *data) wl_signal_add(&xdg_decoration->events.destroy, &toplevel->decoration_destroy); xdg_decoration_request_mode(&toplevel->decoration_request_mode, xdg_decoration); - - toplevel->destroy.notify = xdg_toplevel_destroy; - wl_signal_add(&toplevel->toplevel.xdg->events.destroy, &toplevel->destroy); } #ifdef XWAYLAND @@ -137,23 +131,22 @@ void server_xwayland_ready(struct wl_listener *listener, void *data) wlr_xwayland_set_seat(server->xwayland, server->seat); - if ((xcursor = wlr_xcursor_manager_get_xcursor(server->cursor_mgr, "default", 1))) - wlr_xwayland_set_cursor(server->xwayland, - xcursor->images[0]->buffer, xcursor->images[0]->width * 4, - xcursor->images[0]->width, xcursor->images[0]->height, - xcursor->images[0]->hotspot_x, xcursor->images[0]->hotspot_y); + // if ((xcursor = wlr_xcursor_manager_get_xcursor(server->cursor_mgr, "default", 1))) + // wlr_xwayland_set_cursor(server->xwayland, + // xcursor->images[0]->buffer, xcursor->images[0]->width * 4, + // xcursor->images[0]->width, xcursor->images[0]->height, + // xcursor->images[0]->hotspot_x, xcursor->images[0]->hotspot_y); } void server_xwayland_new_surface(struct wl_listener *listener, void *data) { + struct absinthe_server *server = wl_container_of(listener, server, xwayland_new_surface); struct wlr_xwayland_surface *surface = data; struct absinthe_toplevel *toplevel = malloc(sizeof(*toplevel)); toplevel->type = ABSINTHE_TOPLEVEL_X11; + toplevel->server = server; toplevel->toplevel.x11 = surface; - toplevel->border_width = absinthe_toplevel_is_unmanaged(toplevel) - ? 0 - : ABSINTHE_TOPLEVEL_BORDER_WIDTH; toplevel->destroy.notify = xdg_toplevel_destroy; wl_signal_add(&surface->events.destroy, &toplevel->destroy); diff --git a/src/xdg-toplevel.c b/src/xdg-toplevel.c index 5692b00..1aa7df2 100644 --- a/src/xdg-toplevel.c +++ b/src/xdg-toplevel.c @@ -37,6 +37,18 @@ void xdg_toplevel_map(struct wl_listener *listener, void *data) { struct absinthe_toplevel *toplevel = wl_container_of(listener, toplevel, map); + toplevel->scene_tree = wlr_scene_tree_create(&toplevel->server->scene->tree); + toplevel->scene_tree->node.data = toplevel; + + toplevel->border_width = absinthe_toplevel_is_unmanaged(toplevel) + ? 0 + : ABSINTHE_TOPLEVEL_BORDER_WIDTH; + + toplevel->scene_surface = toplevel->type == ABSINTHE_TOPLEVEL_XDG + ? wlr_scene_xdg_surface_create(toplevel->scene_tree, toplevel->toplevel.xdg->base) + : wlr_scene_subsurface_tree_create(toplevel->scene_tree, toplevel->toplevel.x11->surface); + toplevel->scene_surface->node.data = toplevel; + for (int i = 0; i < 4; ++i) { toplevel->border[i] = wlr_scene_rect_create(toplevel->scene_tree, 0, 0, unfocused_border_color); toplevel->border[i]->node.data = toplevel; @@ -70,17 +82,16 @@ void xdg_toplevel_destroy(struct wl_listener *listener, void *data) { struct absinthe_toplevel *toplevel = wl_container_of(listener, toplevel, destroy); - wl_list_remove(&toplevel->destroy.link); - wl_list_remove(&toplevel->request_maximize.link); - wl_list_remove(&toplevel->request_fullscreen.link); - +#ifdef XWAYLAND if (absinthe_toplevel_is_x11(toplevel)) { wl_list_remove(&toplevel->xwayland_activate.link); wl_list_remove(&toplevel->xwayland_associate.link); wl_list_remove(&toplevel->xwayland_dissociate.link); wl_list_remove(&toplevel->xwayland_configure.link); wl_list_remove(&toplevel->xwayland_set_hints.link); - } else { + } else +#endif + { wl_list_remove(&toplevel->map.link); wl_list_remove(&toplevel->unmap.link); wl_list_remove(&toplevel->commit.link); @@ -88,6 +99,10 @@ void xdg_toplevel_destroy(struct wl_listener *listener, void *data) wl_list_remove(&toplevel->request_resize.link); } + wl_list_remove(&toplevel->destroy.link); + wl_list_remove(&toplevel->request_maximize.link); + wl_list_remove(&toplevel->request_fullscreen.link); + free(toplevel); } diff --git a/src/xwayland.c b/src/xwayland.c index 85d3c80..3bc533e 100644 --- a/src/xwayland.c +++ b/src/xwayland.c @@ -1,7 +1,7 @@ #ifdef XWAYLAND #include "types.h" #include "absinthe-toplevel.h" -#include "xdg_toplevel.h" +#include "xdg-toplevel.h" #include "xwayland.h" void xwayland_activate(struct wl_listener *listener, void *data) @@ -14,23 +14,39 @@ void xwayland_activate(struct wl_listener *listener, void *data) void xwayland_associate(struct wl_listener *listener, void *data) { - struct absinthe_toplevel *toplevel = wl_container_of(listener, toplevel, xwayland_activate); + struct absinthe_toplevel *toplevel = wl_container_of(listener, toplevel, xwayland_associate); toplevel->map.notify = xdg_toplevel_map; - wl_signal_add(&toplevel->toplevel.x11->events.map, &toplevel->map); + wl_signal_add(&toplevel->toplevel.x11->surface->events.map, &toplevel->map); toplevel->unmap.notify = xdg_toplevel_unmap; - wl_signal_add(&toplevel->toplevel.x11->events.unmap, &toplevel->unmap); + wl_signal_add(&toplevel->toplevel.x11->surface->events.unmap, &toplevel->unmap); } void xwayland_dissociate(struct wl_listener *listener, void *data) { - struct absinthe_toplevel *toplevel = wl_container_of(listener, toplevel, xwayland_activate); + struct absinthe_toplevel *toplevel = wl_container_of(listener, toplevel, xwayland_dissociate); wl_list_remove(&toplevel->map.link); wl_list_remove(&toplevel->unmap.link); } -void xwayland_configure(struct wl_listener *listener, void *data) {} +void xwayland_configure(struct wl_listener *listener, void *data) +{ + struct absinthe_toplevel *toplevel = wl_container_of(listener, toplevel, xwayland_activate); + struct wlr_xwayland_surface_configure_event *event = data; + + if (!toplevel->toplevel.x11->surface || !toplevel->toplevel.x11->surface->mapped) { + wlr_xwayland_surface_configure(toplevel->toplevel.x11, event->x, event->y, event->width, event->height); + return; + } + + if (absinthe_toplevel_is_unmanaged(toplevel)) { + wlr_scene_node_set_position(&toplevel->scene_tree->node, event->x, event->y); + wlr_xwayland_surface_configure(toplevel->toplevel.x11, + event->x, event->y, event->width, event->height); + return; + } +} void xwayland_set_hints(struct wl_listener *listener, void *data) {}