123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135 |
- diff -ur fltk-1.3.0r9110.org/src/Fl_win32.cxx fltk-1.3.0r9110/src/Fl_win32.cxx
- --- fltk-1.3.0r9110.org/src/Fl_win32.cxx 2012-06-17 19:42:02.169422400 +0200
- +++ fltk-1.3.0r9110/src/Fl_win32.cxx 2012-06-17 19:43:38.286031455 +0200
- @@ -543,6 +543,37 @@
- const char* GetValue() const { return(out); }
- };
-
- +void fl_update_clipboard(void) {
- + Fl_Window *w1 = Fl::first_window();
- + if (!w1)
- + return;
- +
- + HWND hwnd = fl_xid(w1);
- +
- + if (!OpenClipboard(hwnd))
- + return;
- +
- + EmptyClipboard();
- +
- + int utf16_len = fl_utf8toUtf16(fl_selection_buffer[1],
- + fl_selection_length[1], 0, 0);
- +
- + HGLOBAL hMem = GlobalAlloc(GHND, utf16_len * 2 + 2); // moveable and zero'ed mem alloc.
- + LPVOID memLock = GlobalLock(hMem);
- +
- + fl_utf8toUtf16(fl_selection_buffer[1], fl_selection_length[1],
- + (unsigned short*) memLock, utf16_len + 1);
- +
- + GlobalUnlock(hMem);
- + SetClipboardData(CF_UNICODETEXT, hMem);
- +
- + CloseClipboard();
- +
- + // In case Windows managed to lob of a WM_DESTROYCLIPBOARD during
- + // the above.
- + fl_i_own_selection[1] = 1;
- +}
- +
- // call this when you create a selection:
- void Fl::copy(const char *stuff, int len, int clipboard) {
- if (!stuff || len<0) return;
- @@ -560,25 +591,9 @@
- memcpy(fl_selection_buffer[clipboard], stuff, len);
- fl_selection_buffer[clipboard][len] = 0; // needed for direct paste
- fl_selection_length[clipboard] = len;
- - if (clipboard) {
- - // set up for "delayed rendering":
- - if (OpenClipboard(NULL)) {
- - // if the system clipboard works, use it
- - int utf16_len = fl_utf8toUtf16(fl_selection_buffer[clipboard], fl_selection_length[clipboard], 0, 0);
- - EmptyClipboard();
- - HGLOBAL hMem = GlobalAlloc(GHND, utf16_len * 2 + 2); // moveable and zero'ed mem alloc.
- - LPVOID memLock = GlobalLock(hMem);
- - fl_utf8toUtf16(fl_selection_buffer[clipboard], fl_selection_length[clipboard], (unsigned short*) memLock, utf16_len + 1);
- - GlobalUnlock(hMem);
- - SetClipboardData(CF_UNICODETEXT, hMem);
- - CloseClipboard();
- - GlobalFree(hMem);
- - fl_i_own_selection[clipboard] = 0;
- - } else {
- - // only if it fails, instruct paste() to use the internal buffers
- - fl_i_own_selection[clipboard] = 1;
- - }
- - }
- + fl_i_own_selection[clipboard] = 1;
- + if (clipboard)
- + fl_update_clipboard();
- }
-
- // Call this when a "paste" operation happens:
- @@ -1307,33 +1322,6 @@
- fl_i_own_selection[1] = 0;
- return 1;
-
- - case WM_RENDERALLFORMATS:
- - fl_i_own_selection[1] = 0;
- - // Windoze seems unhappy unless I do these two steps. Documentation
- - // seems to vary on whether opening the clipboard is necessary or
- - // is in fact wrong:
- - CloseClipboard();
- - OpenClipboard(NULL);
- - // fall through...
- - case WM_RENDERFORMAT: {
- - HANDLE h;
- -
- -// int l = fl_utf_nb_char((unsigned char*)fl_selection_buffer[1], fl_selection_length[1]);
- - int l = fl_utf8toUtf16(fl_selection_buffer[1], fl_selection_length[1], NULL, 0); // Pass NULL buffer to query length required
- - h = GlobalAlloc(GHND, (l+1) * sizeof(unsigned short));
- - if (h) {
- - unsigned short *g = (unsigned short*) GlobalLock(h);
- -// fl_utf2unicode((unsigned char *)fl_selection_buffer[1], fl_selection_length[1], (xchar*)g);
- - l = fl_utf8toUtf16(fl_selection_buffer[1], fl_selection_length[1], g, (l+1));
- - g[l] = 0;
- - GlobalUnlock(h);
- - SetClipboardData(CF_UNICODETEXT, h);
- - }
- -
- - // Windoze also seems unhappy if I don't do this. Documentation very
- - // unclear on what is correct:
- - if (fl_msg.message == WM_RENDERALLFORMATS) CloseClipboard();
- - return 1;}
- case WM_DISPLAYCHANGE: // occurs when screen configuration (number, position) changes
- Fl::call_screen_init();
- Fl::handle(FL_SCREEN_CONFIGURATION_CHANGED, NULL);
- diff -ur fltk-1.3.0r9110.org/src/Fl.cxx fltk-1.3.0r9110/src/Fl.cxx
- --- fltk-1.3.0r9110.org/src/Fl.cxx 2012-06-17 19:42:02.173422595 +0200
- +++ fltk-1.3.0r9110/src/Fl.cxx 2012-06-17 19:42:02.317429497 +0200
- @@ -1420,7 +1420,9 @@
- ////////////////////////////////////////////////////////////////
- // hide() destroys the X window, it does not do unmap!
-
- -#if !defined(WIN32) && USE_XFT
- +#if defined(WIN32)
- +extern void fl_update_clipboard(void);
- +#elif USE_XFT
- extern void fl_destroy_xft_draw(Window);
- #endif
-
- @@ -1467,14 +1469,8 @@
- #if defined(WIN32)
- // this little trick keeps the current clipboard alive, even if we are about
- // to destroy the window that owns the selection.
- - if (GetClipboardOwner()==ip->xid) {
- - Fl_Window *w1 = Fl::first_window();
- - if (w1 && OpenClipboard(fl_xid(w1))) {
- - EmptyClipboard();
- - SetClipboardData(CF_TEXT, NULL);
- - CloseClipboard();
- - }
- - }
- + if (GetClipboardOwner()==ip->xid)
- + fl_update_clipboard();
- // Send a message to myself so that I'll get out of the event loop...
- PostMessage(ip->xid, WM_APP, 0, 0);
- if (ip->private_dc) fl_release_dc(ip->xid, ip->private_dc);
|