Brian P. Hinz 4a11567
diff -ur fltk-1.3.0r9110.org/src/Fl.cxx fltk-1.3.0r9110/src/Fl.cxx
Brian P. Hinz 4a11567
--- fltk-1.3.0r9110.org/src/Fl.cxx	2012-06-17 19:47:09.988183253 +0200
Brian P. Hinz 4a11567
+++ fltk-1.3.0r9110/src/Fl.cxx	2012-06-17 19:47:10.127189919 +0200
Brian P. Hinz 4a11567
@@ -1421,6 +1421,7 @@
Brian P. Hinz 4a11567
 // hide() destroys the X window, it does not do unmap!
Brian P. Hinz 4a11567
 
Brian P. Hinz 4a11567
 #if defined(WIN32)
Brian P. Hinz 4a11567
+extern void fl_clipboard_notify_untarget(HWND wnd);
Brian P. Hinz 4a11567
 extern void fl_update_clipboard(void);
Brian P. Hinz 4a11567
 #elif USE_XFT
Brian P. Hinz 4a11567
 extern void fl_destroy_xft_draw(Window);
Brian P. Hinz 4a11567
@@ -1471,6 +1472,8 @@
Brian P. Hinz 4a11567
   // to destroy the window that owns the selection.
Brian P. Hinz 4a11567
   if (GetClipboardOwner()==ip->xid)
Brian P. Hinz 4a11567
     fl_update_clipboard();
Brian P. Hinz 4a11567
+  // Make sure we unlink this window from the clipboard chain
Brian P. Hinz 4a11567
+  fl_clipboard_notify_untarget(ip->xid);
Brian P. Hinz 4a11567
   // Send a message to myself so that I'll get out of the event loop...
Brian P. Hinz 4a11567
   PostMessage(ip->xid, WM_APP, 0, 0);
Brian P. Hinz 4a11567
   if (ip->private_dc) fl_release_dc(ip->xid, ip->private_dc);
Brian P. Hinz 4a11567
diff -ur fltk-1.3.0r9110.org/src/Fl_win32.cxx fltk-1.3.0r9110/src/Fl_win32.cxx
Brian P. Hinz 4a11567
--- fltk-1.3.0r9110.org/src/Fl_win32.cxx	2012-06-17 19:47:09.987183205 +0200
Brian P. Hinz 4a11567
+++ fltk-1.3.0r9110/src/Fl_win32.cxx	2012-06-17 19:47:19.069618739 +0200
Brian P. Hinz 4a11567
@@ -646,6 +646,38 @@
Brian P. Hinz 4a11567
   }
Brian P. Hinz 4a11567
 }
Brian P. Hinz 4a11567
 
Brian P. Hinz 4a11567
+static HWND clipboard_wnd = 0;
Brian P. Hinz 4a11567
+static HWND next_clipboard_wnd = 0;
Brian P. Hinz 4a11567
+
Brian P. Hinz 4a11567
+static bool initial_clipboard = true;
Brian P. Hinz 4a11567
+
Brian P. Hinz 4a11567
+void fl_clipboard_notify_change() {
Brian P. Hinz 4a11567
+  // No need to do anything here...
Brian P. Hinz 4a11567
+}
Brian P. Hinz 4a11567
+
Brian P. Hinz 4a11567
+void fl_clipboard_notify_target(HWND wnd) {
Brian P. Hinz 4a11567
+  if (clipboard_wnd)
Brian P. Hinz 4a11567
+    return;
Brian P. Hinz 4a11567
+
Brian P. Hinz 4a11567
+  // We get one fake WM_DRAWCLIPBOARD immediately, which we therefore
Brian P. Hinz 4a11567
+  // need to ignore.
Brian P. Hinz 4a11567
+  initial_clipboard = true;
Brian P. Hinz 4a11567
+
Brian P. Hinz 4a11567
+  clipboard_wnd = wnd;
Brian P. Hinz 4a11567
+  next_clipboard_wnd = SetClipboardViewer(wnd);
Brian P. Hinz 4a11567
+}
Brian P. Hinz 4a11567
+
Brian P. Hinz 4a11567
+void fl_clipboard_notify_untarget(HWND wnd) {
Brian P. Hinz 4a11567
+  if (wnd != clipboard_wnd)
Brian P. Hinz 4a11567
+    return;
Brian P. Hinz 4a11567
+
Brian P. Hinz 4a11567
+  ChangeClipboardChain(wnd, next_clipboard_wnd);
Brian P. Hinz 4a11567
+  clipboard_wnd = next_clipboard_wnd = 0;
Brian P. Hinz 4a11567
+
Brian P. Hinz 4a11567
+  if (Fl::first_window())
Brian P. Hinz 4a11567
+    fl_clipboard_notify_target(fl_xid(Fl::first_window()));
Brian P. Hinz 4a11567
+}
Brian P. Hinz 4a11567
+
Brian P. Hinz 4a11567
 ////////////////////////////////////////////////////////////////
Brian P. Hinz 4a11567
 char fl_is_ime = 0;
Brian P. Hinz 4a11567
 void fl_get_codepage()
Brian P. Hinz 4a11567
@@ -1327,6 +1359,27 @@
Brian P. Hinz 4a11567
     Fl::handle(FL_SCREEN_CONFIGURATION_CHANGED, NULL);
Brian P. Hinz 4a11567
     return 0;
Brian P. Hinz 4a11567
 
Brian P. Hinz 4a11567
+  case WM_CHANGECBCHAIN:
Brian P. Hinz 4a11567
+    if ((hWnd == clipboard_wnd) &&
Brian P. Hinz 4a11567
+        (next_clipboard_wnd == (HWND)wParam)) {
Brian P. Hinz 4a11567
+      next_clipboard_wnd = (HWND)lParam;
Brian P. Hinz 4a11567
+      return 0;
Brian P. Hinz 4a11567
+    }
Brian P. Hinz 4a11567
+    break;
Brian P. Hinz 4a11567
+
Brian P. Hinz 4a11567
+  case WM_DRAWCLIPBOARD:
Brian P. Hinz 4a11567
+    // When the clipboard moves between two FLTK windows,
Brian P. Hinz 4a11567
+    // fl_i_own_selection will temporarily be false as we are
Brian P. Hinz 4a11567
+    // processing this message. Hence the need to use fl_find().
Brian P. Hinz 4a11567
+    if (!initial_clipboard && !fl_find(GetClipboardOwner()))
Brian P. Hinz 4a11567
+      fl_trigger_clipboard_notify(1);
Brian P. Hinz 4a11567
+    initial_clipboard = false;
Brian P. Hinz 4a11567
+
Brian P. Hinz 4a11567
+    if (next_clipboard_wnd)
Brian P. Hinz 4a11567
+      SendMessage(next_clipboard_wnd, WM_DRAWCLIPBOARD, wParam, lParam);
Brian P. Hinz 4a11567
+
Brian P. Hinz 4a11567
+    return 0;
Brian P. Hinz 4a11567
+
Brian P. Hinz 4a11567
   default:
Brian P. Hinz 4a11567
     if (Fl::handle(0,0)) return 0;
Brian P. Hinz 4a11567
     break;
Brian P. Hinz 4a11567
@@ -1685,6 +1738,8 @@
Brian P. Hinz 4a11567
   x->next = Fl_X::first;
Brian P. Hinz 4a11567
   Fl_X::first = x;
Brian P. Hinz 4a11567
 
Brian P. Hinz 4a11567
+  fl_clipboard_notify_target(x->xid);
Brian P. Hinz 4a11567
+
Brian P. Hinz 4a11567
   x->wait_for_expose = 1;
Brian P. Hinz 4a11567
   if (fl_show_iconic) {showit = 0; fl_show_iconic = 0;}
Brian P. Hinz 4a11567
   if (showit) {