Skip to content

Commit

Permalink
Add primary clipboard support for X11 and wayland
Browse files Browse the repository at this point in the history
 The X11 code already had the functionality. Just didn't expose it.

Signed-off-by: Mohammad AlSaleh <[email protected]>
  • Loading branch information
MoSal committed Jan 19, 2024
1 parent 40447db commit cb84718
Show file tree
Hide file tree
Showing 4 changed files with 70 additions and 6 deletions.
18 changes: 18 additions & 0 deletions src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -72,8 +72,26 @@ impl Clipboard {
}
}

impl Clipboard {
pub fn read_primary(&self) -> Option<Result<String, Box<dyn Error>>> {
self.raw.read_primary()
}

pub fn write_primary(&mut self, contents: String) -> Option<Result<(), Box<dyn Error>>> {
self.raw.write_primary(contents)
}
}

pub trait ClipboardProvider {
fn read(&self) -> Result<String, Box<dyn Error>>;

fn write(&mut self, contents: String) -> Result<(), Box<dyn Error>>;

fn read_primary(&self) -> Option<Result<String, Box<dyn Error>>> {
None
}

fn write_primary(&mut self, _contents: String) -> Option<Result<(), Box<dyn Error>>> {
None
}
}
16 changes: 16 additions & 0 deletions src/platform/linux.rs
Original file line number Diff line number Diff line change
Expand Up @@ -24,17 +24,33 @@ impl ClipboardProvider for wayland::Clipboard {
self.read()
}

fn read_primary(&self) -> Option<Result<String, Box<dyn Error>>> {
Some(self.read_primary())
}

fn write(&mut self, contents: String) -> Result<(), Box<dyn Error>> {
self.write(contents)
}

fn write_primary(&mut self, contents: String) -> Option<Result<(), Box<dyn Error>>> {
Some(self.write_primary(contents))
}
}

impl ClipboardProvider for x11::Clipboard {
fn read(&self) -> Result<String, Box<dyn Error>> {
self.read().map_err(Box::from)
}

fn read_primary(&self) -> Option<Result<String, Box<dyn Error>>> {
Some(self.read_primary().map_err(Box::from))
}

fn write(&mut self, contents: String) -> Result<(), Box<dyn Error>> {
self.write(contents).map_err(Box::from)
}

fn write_primary(&mut self, contents: String) -> Option<Result<(), Box<dyn Error>>> {
Some(self.write_primary(contents).map_err(Box::from))
}
}
10 changes: 10 additions & 0 deletions wayland/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -33,9 +33,19 @@ impl Clipboard {
Ok(self.context.lock().unwrap().load()?)
}

pub fn read_primary(&self) -> Result<String, Box<dyn Error>> {
Ok(self.context.lock().unwrap().load_primary()?)
}

pub fn write(&mut self, data: String) -> Result<(), Box<dyn Error>> {
self.context.lock().unwrap().store(data);

Ok(())
}

pub fn write_primary(&mut self, data: String) -> Result<(), Box<dyn Error>> {
self.context.lock().unwrap().store_primary(data);

Ok(())
}
}
32 changes: 26 additions & 6 deletions x11/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -45,20 +45,28 @@ impl Clipboard {
})
}

/// Read the current [`Clipboard`] value.
pub fn read(&self) -> Result<String, Error> {
fn read_selection(&self, selection: Atom) -> Result<String, Error> {
Ok(String::from_utf8(self.load(
self.reader.atoms.clipboard,
selection,
self.reader.atoms.utf8_string,
self.reader.atoms.property,
std::time::Duration::from_secs(3),
)?)
.map_err(Error::InvalidUtf8)?)
}

/// Write a new value to the [`Clipboard`].
pub fn write(&mut self, contents: String) -> Result<(), Error> {
let selection = self.writer.atoms.clipboard;
/// Read the current CLIPBOARD [`Clipboard`] value.
pub fn read(&self) -> Result<String, Error> {
self.read_selection(self.reader.atoms.clipboard)
}


/// Read the current PRIMARY [`Clipboard`] value.
pub fn read_primary(&self) -> Result<String, Error> {
self.read_selection(self.reader.atoms.primary)
}

fn write_selection(&mut self, selection: Atom, contents: String) -> Result<(), Error> {
let target = self.writer.atoms.utf8_string;

self.selections
Expand Down Expand Up @@ -87,6 +95,18 @@ impl Clipboard {
}
}

/// Write a new value to the CLIPBOARD [`Clipboard`].
pub fn write(&mut self, contents: String) -> Result<(), Error> {
let selection = self.writer.atoms.clipboard;
self.write_selection(selection, contents)
}

/// Write a new value to the PRIMARY [`Clipboard`].
pub fn write_primary(&mut self, contents: String) -> Result<(), Error> {
let selection = self.writer.atoms.primary;
self.write_selection(selection, contents)
}

/// load value.
fn load(
&self,
Expand Down

0 comments on commit cb84718

Please sign in to comment.