diff --git a/src/main/java/me/goudham/WindowsOrUnixClipboardListener.java b/src/main/java/me/goudham/WindowsOrUnixClipboardListener.java index 5af8d59..091c2ac 100644 --- a/src/main/java/me/goudham/WindowsOrUnixClipboardListener.java +++ b/src/main/java/me/goudham/WindowsOrUnixClipboardListener.java @@ -1,5 +1,6 @@ package me.goudham; +import java.awt.Dimension; import java.awt.Image; import java.awt.datatransfer.Clipboard; import java.awt.datatransfer.ClipboardOwner; @@ -53,21 +54,36 @@ class WindowsOrUnixClipboardListener extends ClipboardListener implements Runnab if (isTextMonitored()) { if (TEXT.isAvailable(oldClipboard) && !FILELIST.isAvailable(oldClipboard)) { String stringContent = getStringContent(newClipboardContents); - getEventManager().notifyTextEvent(oldClipboardContent, stringContent); + if (!stringContent.equals(oldClipboardContent.getOldText())) { + getEventManager().notifyTextEvent(oldClipboardContent, stringContent); + } } } if (isImageMonitored()) { if (IMAGE.isAvailable(oldClipboard)) { BufferedImage bufferedImage = getImageContent(newClipboardContents); - getEventManager().notifyImageEvent(oldClipboardContent, bufferedImage); + BufferedImage oldBufferedImage = oldClipboardContent.getOldImage(); + if (bufferedImage != oldBufferedImage) { + if (oldBufferedImage != null) { + Dimension imageDimension = new Dimension(bufferedImage.getWidth(), bufferedImage.getHeight()); + Dimension oldImageDimension = new Dimension(oldBufferedImage.getWidth(), oldBufferedImage.getHeight()); + if (!imageDimension.equals(oldImageDimension)) { + getEventManager().notifyImageEvent(oldClipboardContent, bufferedImage); + } + } else { + getEventManager().notifyImageEvent(oldClipboardContent, bufferedImage); + } + } } } if (isFileMonitored()) { if (FILELIST.isAvailable(oldClipboard)) { List fileList = getFileContent(newClipboardContents); - getEventManager().notifyFilesEvent(oldClipboardContent, fileList); + if (!fileList.equals(oldClipboardContent.getOldFiles())) { + getEventManager().notifyFilesEvent(oldClipboardContent, fileList); + } } } } @@ -108,7 +124,12 @@ class WindowsOrUnixClipboardListener extends ClipboardListener implements Runnab ie.printStackTrace(); } - clipboard.setContents(new StringSelection(stringContent), this); + try { + clipboard.setContents(new StringSelection(stringContent), this); + } catch (IllegalStateException ise) { + ise.printStackTrace(); + executorService.submit(this); + } } @Override @@ -119,7 +140,12 @@ class WindowsOrUnixClipboardListener extends ClipboardListener implements Runnab ie.printStackTrace(); } - clipboard.setContents(new TransferableImage(imageContent), this); + try { + clipboard.setContents(new TransferableImage(imageContent), this); + } catch (IllegalStateException ise) { + ise.printStackTrace(); + executorService.submit(this); + } } @Override @@ -130,32 +156,39 @@ class WindowsOrUnixClipboardListener extends ClipboardListener implements Runnab ie.printStackTrace(); } - clipboard.setContents(new TransferableFileList(fileContent), this); + try { + clipboard.setContents(new TransferableFileList(fileContent), this); + } catch (IllegalStateException ise) { + ise.printStackTrace(); + executorService.submit(this); + } } @Override void insertAndNotify(String stringContent) { + Transferable currentClipboardContents = clipboard.getContents(this); insert(stringContent); - run(); + lostOwnership(clipboard, currentClipboardContents); } @Override void insertAndNotify(Image imageContent) { + Transferable currentClipboardContents = clipboard.getContents(this); insert(imageContent); - run(); + lostOwnership(clipboard, currentClipboardContents); } @Override void insertAndNotify(List fileContent) { + Transferable currentClipboardContents = clipboard.getContents(this); insert(fileContent); - run(); + lostOwnership(clipboard, currentClipboardContents); } @Override public void run() { try { Transferable currentClipboardContents = clipboard.getContents(null); - processContents(clipboard, currentClipboardContents, currentClipboardContents); regainOwnership(clipboard, currentClipboardContents); } catch (IllegalStateException err) { err.printStackTrace();