Revision: 4432
          http://tigervnc.svn.sourceforge.net/tigervnc/?rev=4432&view=rev
Author:   ossman_
Date:     2011-05-19 14:49:18 +0000 (Thu, 19 May 2011)

Log Message:
-----------
Implement support for sending the local clipboard to the server.

Modified Paths:
--------------
    trunk/CMakeLists.txt
    trunk/config.h.cmake.in
    trunk/vncviewer/Viewport.cxx
    trunk/vncviewer/Viewport.h

Modified: trunk/CMakeLists.txt
===================================================================
--- trunk/CMakeLists.txt        2011-05-19 14:47:43 UTC (rev 4431)
+++ trunk/CMakeLists.txt        2011-05-19 14:49:18 UTC (rev 4432)
@@ -177,10 +177,20 @@
   set(FLTK_SKIP_OPENGL TRUE)
   find_package(FLTK COMPONENTS REQUIRED)
 
-  # FLTK STR #2599
+  # No proper handling for extra X11 libs that FLTK might need...
+  if(X11_Xfixes_FOUND)
+    set(FLTK_LIBRARIES ${FLTK_LIBRARIES} ${X11_Xfixes_LIB})
+  endif()
+
   set(CMAKE_REQUIRED_INCLUDES ${FLTK_INCLUDE_DIR})
   set(CMAKE_REQUIRED_LIBRARIES ${FLTK_LIBRARIES})
+
+  # FLTK STR #2599
   check_cxx_source_compiles("#include <FL/Fl_Widget.H>\nint main(int c, char** 
v) { void *foo = (void*)&Fl_Widget::set_simple_keyboard; return 0; }" 
HAVE_FLTK_DEAD_KEYS)
+
+  # FLTK STR #2636
+  check_cxx_source_compiles("#include <FL/Fl.H>\nint main(int c, char** v) { 
Fl::add_clipboard_notify(NULL, NULL); return 0; }" HAVE_FLTK_CLIPBOARD)
+
   set(CMAKE_REQUIRED_INCLUDES)
   set(CMAKE_REQUIRED_LIBRARIES)
 endif()

Modified: trunk/config.h.cmake.in
===================================================================
--- trunk/config.h.cmake.in     2011-05-19 14:47:43 UTC (rev 4431)
+++ trunk/config.h.cmake.in     2011-05-19 14:49:18 UTC (rev 4432)
@@ -12,6 +12,7 @@
 #cmakedefine HAVE_GNUTLS_PK_ALGORITHM_T
 #cmakedefine HAVE_GNUTLS_SIGN_ALGORITHM_T
 #cmakedefine HAVE_FLTK_DEAD_KEYS
+#cmakedefine HAVE_FLTK_CLIPBOARD
 #cmakedefine ENABLE_NLS 1
 
 /* MS Visual Studio 2008 and newer doesn't know ssize_t */

Modified: trunk/vncviewer/Viewport.cxx
===================================================================
--- trunk/vncviewer/Viewport.cxx        2011-05-19 14:47:43 UTC (rev 4431)
+++ trunk/vncviewer/Viewport.cxx        2011-05-19 14:49:18 UTC (rev 4432)
@@ -66,6 +66,11 @@
   set_simple_keyboard();
 #endif
 
+// FLTK STR #2636 gives us the ability to monitor clipboard changes
+#ifdef HAVE_FLTK_CLIPBOARD
+  Fl::add_clipboard_notify(handleClipboardChange, this);
+#endif
+
   frameBuffer = new ManagedPixelBuffer(getPreferredPF(), w, h);
   assert(frameBuffer);
 
@@ -84,6 +89,10 @@
   Fl::remove_timeout(handleColourMap, this);
   Fl::remove_timeout(handlePointerTimeout, this);
 
+#ifdef HAVE_FLTK_CLIPBOARD
+  Fl::remove_clipboard_notify(handleClipboardChange);
+#endif
+
   delete frameBuffer;
 
   if (pixelTrans)
@@ -172,10 +181,22 @@
 
 int Viewport::handle(int event)
 {
+  char buffer[1024];
+  int ret;
   int buttonMask, wheelMask;
   DownMap::const_iterator iter;
 
   switch (event) {
+  case FL_PASTE:
+    // This is documented as to ASCII, but actually does to 8859-1
+    ret = fl_utf8toa(Fl::event_text(), Fl::event_length(), buffer, 
sizeof(buffer));
+    if (ret >= sizeof(buffer)) {
+      vlog.error(_("Clipboard buffer overflow!"));
+      return 1;
+    }
+    vlog.debug("Sending clipboard data: '%s'", buffer);
+    cc->writer()->clientCutText(buffer, ret);
+    return 1;
   case FL_ENTER:
     // Yes, we would like some pointer events please!
     return 1;
@@ -260,6 +281,19 @@
 }
 
 
+void Viewport::handleClipboardChange(int source, void *data)
+{
+  Viewport *self = (Viewport *)data;
+
+  assert(self);
+
+  if (!sendPrimary && (source == 0))
+    return;
+
+  Fl::paste(*self, source);
+}
+
+
 void Viewport::handlePointerEvent(const rfb::Point& pos, int buttonMask)
 {
   if (!viewOnly) {

Modified: trunk/vncviewer/Viewport.h
===================================================================
--- trunk/vncviewer/Viewport.h  2011-05-19 14:47:43 UTC (rev 4431)
+++ trunk/vncviewer/Viewport.h  2011-05-19 14:49:18 UTC (rev 4432)
@@ -93,6 +93,8 @@
   static void handleUpdateTimeout(void *data);
   static void handleColourMap(void *data);
 
+  static void handleClipboardChange(int source, void *data);
+
   void handlePointerEvent(const rfb::Point& pos, int buttonMask);
   static void handlePointerTimeout(void *data);
 


This was sent by the SourceForge.net collaborative development platform, the 
world's largest Open Source development site.

------------------------------------------------------------------------------
What Every C/C++ and Fortran developer Should Know!
Read this article and learn how Intel has extended the reach of its 
next-generation tools to help Windows* and Linux* C/C++ and Fortran 
developers boost performance applications - including clusters. 
http://p.sf.net/sfu/intel-dev2devmay
_______________________________________________
Tigervnc-commits mailing list
Tigervnc-commits@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/tigervnc-commits

Reply via email to