From d87f6d9b9d98ea8064e4063c01d483895fef87f0 Mon Sep 17 00:00:00 2001 From: Alex Maese Date: Fri, 2 Aug 2024 13:33:57 -0500 Subject: [PATCH] Add clipboard support from SDL backend Looks like as part of the backend refactor, copy and paste was partially broken with the SDL backend. This fixes that broken functionality and lays some groundwork for copy and paste in the Wayland Backend. --- src/Backends/OpenVRBackend.cpp | 6 +++++- src/Backends/SDLBackend.cpp | 12 ++++++++++-- src/Backends/WaylandBackend.cpp | 5 +++++ src/backend.h | 1 + src/steamcompmgr.cpp | 6 ++++-- 5 files changed, 25 insertions(+), 5 deletions(-) diff --git a/src/Backends/OpenVRBackend.cpp b/src/Backends/OpenVRBackend.cpp index f03a65d2b..c39caa54b 100644 --- a/src/Backends/OpenVRBackend.cpp +++ b/src/Backends/OpenVRBackend.cpp @@ -893,7 +893,11 @@ namespace gamescope vr::VROverlay()->ClearOverlayTexture( GetPrimaryPlane()->GetOverlayThumbnail() ); } } - virtual std::shared_ptr GetHostCursor() override + virtual void SetSelection( std::shared_ptr szContents, GamescopeSelection eSelection ) override + { + // Do nothing. + } + virtual std::shared_ptr GetHostCursor() override { return nullptr; } diff --git a/src/Backends/SDLBackend.cpp b/src/Backends/SDLBackend.cpp index 8b3646420..6d50f8d34 100644 --- a/src/Backends/SDLBackend.cpp +++ b/src/Backends/SDLBackend.cpp @@ -11,6 +11,7 @@ #include "SDL_clipboard.h" #include "SDL_events.h" +#include "gamescope_shared.h" #include "main.hpp" #include "wlserver.hpp" #include @@ -162,7 +163,8 @@ namespace gamescope virtual void SetVisible( bool bVisible ) override; virtual void SetTitle( std::shared_ptr szTitle ) override; virtual void SetIcon( std::shared_ptr> uIconPixels ) override; - virtual std::shared_ptr GetHostCursor() override; + virtual void SetSelection( std::shared_ptr szContents, GamescopeSelection eSelection ) override; + virtual std::shared_ptr GetHostCursor() override; protected: virtual void OnBackendBlobDestroyed( BackendBlob *pBlob ) override; private: @@ -496,7 +498,13 @@ namespace gamescope m_pApplicationIcon = uIconPixels; PushUserEvent( GAMESCOPE_SDL_EVENT_ICON ); } - + void CSDLBackend::SetSelection( std::shared_ptr szContents, GamescopeSelection eSelection ) + { + if (eSelection == GAMESCOPE_SELECTION_CLIPBOARD) + SDL_SetClipboardText(szContents->c_str()); + else if (eSelection == GAMESCOPE_SELECTION_PRIMARY) + SDL_SetPrimarySelectionText(szContents->c_str()); + } std::shared_ptr CSDLBackend::GetHostCursor() { return GetX11HostCursor(); diff --git a/src/Backends/WaylandBackend.cpp b/src/Backends/WaylandBackend.cpp index 5e2b0191d..c53bf14df 100644 --- a/src/Backends/WaylandBackend.cpp +++ b/src/Backends/WaylandBackend.cpp @@ -545,6 +545,7 @@ namespace gamescope virtual void SetVisible( bool bVisible ) override; virtual void SetTitle( std::shared_ptr szTitle ) override; virtual void SetIcon( std::shared_ptr> uIconPixels ) override; + virtual void SetSelection( std::shared_ptr szContents, GamescopeSelection eSelection ) override; virtual std::shared_ptr GetHostCursor() override; protected: virtual void OnBackendBlobDestroyed( BackendBlob *pBlob ) override; @@ -1976,6 +1977,10 @@ namespace gamescope xdg_toplevel_icon_manager_v1_set_icon( m_pToplevelIconManager, m_Planes[0].GetXdgToplevel(), nullptr ); } } + void CWaylandBackend::SetSelection( std::shared_ptr szContents, GamescopeSelection eSelection ) + { + // Do nothing + } std::shared_ptr CWaylandBackend::GetHostCursor() { diff --git a/src/backend.h b/src/backend.h index d09e11dd5..dd295f4ac 100644 --- a/src/backend.h +++ b/src/backend.h @@ -130,6 +130,7 @@ namespace gamescope virtual void SetVisible( bool bVisible ) = 0; virtual void SetTitle( std::shared_ptr szTitle ) = 0; virtual void SetIcon( std::shared_ptr> uIconPixels ) = 0; + virtual void SetSelection( std::shared_ptr szContents, GamescopeSelection eSelection ) = 0; virtual std::shared_ptr GetHostCursor() = 0; }; diff --git a/src/steamcompmgr.cpp b/src/steamcompmgr.cpp index 376770b9f..047a93053 100644 --- a/src/steamcompmgr.cpp +++ b/src/steamcompmgr.cpp @@ -29,6 +29,7 @@ * says above. Not that I can really do anything about it */ +#include "gamescope_shared.h" #include "xwayland_ctx.hpp" #include #include @@ -4979,13 +4980,14 @@ handle_selection_notify(xwayland_ctx_t *ctx, XSelectionEvent *ev) &actual_type, &actual_format, &nitems, &bytes_after, &data); if (data) { const char *contents = (const char *) data; + auto szContents = std::make_shared(contents); defer( XFree( data ); ); if (ev->selection == ctx->atoms.clipboard) { if ( GetBackend()->GetNestedHints() ) { - //GetBackend()->GetNestedHints()->SetSelection() + GetBackend()->GetNestedHints()->SetSelection( szContents, GAMESCOPE_SELECTION_CLIPBOARD ); } else { @@ -4996,7 +4998,7 @@ handle_selection_notify(xwayland_ctx_t *ctx, XSelectionEvent *ev) { if ( GetBackend()->GetNestedHints() ) { - //GetBackend()->GetNestedHints()->SetSelection() + GetBackend()->GetNestedHints()->SetSelection( szContents, GAMESCOPE_SELECTION_PRIMARY ); } else {