diff options
-rw-r--r-- | BUILDING.txt | 21 | ||||
-rw-r--r-- | java/com/tigervnc/vncviewer/ClipboardDialog.java | 122 | ||||
-rw-r--r-- | java/com/tigervnc/vncviewer/DesktopWindow.java | 32 |
3 files changed, 104 insertions, 71 deletions
diff --git a/BUILDING.txt b/BUILDING.txt index 8f686cc3..41f493e9 100644 --- a/BUILDING.txt +++ b/BUILDING.txt @@ -15,6 +15,7 @@ Build Requirements (All Systems) -- If building TLS support: * GnuTLS + * See "Building TLS Support" below. -- If building native language support (NLS): * Gnu gettext 0.14.4 or later @@ -322,6 +323,26 @@ or ":file " (see the jarsigner documentation for more info): ====================================== +Building TLS Support +====================================== + +TLS requires GnuTLS, which is supplied with most Linux distributions and +with MinGW for Windows and can be built from source on OS X and other +Unix variants. However, GnuTLS versions > 2.12.x && < 3.3.x should be +avoided because of potential incompatibilities during initial handshaking. + +You can override the GNUTLS_LIBRARY and GNUTLS_INCLUDE_DIR CMake variables +to specify the locations of libgnutls and any dependencies. For instance, +adding + + -DGNUTLS_INCLUDE_DIR=/usr/local/include \ + -DGNUTLS_LIBRARY=/usr/local/lib/libgnutls.a + +to the CMake command line would link TigerVNC against a static version of +libgnutls located under /usr/local. + + +====================================== Building Native Language Support (NLS) ====================================== diff --git a/java/com/tigervnc/vncviewer/ClipboardDialog.java b/java/com/tigervnc/vncviewer/ClipboardDialog.java index d4cde6e1..fff7dc3e 100644 --- a/java/com/tigervnc/vncviewer/ClipboardDialog.java +++ b/java/com/tigervnc/vncviewer/ClipboardDialog.java @@ -1,5 +1,5 @@ /* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * Copyright (C) 2011 Brian P. Hinz + * Copyright (C) 2011-2014 Brian P. Hinz * * This is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -21,27 +21,83 @@ package com.tigervnc.vncviewer; import java.awt.*; import java.awt.event.*; -import java.awt.datatransfer.Clipboard; -import java.awt.datatransfer.StringSelection; +import java.awt.datatransfer.*; +import java.io.*; +import java.nio.*; import javax.swing.*; import javax.swing.border.*; +import javax.swing.text.*; + import com.tigervnc.rfb.LogWriter; class ClipboardDialog extends Dialog implements ActionListener { + private class VncTransferHandler extends TransferHandler { + // Custom TransferHandler designed to limit the size of outbound + // clipboard transfers to VncViewer.maxCutText.getValue() bytes. + private LogWriter vlog = new LogWriter("VncTransferHandler"); + + public boolean importData(JComponent c, Transferable t) { + if (canImport(c, t.getTransferDataFlavors())) { + try { + DataFlavor VncFlavor = null; + for (DataFlavor f : t.getTransferDataFlavors()) + if (f.isFlavorTextType() && f.isRepresentationClassInputStream()) + VncFlavor = f; + if (VncFlavor == null) return false; + Reader reader = (Reader)VncFlavor.getReaderForText(t); + CharBuffer cbuf = + CharBuffer.allocate(VncViewer.maxCutText.getValue()); + cbuf.limit(reader.read(cbuf.array(), 0, cbuf.length())); + reader.close(); + if (c instanceof JTextComponent) + ((JTextComponent)c).setText(cbuf.toString()); + return true; + } catch (OutOfMemoryError oome) { + vlog.error("ERROR: Too much data on local clipboard!"); + } catch (UnsupportedFlavorException ufe) { + // Skip import + vlog.info(ufe.toString()); + } catch (IOException ioe) { + // Skip import + vlog.info(ioe.toString()); + } + } + return false; + } + + public boolean canImport(JComponent c, DataFlavor[] flavors) { + for (DataFlavor f : flavors) + if (f.isFlavorTextType() && f.isRepresentationClassReader()) + return true; + return false; + } + } + public ClipboardDialog(CConn cc_) { super(false); + setTitle("VNC Clipboard Viewer"); + setPreferredSize(new Dimension(640, 480)); + addWindowFocusListener(new WindowAdapter() { + // Necessary to ensure that updates from the system clipboard + // still occur when the ClipboardDialog has the focus. + public void WindowGainedFocus(WindowEvent e) { + clientCutText(); + } + }); cc = cc_; - setTitle("VNC clipboard"); - JPanel pt = new JPanel(); - textArea = new JTextArea(5,50); - textArea.setBorder(BorderFactory.createLineBorder(Color.gray)); - textArea.setLineWrap(true); + textArea = new JTextArea(); + textArea.setTransferHandler(new VncTransferHandler()); + // If the textArea can receive the focus, then text within the textArea + // can be selected. On platforms that don't support separate selection + // and clipboard buffers, this triggers a replacement of the textAra's + // contents with the selected text. + textArea.setFocusable(false); + textArea.setLineWrap(false); textArea.setWrapStyleWord(true); JScrollPane sp = new JScrollPane(textArea); - pt.add(sp, BorderLayout.CENTER); - getContentPane().add("North", pt); - + getContentPane().add(sp, BorderLayout.CENTER); + // button panel placed below the scrollpane JPanel pb = new JPanel(); clearButton = new JButton("Clear"); pb.add(clearButton); @@ -53,40 +109,24 @@ class ClipboardDialog extends Dialog implements ActionListener { pb.add(cancelButton); cancelButton.addActionListener(this); getContentPane().add("South", pb); - pack(); } - public boolean compareContentsTo(String str) { - return str.equals(textArea.getText()); - - } - - public void setContents(String str) { + public void serverCutText(String str, int len) { textArea.setText(str); + textArea.selectAll(); + textArea.copy(); } - public String getContents() { - return textArea.getText(); - } - - public void serverCutText(String str, int len) { - setContents(str); - SecurityManager sm = System.getSecurityManager(); - try { - if (sm != null) sm.checkSystemClipboardAccess(); - Clipboard cb = Toolkit.getDefaultToolkit().getSystemClipboard(); - if (cb != null) { - StringSelection ss = new StringSelection(str); - try { - cb.setContents(ss, null); - } catch(Exception e) { - vlog.debug(e.getMessage()); - } - } - } catch(SecurityException e) { - vlog.debug("Cannot access the system clipboard: "+e.getMessage()); - } + public void clientCutText() { + int hc = textArea.getText().hashCode(); + textArea.setText(""); + textArea.paste(); + textArea.setCaretPosition(0); + String text = textArea.getText(); + if (cc.viewer.sendClipboard.getValue()) + if (hc != text.hashCode()) + cc.writeClientCutText(text, text.length()); } public void setSendingEnabled(boolean b) { @@ -98,7 +138,9 @@ class ClipboardDialog extends Dialog implements ActionListener { if (s instanceof JButton && (JButton)s == clearButton) { serverCutText(new String(""), 0); } else if (s instanceof JButton && (JButton)s == sendButton) { - cc.writeClientCutText(textArea.getText(), textArea.getText().length()); + String text = textArea.getText(); + if (cc.viewer.sendClipboard.getValue()) + cc.writeClientCutText(text, text.length()); endDialog(); } else if (s instanceof JButton && (JButton)s == cancelButton) { endDialog(); diff --git a/java/com/tigervnc/vncviewer/DesktopWindow.java b/java/com/tigervnc/vncviewer/DesktopWindow.java index e78ee277..10d158c4 100644 --- a/java/com/tigervnc/vncviewer/DesktopWindow.java +++ b/java/com/tigervnc/vncviewer/DesktopWindow.java @@ -85,7 +85,7 @@ class DesktopWindow extends JPanel implements Runnable, MouseListener, addKeyListener(this); addFocusListener(new FocusAdapter() { public void focusGained(FocusEvent e) { - checkClipboard(); + cc.clipboardDialog.clientCutText(); } public void focusLost(FocusEvent e) { cc.releaseDownKeys(); @@ -359,36 +359,6 @@ class DesktopWindow extends JPanel implements Runnable, MouseListener, g2.dispose(); } - public synchronized void checkClipboard() { - SecurityManager sm = System.getSecurityManager(); - try { - if (sm != null) sm.checkSystemClipboardAccess(); - Clipboard cb = Toolkit.getDefaultToolkit().getSystemClipboard(); - if (cb != null) { - Transferable t = cb.getContents(null); - if (t == null) return; - DataFlavor flavor = - DataFlavor.selectBestTextFlavor(t.getTransferDataFlavors()); - if (flavor == null) return; - BufferedReader br = new BufferedReader(flavor.getReaderForText(t)); - CharBuffer cbuf = - CharBuffer.allocate(VncViewer.maxCutText.getValue()); - br.read(cbuf); - cbuf.flip(); - String newContents = cbuf.toString(); - if (!cc.clipboardDialog.compareContentsTo(newContents)) { - cc.clipboardDialog.setContents(newContents); - if (cc.viewer.sendClipboard.getValue()) - cc.writeClientCutText(newContents, newContents.length()); - } - br.close(); - System.gc(); - } - } catch(java.lang.Exception e) { - vlog.debug("Exception getting clipboard data: " + e.getMessage()); - } - } - // Mouse-Motion callback function private void mouseMotionCB(MouseEvent e) { if (!cc.viewer.viewOnly.getValue() && |