From aa3d0060c2d4a9f1e687987f828af19a618f030b Mon Sep 17 00:00:00 2001 From: Alexander Orzechowski Date: Sun, 4 Dec 2022 19:19:48 -0500 Subject: [PATCH] wl_surf: Add invalidated function callback --- meson.build | 6 ++++++ wayland.c | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++ wayland.h | 11 +++++++++++ 3 files changed, 67 insertions(+) diff --git a/meson.build b/meson.build index 68c3bf19..42deabb1 100644 --- a/meson.build +++ b/meson.build @@ -135,6 +135,12 @@ if wayland_protocols.version().version_compare('>=1.21') wl_proto_xml += [wayland_protocols_datadir + '/staging/xdg-activation/xdg-activation-v1.xml'] endif +# TODO: Update when this protocol is actually released +if wayland_protocols.version().version_compare('>=1.21') + add_project_arguments('-DHAVE_SURFACE_INVALIDATION', language: 'c') + wl_proto_xml += [ wayland_protocols_datadir + '/staging/surface-invalidation/surface-invalidation-v1.xml'] +endif + foreach prot : wl_proto_xml wl_proto_headers += custom_target( prot.underscorify() + '-client-header', diff --git a/wayland.c b/wayland.c index dd4c7825..520a0541 100644 --- a/wayland.c +++ b/wayland.c @@ -1124,6 +1124,17 @@ handle_global(void *data, struct wl_registry *registry, seat_add_text_input(&it->item); } #endif + +#if defined(HAVE_SURFACE_INVALIDATION) && HAVE_SURFACE_INVALIDATION + else if (strcmp(interface, wp_surface_invalidation_manager_v1_interface.name) == 0) { + const uint32_t required = 1; + if (!verify_iface_version(interface, version, required)) + return; + + wayl->surface_invalidation_manager = wl_registry_bind( + wayl->registry, name, &wp_surface_invalidation_manager_v1_interface, required); + } +#endif } static void @@ -1459,6 +1470,41 @@ wayl_destroy(struct wayland *wayl) free(wayl); } +#if defined (HAVE_SURFACE_INVALIDATION) +static void surface_invalidation_handle_invalidated( + void *data, + struct wp_surface_invalidation_v1 *wp_surface_invalidation_v1, + uint32_t serial) +{ + struct wl_surf *surf = data; + + if (surf->invalidated == NULL) + return; + + wp_surface_invalidation_v1_ack(wp_surface_invalidation_v1, serial); + surf->invalidated(surf->term); +} + +static struct wp_surface_invalidation_v1_listener surface_invalidation_listener = { + .invalidated = surface_invalidation_handle_invalidated, +}; +#endif + +static void +init_wl_surf_inaviladion(struct terminal *term, struct wl_surf *surf) { + surf->term = term; +#if defined (HAVE_SURFACE_INVALIDATION) + if (!term->wl->surface_invalidation_manager) + return; + + struct wp_surface_invalidation_v1 *surface_invalidation + = wp_surface_invalidation_manager_v1_get_surface_invalidation( + term->wl->surface_invalidation_manager, surf->surf); + wp_surface_invalidation_v1_add_listener(surface_invalidation, + &surface_invalidation_listener, surf); +#endif +} + struct wl_window * wayl_win_init(struct terminal *term, const char *token) { @@ -1531,6 +1577,8 @@ wayl_win_init(struct terminal *term, const char *token) LOG_WARN("no decoration manager available - using CSDs unconditionally"); } + init_wl_surf_inaviladion(term, &win->main); + wl_surface_commit(win->main.surf); #if defined(HAVE_XDG_ACTIVATION) @@ -1873,6 +1921,8 @@ wayl_win_subsurface_new_with_custom_parent( surf->surf = main_surface; surf->sub = sub; + + init_wl_surf_inaviladion(win->term, surf); return true; } diff --git a/wayland.h b/wayland.h index 4b9fc7ee..e91b996a 100644 --- a/wayland.h +++ b/wayland.h @@ -20,6 +20,10 @@ #include #endif +#if defined(HAVE_SURFACE_INVALIDATION) + #include +#endif + #include #include @@ -292,6 +296,9 @@ struct monitor { struct wl_surf { struct wl_surface *surf; struct wl_subsurface *sub; + struct terminal *term; + + void (*invalidated)(struct terminal *term); }; struct wl_url { @@ -405,6 +412,10 @@ struct wayland { struct xdg_activation_v1 *xdg_activation; #endif +#if defined(HAVE_SURFACE_INVALIDATION) + struct wp_surface_invalidation_manager_v1 *surface_invalidation_manager; +#endif + bool presentation_timings; struct wp_presentation *presentation; uint32_t presentation_clock_id;