aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorhannibal2 <24389977+hannibal002@users.noreply.github.com>2023-08-10 17:44:07 +0200
committerGitHub <noreply@github.com>2023-08-10 17:44:07 +0200
commit9e474fb8fe76b02960b3743e31015018e8666b7f (patch)
tree8ee8f90e00ccdca3471847e0810ae4c91d57ce5d /src
parent4d70a91399a6c1724097ef562d5210d2d1ae097a (diff)
downloadskyhanni-9e474fb8fe76b02960b3743e31015018e8666b7f.tar.gz
skyhanni-9e474fb8fe76b02960b3743e31015018e8666b7f.tar.bz2
skyhanni-9e474fb8fe76b02960b3743e31015018e8666b7f.zip
Better Clipboard (#378)
Co-authored-by: hannibal2 <24389977+hannibal00212@users.noreply.github.com>
Diffstat (limited to 'src')
-rw-r--r--src/main/java/at/hannibal2/skyhanni/features/misc/PasteIntoSigns.kt8
-rw-r--r--src/main/java/at/hannibal2/skyhanni/test/SkyHanniConfigSearchResetCommand.kt9
-rw-r--r--src/main/java/at/hannibal2/skyhanni/test/SkyHanniTestCommand.kt6
-rw-r--r--src/main/java/at/hannibal2/skyhanni/utils/ClipboardUtils.kt83
-rw-r--r--src/main/java/at/hannibal2/skyhanni/utils/OSUtils.kt21
5 files changed, 103 insertions, 24 deletions
diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/PasteIntoSigns.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/PasteIntoSigns.kt
index e6f118a15..ba797ff74 100644
--- a/src/main/java/at/hannibal2/skyhanni/features/misc/PasteIntoSigns.kt
+++ b/src/main/java/at/hannibal2/skyhanni/features/misc/PasteIntoSigns.kt
@@ -4,6 +4,7 @@ import at.hannibal2.skyhanni.SkyHanniMod
import at.hannibal2.skyhanni.events.LorenzTickEvent
import at.hannibal2.skyhanni.utils.LorenzUtils
import at.hannibal2.skyhanni.utils.OSUtils
+import kotlinx.coroutines.launch
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent
import org.lwjgl.input.Keyboard
@@ -15,8 +16,11 @@ class PasteIntoSigns {
if (!SkyHanniMod.feature.misc.pasteIntoSigns) return
if (LorenzUtils.isControlKeyDown() && Keyboard.isKeyDown(Keyboard.KEY_V)) {
- val clipboard = OSUtils.readFromClipboard() ?: return
- LorenzUtils.setTextIntoSign(clipboard.take(15))
+ SkyHanniMod.coroutineScope.launch {
+ OSUtils.readFromClipboard()?.let {
+ LorenzUtils.setTextIntoSign(it.take(15))
+ }
+ }
}
}
} \ No newline at end of file
diff --git a/src/main/java/at/hannibal2/skyhanni/test/SkyHanniConfigSearchResetCommand.kt b/src/main/java/at/hannibal2/skyhanni/test/SkyHanniConfigSearchResetCommand.kt
index 5d36cdb90..fbdb21257 100644
--- a/src/main/java/at/hannibal2/skyhanni/test/SkyHanniConfigSearchResetCommand.kt
+++ b/src/main/java/at/hannibal2/skyhanni/test/SkyHanniConfigSearchResetCommand.kt
@@ -12,6 +12,7 @@ import at.hannibal2.skyhanni.utils.NumberUtil.addSeparators
import at.hannibal2.skyhanni.utils.OSUtils
import com.google.gson.JsonElement
import io.github.moulberry.notenoughupdates.util.Shimmy
+import kotlinx.coroutines.launch
import java.lang.reflect.Field
import java.lang.reflect.Modifier
@@ -20,11 +21,13 @@ object SkyHanniConfigSearchResetCommand {
private var lastCommand = emptyArray<String>()
fun command(args: Array<String>) {
- LorenzUtils.chat(runCommand(args))
+ SkyHanniMod.coroutineScope.launch {
+ LorenzUtils.chat(runCommand(args))
+ }
lastCommand = args
}
- private fun runCommand(args: Array<String>): String {
+ private suspend fun runCommand(args: Array<String>): String {
if (args.isEmpty()) {
return "§c[SkyHanni] This is a powerful config-edit command, only use it if you know what you are doing!"
}
@@ -71,7 +74,7 @@ object SkyHanniConfigSearchResetCommand {
}
}
- private fun setCommand(args: Array<String>): String {
+ private suspend fun setCommand(args: Array<String>): String {
if (args.size < 3) return "§c/shconfig set <config name> <json element>"
val term = args[1]
var rawJson = args.drop(2).joinToString(" ")
diff --git a/src/main/java/at/hannibal2/skyhanni/test/SkyHanniTestCommand.kt b/src/main/java/at/hannibal2/skyhanni/test/SkyHanniTestCommand.kt
index a3ddcafd0..2cfb5ae94 100644
--- a/src/main/java/at/hannibal2/skyhanni/test/SkyHanniTestCommand.kt
+++ b/src/main/java/at/hannibal2/skyhanni/test/SkyHanniTestCommand.kt
@@ -45,6 +45,12 @@ class SkyHanniTestCommand {
fun testCommand(args: Array<String>) {
SoundUtils.playBeepSound()
+ val a = Thread { OSUtils.copyToClipboard("123") }
+ val b = Thread { OSUtils.copyToClipboard("456") }
+ a.start()
+ b.start()
+
+
// for ((i, s) in ScoreboardData.siedebarLinesFormatted().withIndex()) {
// println("$i: '$s'")
// }
diff --git a/src/main/java/at/hannibal2/skyhanni/utils/ClipboardUtils.kt b/src/main/java/at/hannibal2/skyhanni/utils/ClipboardUtils.kt
new file mode 100644
index 000000000..a7585702f
--- /dev/null
+++ b/src/main/java/at/hannibal2/skyhanni/utils/ClipboardUtils.kt
@@ -0,0 +1,83 @@
+package at.hannibal2.skyhanni.utils
+
+import at.hannibal2.skyhanni.SkyHanniMod
+import at.hannibal2.skyhanni.test.command.CopyErrorCommand
+import kotlinx.coroutines.CompletableDeferred
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.launch
+import kotlinx.coroutines.withContext
+import java.awt.Toolkit
+import java.awt.datatransfer.Clipboard
+import java.awt.datatransfer.DataFlavor
+import java.awt.datatransfer.StringSelection
+import java.awt.datatransfer.UnsupportedFlavorException
+import java.util.*
+import kotlin.time.Duration
+import kotlin.time.Duration.Companion.milliseconds
+
+object ClipboardUtils {
+ private var lastClipboardAccessTime = SimpleTimeMark.farPast()
+
+ private fun canAccessClibpard(): Boolean {
+ val result = lastClipboardAccessTime.passedSince() > 10.milliseconds
+ if (result) {
+ lastClipboardAccessTime = SimpleTimeMark.now()
+ }
+ return result
+ }
+
+ private fun runDelayed(duration: Duration, runnable: () -> Unit) {
+ Timer().schedule(object : TimerTask() {
+ override fun run() {
+ runnable()
+ }
+ }, duration.inWholeMilliseconds)
+ }
+
+ private suspend fun getClipboard(): Clipboard? {
+ val deferred = CompletableDeferred<Clipboard?>()
+ if (canAccessClibpard()) {
+ deferred.complete(Toolkit.getDefaultToolkit().systemClipboard)
+ } else {
+ runDelayed(5.milliseconds) {
+ SkyHanniMod.coroutineScope.launch {
+ deferred.complete(getClipboard())
+ }
+ }
+ }
+ return deferred.await()
+ }
+
+ fun copyToClipboard(text: String, step: Int = 0) {
+ SkyHanniMod.coroutineScope.launch {
+ try {
+ getClipboard()?.setContents(StringSelection(text), null)
+ } catch (e: Exception) {
+ if (step == 3) {
+ CopyErrorCommand.logError(e, "Error while trying to access the clipboard.")
+ } else {
+ copyToClipboard(text, step + 1)
+ }
+ }
+ }
+ }
+
+ suspend fun readFromClipboard(step: Int = 0): String? {
+ try {
+ return try {
+ withContext(Dispatchers.IO) {
+ getClipboard()?.getData(DataFlavor.stringFlavor)?.toString()
+ }
+ } catch (e: UnsupportedFlavorException) {
+ null
+ }
+ } catch (e: Exception) {
+ return if (step == 3) {
+ CopyErrorCommand.logError(e, "Error while trying to access the clipboard.")
+ null
+ } else {
+ readFromClipboard(step + 1)
+ }
+ }
+ }
+} \ No newline at end of file
diff --git a/src/main/java/at/hannibal2/skyhanni/utils/OSUtils.kt b/src/main/java/at/hannibal2/skyhanni/utils/OSUtils.kt
index 9c56d142f..254d8ad09 100644
--- a/src/main/java/at/hannibal2/skyhanni/utils/OSUtils.kt
+++ b/src/main/java/at/hannibal2/skyhanni/utils/OSUtils.kt
@@ -1,13 +1,8 @@
package at.hannibal2.skyhanni.utils
-import at.hannibal2.skyhanni.test.command.CopyErrorCommand
import net.minecraft.client.settings.KeyBinding
import org.lwjgl.input.Keyboard
import java.awt.Desktop
-import java.awt.Toolkit
-import java.awt.datatransfer.DataFlavor
-import java.awt.datatransfer.StringSelection
-import java.awt.datatransfer.UnsupportedFlavorException
import java.io.IOException
import java.net.URI
@@ -29,22 +24,10 @@ object OSUtils {
}
fun copyToClipboard(text: String) {
- try {
- Toolkit.getDefaultToolkit().systemClipboard.setContents(StringSelection(text), null)
- } catch (e: Exception) {
- CopyErrorCommand.logError(e, "Error while trying to set clipboard content.")
- }
+ ClipboardUtils.copyToClipboard(text)
}
- fun readFromClipboard(): String? {
- val systemClipboard = Toolkit.getDefaultToolkit().systemClipboard ?: return null
- try {
- val data = systemClipboard.getData(DataFlavor.stringFlavor) ?: return null
- return data.toString()
- } catch (e: UnsupportedFlavorException) {
- return null
- }
- }
+ suspend fun readFromClipboard() = ClipboardUtils.readFromClipboard()
fun KeyBinding.isActive(): Boolean {
if (!Keyboard.isCreated()) return false