diff --git a/Cargo.toml b/Cargo.toml index 8f85f6c..c2b8d3b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -53,6 +53,7 @@ default-features = false [features] share_clipboard = ["clipboard"] +share_selection = ["clipboard"] # Use the primary selection for sharing - linux only alsa_backend = ["librespot-playback/alsa-backend"] pulseaudio_backend = ["librespot-playback/pulseaudio-backend"] rodio_backend = ["librespot-playback/rodio-backend"] diff --git a/src/main.rs b/src/main.rs index 3ac9132..818c7f2 100644 --- a/src/main.rs +++ b/src/main.rs @@ -62,6 +62,7 @@ mod library; mod playable; mod playlist; mod queue; +mod sharing; mod show; mod spotify; mod theme; diff --git a/src/sharing.rs b/src/sharing.rs new file mode 100644 index 0000000..3733be9 --- /dev/null +++ b/src/sharing.rs @@ -0,0 +1,35 @@ +#![cfg(feature = "share_clipboard")] + +#[cfg(not(feature = "share_selection"))] +use clipboard::ClipboardContext; +use clipboard::ClipboardProvider; +#[cfg(feature = "share_selection")] +use clipboard::x11_clipboard::{X11ClipboardContext, Primary}; + +#[cfg(not(feature = "share_selection"))] +pub fn read_share() -> Option { + ClipboardProvider::new() + .and_then(|mut ctx: ClipboardContext| ctx.get_contents()) + .ok() +} + +#[cfg(feature = "share_selection")] +pub fn read_share() -> Option { + ClipboardProvider::new() + .and_then(|mut ctx: X11ClipboardContext| ctx.get_contents()) + .ok() +} + +#[cfg(not(feature = "share_selection"))] +pub fn write_share(url: String) -> Option<()> { + ClipboardProvider::new() + .and_then(|mut ctx: ClipboardContext| ctx.set_contents(url)) + .ok() +} + +#[cfg(feature = "share_selection")] +pub fn write_share(url: String) -> Option<()> { + ClipboardProvider::new() + .and_then(|mut ctx: X11ClipboardContext| ctx.set_contents(url)) + .ok() +} diff --git a/src/ui/contextmenu.rs b/src/ui/contextmenu.rs index 7cead13..6e408a9 100644 --- a/src/ui/contextmenu.rs +++ b/src/ui/contextmenu.rs @@ -8,6 +8,8 @@ use crate::commands::CommandResult; use crate::library::Library; use crate::playable::Playable; use crate::queue::Queue; +#[cfg(feature = "share_clipboard")] +use crate::sharing::write_share; use crate::track::Track; use crate::traits::{ListItem, ViewExt}; use crate::ui::layout::Layout; @@ -17,8 +19,6 @@ use crate::{ playlist::Playlist, spotify::Spotify, }; -#[cfg(feature = "share_clipboard")] -use clipboard::{ClipboardContext, ClipboardProvider}; use cursive::traits::{Finder, Nameable}; pub struct ContextMenu { @@ -145,9 +145,7 @@ impl ContextMenu { } ContextMenuAction::ShareUrl(url) => { #[cfg(feature = "share_clipboard")] - ClipboardProvider::new() - .and_then(|mut ctx: ClipboardContext| ctx.set_contents(url.to_string())) - .ok(); + write_share(url.to_string()); } ContextMenuAction::AddToPlaylist(track) => { let dialog = diff --git a/src/ui/listview.rs b/src/ui/listview.rs index 7286be3..522b633 100644 --- a/src/ui/listview.rs +++ b/src/ui/listview.rs @@ -20,14 +20,14 @@ use crate::library::Library; use crate::playable::Playable; use crate::playlist::Playlist; use crate::queue::Queue; +#[cfg(feature = "share_clipboard")] +use crate::sharing::{read_share, write_share}; use crate::show::Show; use crate::track::Track; use crate::traits::{IntoBoxedViewExt, ListItem, ViewExt}; use crate::ui::album::AlbumView; use crate::ui::artist::ArtistView; use crate::ui::contextmenu::ContextMenu; -#[cfg(feature = "share_clipboard")] -use clipboard::{ClipboardContext, ClipboardProvider}; use regex::Regex; pub type Paginator = Box>>) + Send + Sync>; @@ -497,9 +497,7 @@ impl ViewExt for ListView { if let Some(url) = url { #[cfg(feature = "share_clipboard")] - ClipboardProvider::new() - .and_then(|mut ctx: ClipboardContext| ctx.set_contents(url)) - .ok(); + write_share(url); } return Ok(CommandResult::Consumed(None)); @@ -620,10 +618,7 @@ impl ViewExt for ListView { Command::Insert(url) => { let url = match url.as_ref().map(String::as_str) { #[cfg(feature = "share_clipboard")] - Some("") | None => ClipboardProvider::new() - .and_then(|mut ctx: ClipboardContext| ctx.get_contents()) - .ok() - .unwrap(), + Some("") | None => read_share().unwrap(), Some(url) => url.to_owned(), // do nothing if clipboard feature is disabled and there is no url provided #[allow(unreachable_patterns)]