diff --git a/src/drm.cpp b/src/drm.cpp index f6e2fb6..17549de 100644 --- a/src/drm.cpp +++ b/src/drm.cpp @@ -111,28 +111,35 @@ static uint32_t get_conn_display_info_flags(struct drm_t *drm, struct connector return flags; } -static void update_connector_display_info_wl(struct drm_t *drm) +void drm_send_gamescope_control(wl_resource *control, struct drm_t *drm) { + // assumes wlserver_lock HELD! + if ( !drm->connector ) return; auto& conn = drm->connector; + uint32_t flags = get_conn_display_info_flags( drm, drm->connector ); + + struct wl_array display_rates; + wl_array_init(&display_rates); + if ( conn->valid_display_rates.size() ) + { + size_t size = conn->valid_display_rates.size() * sizeof(uint32_t); + uint32_t *ptr = (uint32_t *)wl_array_add( &display_rates, size ); + memcpy( ptr, conn->valid_display_rates.data(), size ); + } + gamescope_control_send_active_display_info( control, drm->connector->name, drm->connector->make, drm->connector->model, flags, &display_rates ); + wl_array_release(&display_rates); +} + +static void update_connector_display_info_wl(struct drm_t *drm) +{ wlserver_lock(); for ( const auto &control : wlserver.gamescope_controls ) { - uint32_t flags = get_conn_display_info_flags( drm, drm->connector ); - - struct wl_array display_rates; - wl_array_init(&display_rates); - if ( conn->valid_display_rates.size() ) - { - size_t size = conn->valid_display_rates.size() * sizeof(uint32_t); - uint32_t *ptr = (uint32_t *)wl_array_add( &display_rates, size ); - memcpy( ptr, conn->valid_display_rates.data(), size ); - } - gamescope_control_send_active_display_info( control, drm->connector->name, drm->connector->make, drm->connector->model, flags, &display_rates ); - wl_array_release(&display_rates); + drm_send_gamescope_control(control, drm); } wlserver_unlock(); } diff --git a/src/drm.hpp b/src/drm.hpp index 8821963..6810797 100644 --- a/src/drm.hpp +++ b/src/drm.hpp @@ -51,6 +51,11 @@ inline bool ColorspaceIsHDR( GamescopeAppTextureColorspace colorspace ) colorspace == GAMESCOPE_APP_TEXTURE_COLORSPACE_HDR10_PQ; } +extern "C" +{ + struct wl_resource; +} + extern struct drm_t g_DRM; void drm_destroy_blob(struct drm_t *drm, uint32_t blob); @@ -408,3 +413,5 @@ extern bool g_bSupportsAsyncFlips; const char* drm_get_patched_edid_path(); void drm_update_patched_edid(drm_t *drm); + +void drm_send_gamescope_control(wl_resource *control, struct drm_t *drm); diff --git a/src/wlserver.cpp b/src/wlserver.cpp index 9ba291c..76386a0 100644 --- a/src/wlserver.cpp +++ b/src/wlserver.cpp @@ -892,6 +892,11 @@ static void gamescope_control_bind( struct wl_client *client, void *data, uint32 gamescope_control_send_feature_support( resource, GAMESCOPE_CONTROL_FEATURE_PIXEL_FILTER, 1, 0 ); gamescope_control_send_feature_support( resource, GAMESCOPE_CONTROL_FEATURE_DONE, 0, 0 ); + if ( !BIsNested() ) + { + drm_send_gamescope_control( resource, &g_DRM ); + } + wlserver.gamescope_controls.push_back(resource); }