From 5ed0753165f1df4be06514f42d6b29dfd5375cda Mon Sep 17 00:00:00 2001 From: Joshua Ashton Date: Sun, 6 Feb 2022 23:09:32 +0000 Subject: [PATCH] wlserver: Add wlserver_set_xwayland_server_mode Sets the current mode and stuff for a specific xwayland server. --- src/wlserver.cpp | 24 ++++++++++++++++++++++++ src/wlserver.hpp | 4 ++++ 2 files changed, 28 insertions(+) diff --git a/src/wlserver.cpp b/src/wlserver.cpp index 22b1aff..2ec96d7 100644 --- a/src/wlserver.cpp +++ b/src/wlserver.cpp @@ -522,6 +522,11 @@ void gamescope_xwayland_server_t::handle_override_window_content( struct wl_clie content_overrides[ x11_window ] = co; } +struct wl_client *gamescope_xwayland_server_t::get_client() +{ + return xwayland_server->client; +} + static void gamescope_xwayland_handle_override_window_content( struct wl_client *client, struct wl_resource *resource, struct wl_resource *surface_resource, uint32_t x11_window ) { // This should ideally use the surface's xwayland, but we don't know it. @@ -1060,3 +1065,22 @@ void wlserver_surface_finish( struct wlserver_surface *surf ) wl_list_remove( &surf->pending_link ); wl_list_remove( &surf->destroy.link ); } + +void wlserver_set_xwayland_server_mode( size_t idx, int w, int h, int refresh ) +{ + gamescope_xwayland_server_t *server = wlserver_get_xwayland_server( idx ); + if ( !server ) + return; + wl_client *client = server->get_client(); + + struct wl_resource *resource; + wl_resource_for_each( resource, &wlserver.wlr.output->resources ) + { + if ( wl_resource_get_client( resource ) == client ) + { + wl_output_send_mode( resource, WL_OUTPUT_MODE_CURRENT, w, h, refresh * 1000 ); + wl_output_send_done( resource ); + wl_log.infof( "Updating mode for xwayland server %zu %dx%d@%d - client %p - resource %p", idx, w, h, refresh, client, resource ); + } + } +} diff --git a/src/wlserver.hpp b/src/wlserver.hpp index a2c0f23..18e55c1 100644 --- a/src/wlserver.hpp +++ b/src/wlserver.hpp @@ -47,6 +47,8 @@ public: 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_content_override *co); + struct wl_client *get_client(); + private: struct wlr_xwayland_server *xwayland_server = NULL; struct wl_listener xwayland_ready_listener = { .notify = xwayland_ready_callback }; @@ -167,3 +169,5 @@ struct wlserver_surface void wlserver_surface_init( struct wlserver_surface *surf, long x11_id ); void wlserver_surface_finish( struct wlserver_surface *surf ); + +void wlserver_set_xwayland_server_mode( size_t idx, int w, int h, int refresh );