diff --git a/apps/multiplatform/common/src/desktopMain/kotlin/chat/simplex/common/platform/PlatformTextField.desktop.kt b/apps/multiplatform/common/src/desktopMain/kotlin/chat/simplex/common/platform/PlatformTextField.desktop.kt index c677edc06..74df6b825 100644 --- a/apps/multiplatform/common/src/desktopMain/kotlin/chat/simplex/common/platform/PlatformTextField.desktop.kt +++ b/apps/multiplatform/common/src/desktopMain/kotlin/chat/simplex/common/platform/PlatformTextField.desktop.kt @@ -22,12 +22,21 @@ import androidx.compose.ui.text.input.TextFieldValue import androidx.compose.ui.unit.LayoutDirection import androidx.compose.ui.unit.dp import chat.simplex.common.views.chat.* -import chat.simplex.common.views.helpers.generalGetString +import chat.simplex.common.views.helpers.* import chat.simplex.res.MR import dev.icerock.moko.resources.StringResource import kotlinx.coroutines.delay +import java.awt.Image +import java.awt.Toolkit +import java.awt.datatransfer.DataFlavor +import java.awt.datatransfer.UnsupportedFlavorException +import java.awt.image.BufferedImage +import java.io.ByteArrayOutputStream import java.io.File import java.net.URI +import java.util.* +import javax.imageio.ImageIO +import kotlin.collections.ArrayList import kotlin.io.path.* import kotlin.math.min import kotlin.text.substring @@ -112,12 +121,45 @@ actual fun PlatformTextField( onUpArrow() true } else if (it.key == Key.V && - it.type == KeyEventType.KeyDown && - ((it.isCtrlPressed && !desktopPlatform.isMac()) || (it.isMetaPressed && desktopPlatform.isMac())) && - parseToFiles(clipboard.getText()).isNotEmpty()) { - onFilesPasted(parseToFiles(clipboard.getText())) - true - } + it.type == KeyEventType.KeyDown && + ((it.isCtrlPressed && !desktopPlatform.isMac()) || (it.isMetaPressed && desktopPlatform.isMac()))) { + if (parseToFiles(clipboard.getText()).isNotEmpty()) { + onFilesPasted(parseToFiles(clipboard.getText())) + true + } else { + // It's much faster to getData instead of getting transferable first + val image = try { + Toolkit.getDefaultToolkit().systemClipboard.getData(DataFlavor.imageFlavor) as Image + } catch (e: UnsupportedFlavorException) { + null + } + if (image != null) { + try { + // create BufferedImage from Image + val bi = BufferedImage(image.getWidth(null), image.getHeight(null), BufferedImage.TYPE_INT_ARGB) + val bgr = bi.createGraphics() + bgr.drawImage(image, 0, 0, null) + bgr.dispose() + // create byte array from BufferedImage + val baos = ByteArrayOutputStream() + ImageIO.write(bi, "png", baos) + val bytes = baos.toByteArray() + withBGApi { + val tempFile = File(tmpDir, "${UUID.randomUUID()}.png") + chatModel.filesToDelete.add(tempFile) + + tempFile.writeBytes(bytes) + composeState.processPickedMedia(listOf(tempFile.toURI()), composeState.value.message) + } + } catch (e: Exception) { + Log.e(TAG, "Pasting image exception: ${e.stackTraceToString()}") + } + true + } else { + false + } + } + } else false }, cursorBrush = SolidColor(MaterialTheme.colors.secondary),