From bb4d9a5fd33cf1a7c08c096721e5640022de0315 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Ekl=C3=B6f?= Date: Fri, 12 Feb 2021 11:29:36 +0100 Subject: [PATCH] wayland: add wayl_win_subsurface_new() and wayl_win_subsurface_destroy() These are utility functions to create a Wayland subsurface associated with the window. --- wayland.c | 47 +++++++++++++++++++++++++++++++++++++++++++++++ wayland.h | 14 +++++++++++++- 2 files changed, 60 insertions(+), 1 deletion(-) diff --git a/wayland.c b/wayland.c index 1bb95d68..1dfd04ba 100644 --- a/wayland.c +++ b/wayland.c @@ -1570,3 +1570,50 @@ wayl_roundtrip(struct wayland *wayl) wl_display_dispatch_pending(wayl->display); wayl_flush(wayl); } + +bool +wayl_win_subsurface_new_with_custom_parent( + struct wl_window *win, struct wl_surface *parent, + struct wl_surf_subsurf *surf) +{ + struct wayland *wayl = win->term->wl; + + surf->surf = NULL; + surf->sub = NULL; + + struct wl_surface *main = wl_compositor_create_surface(wayl->compositor); + if (main == NULL) + return false; + + struct wl_subsurface *sub = wl_subcompositor_get_subsurface( + wayl->sub_compositor, main, parent); + + if (sub == NULL) { + wl_surface_destroy(main); + return false; + } + + wl_surface_set_user_data(main, win); + wl_subsurface_set_sync(sub); + + surf->surf = main; + surf->sub = sub; + return true; +} + +bool +wayl_win_subsurface_new(struct wl_window *win, struct wl_surf_subsurf *surf) +{ + return wayl_win_subsurface_new_with_custom_parent(win, win->surface, surf); +} + +void +wayl_win_subsurface_destroy(struct wl_surf_subsurf *surf) +{ + if (surf == NULL) + return; + if (surf->sub != NULL) + wl_subsurface_destroy(surf->sub); + if (surf->surf != NULL) + wl_surface_destroy(surf->surf); +} diff --git a/wayland.h b/wayland.h index bd1102c4..2e4c7037 100644 --- a/wayland.h +++ b/wayland.h @@ -350,6 +350,11 @@ struct monitor { bool use_output_release; }; +struct wl_surf_subsurf { + struct wl_surface *surf; + struct wl_subsurface *sub; +}; + struct wl_url { const struct url *url; struct wl_surface *surf; @@ -453,10 +458,17 @@ struct wayland { struct wayland *wayl_init(const struct config *conf, struct fdm *fdm); void wayl_destroy(struct wayland *wayl); +bool wayl_reload_xcursor_theme(struct seat *seat, int new_scale); + void wayl_flush(struct wayland *wayl); void wayl_roundtrip(struct wayland *wayl); struct wl_window *wayl_win_init(struct terminal *term); void wayl_win_destroy(struct wl_window *win); -bool wayl_reload_xcursor_theme(struct seat *seat, int new_scale); +bool wayl_win_subsurface_new( + struct wl_window *win, struct wl_surf_subsurf *surf); +bool wayl_win_subsurface_new_with_custom_parent( + struct wl_window *win, struct wl_surface *parent, + struct wl_surf_subsurf *surf); +void wayl_win_subsurface_destroy(struct wl_surf_subsurf *surf);