wlserver: Clean up content overrides on surface destroy + support multiple servers for it

This commit is contained in:
Joshua Ashton 2023-03-16 23:36:51 +00:00
parent f0fd4e6301
commit 6e2c06eed8
2 changed files with 17 additions and 4 deletions

View file

@ -65,6 +65,7 @@ static struct wlserver_t wlserver = {
}; };
struct wlserver_content_override { struct wlserver_content_override {
gamescope_xwayland_server_t *server;
struct wlr_surface *surface; struct wlr_surface *surface;
uint32_t x11_window; uint32_t x11_window;
struct wl_listener surface_destroy_listener; struct wl_listener surface_destroy_listener;
@ -430,6 +431,8 @@ static void handle_wl_surface_destroy( struct wl_listener *l, void *data )
{ {
wlserver_x11_surface_info *x11_surface = surf->x11_surface; wlserver_x11_surface_info *x11_surface = surf->x11_surface;
x11_surface->xwayland_server->destroy_content_override( x11_surface, surf->wlr );
wlserver_x11_surface_info_finish(x11_surface); wlserver_x11_surface_info_finish(x11_surface);
// Re-init it so it can be destroyed for good on the x11 side. // Re-init it so it can be destroyed for good on the x11 side.
// This just clears it out from the main wl surface mainly. // This just clears it out from the main wl surface mainly.
@ -497,14 +500,22 @@ void gamescope_xwayland_server_t::destroy_content_override( struct wlserver_cont
content_overrides.erase( co->x11_window ); content_overrides.erase( co->x11_window );
free( co ); free( co );
} }
void gamescope_xwayland_server_t::destroy_content_override( struct wlserver_x11_surface_info *x11_surface, struct wlr_surface *surf )
{
auto iter = content_overrides.find( x11_surface->x11_id );
if (iter == content_overrides.end())
return;
struct wlserver_content_override *co = iter->second;
if (co->surface == surf)
destroy_content_override(iter->second);
}
static void content_override_handle_surface_destroy( struct wl_listener *listener, void *data ) static void content_override_handle_surface_destroy( struct wl_listener *listener, void *data )
{ {
struct wlserver_content_override *co = wl_container_of( listener, co, surface_destroy_listener ); struct wlserver_content_override *co = wl_container_of( listener, co, surface_destroy_listener );
/* The protocol only works for server 0, so assume that for now. gamescope_xwayland_server_t *server = co->server;
* A future revision may change this and add a DISPLAY parameter or something.
* That would be cool! */
gamescope_xwayland_server_t *server = wlserver_get_xwayland_server( 0 );
assert( server ); assert( server );
server->destroy_content_override( co ); server->destroy_content_override( co );
} }
@ -522,6 +533,7 @@ void gamescope_xwayland_server_t::handle_override_window_content( struct wl_clie
x11_window = x11_surface->x11_id; x11_window = x11_surface->x11_id;
struct wlserver_content_override *co = (struct wlserver_content_override *)calloc(1, sizeof(*co)); struct wlserver_content_override *co = (struct wlserver_content_override *)calloc(1, sizeof(*co));
co->server = this;
co->surface = surface; co->surface = surface;
co->x11_window = x11_window; co->x11_window = x11_window;
co->surface_destroy_listener.notify = content_override_handle_surface_destroy; co->surface_destroy_listener.notify = content_override_handle_surface_destroy;

View file

@ -66,6 +66,7 @@ public:
std::vector<ResListEntry_t> retrieve_commits(); std::vector<ResListEntry_t> retrieve_commits();
void handle_override_window_content( struct wl_client *client, struct wl_resource *resource, struct wl_resource *surface_resource, uint32_t x11_window ); void handle_override_window_content( struct wl_client *client, struct wl_resource *resource, struct wl_resource *surface_resource, uint32_t x11_window );
void destroy_content_override( struct wlserver_x11_surface_info *x11_surface, struct wlr_surface *surf);
void destroy_content_override(struct wlserver_content_override *co); void destroy_content_override(struct wlserver_content_override *co);
struct wl_client *get_client(); struct wl_client *get_client();