https://github.com/deftu/copycat
A basic clipboard manager for Java using Rust and JNI.
https://github.com/deftu/copycat
clipboard clipboard-management clipboard-manager java java-jni java-library jni jni-android jni-android-library jni-java rust rust-lang
Last synced: 5 months ago
JSON representation
A basic clipboard manager for Java using Rust and JNI.
- Host: GitHub
- URL: https://github.com/deftu/copycat
- Owner: Deftu
- License: lgpl-3.0
- Created: 2024-07-21T13:16:43.000Z (10 months ago)
- Default Branch: main
- Last Pushed: 2024-11-14T09:17:33.000Z (6 months ago)
- Last Synced: 2024-12-15T07:12:36.661Z (5 months ago)
- Topics: clipboard, clipboard-management, clipboard-manager, java, java-jni, java-library, jni, jni-android, jni-android-library, jni-java, rust, rust-lang
- Language: Java
- Homepage: https://maven.deftu.dev
- Size: 120 KB
- Stars: 1
- Watchers: 1
- Forks: 1
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# Copycat
Basic clipboard access in your Java applications!---
## Usage
### Repository
Groovy (.gradle)
```gradle
maven {
name = "Deftu Releases"
url = "https://maven.deftu.dev/releases"
}
```Kotlin (.gradle.kts)
```kotlin
maven(url = "https://maven.deftu.dev/releases") {
name = "Deftu Releases"
}
```### Dependency

Groovy (.gradle)
```gradle
implementation "dev.deftu:copycat:"
[
"windows-x64",
"windows-x86",
"linux-x64",
"linux-x86",
"linux-arm",
"linux-arm64",
"osx-x64",
"osx-arm64"
].forEach { target ->
runtimeOnly "dev.deftu:copycat-natives-$target:"
}
```Kotlin (.gradle.kts)
```gradle
implementation("dev.deftu:copycat:")
listOf(
"windows-x64",
"windows-x86",
"linux-x64",
"linux-x86",
"linux-arm",
"linux-arm64",
"os-x-x64",
"os-x-arm64"
).forEach { target ->
runtimeOnly("dev.deftu:copycat-natives-$target:")
}
```### Operating system & architecture support
- Windows x64
- Windows x86
- Linux x64
- Linux x86
- Linux ARM (Android)
- Linux ARM64 (Android)
- macOS x64 (Intel)
- macOS ARM64 (Apple Silicon)macOS is not supported at this time due to the inability to build the native library.
### Interacting with the clipboard
A user-facing API is provided via `dev.deftu.clipboard.Clipboard`, pointing to the native methods provided by the native library by default.
```java
import dev.deftu.clipboard.Clipboard;public class Main {
public static void main(String[] args) {
Clipboard clipboard = Clipboard.getInstance();
clipboard.setString("Hello, world!");
System.out.println(clipboard.getString());
}
}
```### Native loading
By default, when a `Clipboard` instance is created, it will make an attempt to load the default native library provided by Copycat. If you'd rather load the natives later, or provide your own, you can do so by marking the native as loaded using `Clipboard#markNativeLoaded()`.
```java
import dev.deftu.clipboard.Clipboard;public class Main {
public static void main(String[] args) {
Clipboard.markNativeLoaded();
Clipboard clipboard = Clipboard.getInstance();
clipboard.setString("Hello, world!"); // Throws an UnsatisfiedLinkError! There are no natives loaded.
System.out.println(clipboard.getString());
}
}
```### Custom natives
If you'd like to provide your own natives, you can do so by using the `Clipboard#loadAndMarkNative(String)` method. Alternatively, you can separately use the `Clipboard#loadNative(String)` method to load the native without marking it as loaded and then use `Clipboard#markNativeLoaded()` to mark it as loaded.
```java
import dev.deftu.clipboard.Clipboard;public class Main {
public static void main(String[] args) {
Clipboard.loadAndMarkNative("path/to/native");
Clipboard clipboard = Clipboard.getInstance();
clipboard.setString("Hello, world!");
System.out.println(clipboard.getString());
}
}
```OR
```java
import dev.deftu.clipboard.Clipboard;public class Main {
public static void main(String[] args) {
Clipboard.loadNative("path/to/native");
Clipboard.markNativeLoaded();
Clipboard clipboard = Clipboard.getInstance();
clipboard.setString("Hello, world!");
System.out.println(clipboard.getString());
}
}
```### Working with images
Copycat provides a way to interact with images on the clipboard. This is done through the `dev.deftu.clipboard.ClipboardImage` class.
```java
import dev.deftu.clipboard.Clipboard;
import dev.deftu.clipboard.ClipboardImage;public class Main {
public static void main(String[] args) {
Clipboard clipboard = Clipboard.getInstance();
ClipboardImage image = clipboard.getImage();
System.out.println(image.getWidth() + "x" + image.getHeight());
}
}
```To keep the library agnostic of image libraries, the image is represented simply as a byte array, width and height.
### AWT BufferedImage support
If you're using AWT's `BufferedImage`, Copycat provides an extension library to convert between `BufferedImage` and `ClipboardImage`.

Groovy (.gradle)
```gradle
implementation "dev.deftu:copycat-image-awt:"
```Kotlin (.gradle.kts)
```gradle
implementation("dev.deftu:copycat-image-awt:")
``````java
import dev.deftu.clipboard.Clipboard;
import dev.deftu.clipboard.ClipboardImage;
import dev.deftu.clipboard.BufferedClipboardImage;import java.awt.image.BufferedImage;
import javax.imageio.ImageIO;public class Main {
public static void main(String[] args) {
Clipboard clipboard = Clipboard.getInstance();
ClipboardImage image = clipboard.getImage();
BufferedImage bufferedImage = BufferedClipboardImage.toBufferedImage(image);
ClipboardImage clipboardImage = BufferedClipboardImage.toClipboardImage(bufferedImage);
System.out.println(bufferedImage.getWidth() + "x" + bufferedImage.getHeight());
try {
ImageIO.write(bufferedImage, "png", new File("image.png"));
} catch (IOException e) {
e.printStackTrace();
}
}
}
```---
**This project is licensed under [LGPL-3.0][lgpl]**\
**© 2024 Deftu**[lgpl]: https://www.gnu.org/licenses/lgpl-3.0.en.html