Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions desktop/src-tauri/Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 4 additions & 0 deletions desktop/src-tauri/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,10 @@ ctrlc = { version = "3", features = ["termination"] }

[target.'cfg(target_os = "linux")'.dependencies]
keyring = { version = "3.6.3", default-features = false, features = ["sync-secret-service", "vendored"], optional = true }
# Same version tauri links. Needed to reach the native WebKitGTK webview and
# approve UserMedia permission requests — WebKitGTK denies unhandled requests,
# which made getUserMedia() (huddle mic) always fail on Linux.
webkit2gtk = "2.0"
# Used directly (alongside tauri-plugin-notification) so we can hold the posting
# D-Bus connection open. GNOME 46+ dismisses a notification the moment that
# connection is dropped, which the plugin does immediately. Default features
Expand Down
36 changes: 36 additions & 0 deletions desktop/src-tauri/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -186,6 +186,42 @@ pub fn run() {
.with_state_flags(StateFlags::all() & !StateFlags::VISIBLE)
.build(),
)
.plugin(
tauri::plugin::Builder::<_, ()>::new("linux-media-permissions")
.on_webview_ready(|webview| {
// WebKitGTK denies any permission request the embedder
// doesn't handle, so without this getUserMedia() always
// fails on Linux — the huddle mic never connects and the
// huddle tears itself down right after starting. Allow
// media-device requests; everything else keeps the
// default deny.
#[cfg(target_os = "linux")]
{
use webkit2gtk::glib::prelude::*;
use webkit2gtk::{PermissionRequestExt, WebViewExt};

let _ = webview.with_webview(|platform_webview| {
platform_webview.inner().connect_permission_request(
|_, request| {
if request
.is::<webkit2gtk::UserMediaPermissionRequest>()
|| request
.is::<webkit2gtk::DeviceInfoPermissionRequest>()
{
request.allow();
true
} else {
false
}
},
);
});
}
#[cfg(not(target_os = "linux"))]
let _ = &webview;
})
.build(),
)
.plugin(
tauri::plugin::Builder::<_, ()>::new("initial-window-reveal")
.on_webview_ready(|webview| {
Expand Down