From e6a96da6a776afd6154e739d895641ab4c0cce12 Mon Sep 17 00:00:00 2001 From: Jonathan Ma Date: Wed, 18 Feb 2026 13:58:34 -0500 Subject: [PATCH 1/2] screen share for web --- .../lib/client/components/voip/voip_session.dart | 2 ++ .../voip_room/matrix_livekit_voip_session.dart | 16 ++++++++++++++++ 2 files changed, 18 insertions(+) diff --git a/commet/lib/client/components/voip/voip_session.dart b/commet/lib/client/components/voip/voip_session.dart index 03d755b51..a541ca09b 100644 --- a/commet/lib/client/components/voip/voip_session.dart +++ b/commet/lib/client/components/voip/voip_session.dart @@ -16,6 +16,8 @@ enum VoipState { abstract class ScreenCaptureSource {} +class SdkManagedScreenCaptureSource implements ScreenCaptureSource {} + abstract class VoipSession { Client get client; diff --git a/commet/lib/client/matrix/components/voip_room/matrix_livekit_voip_session.dart b/commet/lib/client/matrix/components/voip_room/matrix_livekit_voip_session.dart index 07ea4a513..7ac3d2ebd 100644 --- a/commet/lib/client/matrix/components/voip_room/matrix_livekit_voip_session.dart +++ b/commet/lib/client/matrix/components/voip_room/matrix_livekit_voip_session.dart @@ -246,6 +246,19 @@ class MatrixLivekitVoipSession implements VoipSession { @override Future setScreenShare(ScreenCaptureSource source) async { + if (source is SdkManagedScreenCaptureSource) { + var track = await lk.LocalVideoTrack.createScreenShareTrack( + lk.ScreenShareCaptureOptions( + // no sourceId → SDK will open the dialog + maxFrameRate: 30, + params: lk.VideoParametersPresets.h1080_169, + )); + + await livekitRoom.localParticipant?.publishVideoTrack(track); + _stateChanged.add(()); + return; + } + if (source is WebrtcAndroidScreencaptureSource) { livekitRoom.localParticipant?.setScreenShareEnabled(true); Log.i("Got android screen capture source!"); @@ -313,6 +326,9 @@ class MatrixLivekitVoipSession implements VoipSession { if (PlatformUtils.isAndroid) { return WebrtcAndroidScreencaptureSource.getCaptureSource(context); } + if (PlatformUtils.isWeb) { + return SdkManagedScreenCaptureSource(); + } return WebrtcScreencaptureSource.showSelectSourcePrompt(context); } From 4a0ddd28a54101bb40b5796c951e9bf8c2599804 Mon Sep 17 00:00:00 2001 From: Jonathan Ma Date: Wed, 18 Feb 2026 14:28:37 -0500 Subject: [PATCH 2/2] simplify --- .../matrix_livekit_voip_session.dart | 19 +++---------------- 1 file changed, 3 insertions(+), 16 deletions(-) diff --git a/commet/lib/client/matrix/components/voip_room/matrix_livekit_voip_session.dart b/commet/lib/client/matrix/components/voip_room/matrix_livekit_voip_session.dart index 7ac3d2ebd..d6d4e57e0 100644 --- a/commet/lib/client/matrix/components/voip_room/matrix_livekit_voip_session.dart +++ b/commet/lib/client/matrix/components/voip_room/matrix_livekit_voip_session.dart @@ -246,19 +246,6 @@ class MatrixLivekitVoipSession implements VoipSession { @override Future setScreenShare(ScreenCaptureSource source) async { - if (source is SdkManagedScreenCaptureSource) { - var track = await lk.LocalVideoTrack.createScreenShareTrack( - lk.ScreenShareCaptureOptions( - // no sourceId → SDK will open the dialog - maxFrameRate: 30, - params: lk.VideoParametersPresets.h1080_169, - )); - - await livekitRoom.localParticipant?.publishVideoTrack(track); - _stateChanged.add(()); - return; - } - if (source is WebrtcAndroidScreencaptureSource) { livekitRoom.localParticipant?.setScreenShareEnabled(true); Log.i("Got android screen capture source!"); @@ -266,11 +253,11 @@ class MatrixLivekitVoipSession implements VoipSession { return; } - final src = (source as WebrtcScreencaptureSource).source; - var track = await lk.LocalVideoTrack.createScreenShareTrack( lk.ScreenShareCaptureOptions( - sourceId: src.id, + sourceId: source is SdkManagedScreenCaptureSource + ? null // don't provide a source id and let the SDK handle pick + : (source as WebrtcScreencaptureSource).source.id, maxFrameRate: 30, params: lk.VideoParametersPresets.h1080_169, ));