diff options
| author | Pierre Ossman <ossman@cendio.se> | 2013-09-11 11:11:22 +0000 |
|---|---|---|
| committer | Pierre Ossman <ossman@cendio.se> | 2013-09-11 11:11:22 +0000 |
| commit | 9ce5d7c2ad32681719a513052e98a3723c2ab1f5 (patch) | |
| tree | 056cf07596ee75753cb2638b5b6defa0bb9682f2 /src | |
| parent | 6755a24ce3dbabea3e7a49aa4f4e0e34b0b81c95 (diff) | |
Simplify clipboard handling on Windows by consolidating
it into one central function.
git-svn-id: file:///fltk/svn/fltk/branches/branch-1.3@9972 ea41ed52-d2ee-0310-a9c1-e6b18d33e121
Diffstat (limited to 'src')
| -rw-r--r-- | src/Fl.cxx | 14 | ||||
| -rw-r--r-- | src/Fl_win32.cxx | 80 |
2 files changed, 39 insertions, 55 deletions
diff --git a/src/Fl.cxx b/src/Fl.cxx index 560a26028..a0fcbd9f3 100644 --- a/src/Fl.cxx +++ b/src/Fl.cxx @@ -1357,7 +1357,9 @@ int Fl::handle_(int e, Fl_Window* window) //////////////////////////////////////////////////////////////// // 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 @@ -1404,14 +1406,8 @@ void Fl_Window::hide() { #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); diff --git a/src/Fl_win32.cxx b/src/Fl_win32.cxx index e1107cb6a..02cecd949 100644 --- a/src/Fl_win32.cxx +++ b/src/Fl_win32.cxx @@ -531,6 +531,37 @@ public: 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; @@ -548,25 +579,9 @@ void Fl::copy(const char *stuff, int len, int clipboard) { 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: @@ -1191,33 +1206,6 @@ static LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lPar 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); |
