diff --git a/frontends/windows/Makefile b/frontends/windows/Makefile index d22e17112..087edb627 100644 --- a/frontends/windows/Makefile +++ b/frontends/windows/Makefile @@ -52,7 +52,7 @@ S_RESOURCES := windows_resource.o # ---------------------------------------------------------------------------- # sources purely for the windows build -S_FRONTEND := main.c window.c gui.c drawable.c plot.c findfile.c \ +S_FRONTEND := main.c window.c gui.c clipboard.c drawable.c plot.c findfile.c \ font.c bitmap.c about.c prefs.c download.c fetch.c file.c \ local_history.c schedule.c windbg.c pointers.c login.c \ corewindow.c hotlist.c cookies.c global_history.c ssl_cert.c diff --git a/frontends/windows/clipboard.c b/frontends/windows/clipboard.c new file mode 100644 index 000000000..bc52a4594 --- /dev/null +++ b/frontends/windows/clipboard.c @@ -0,0 +1,131 @@ +/* + * Copyright 2019 Vincent Sanders + * + * This file is part of NetSurf, http://www.netsurf-browser.org/ + * + * NetSurf is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * NetSurf is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +/** + * \file + * win32 clipboard implementation. + */ + +#include + +#include "utils/log.h" +#include "netsurf/clipboard.h" + +#include "windows/clipboard.h" + +/** + * Core asks front end for clipboard contents. + * + * \param buffer UTF-8 text, allocated by front end, ownership yeilded to core + * \param length Byte length of UTF-8 text in buffer + */ +static void gui_get_clipboard(char **buffer, size_t *length) +{ + HANDLE clipboard_handle; + wchar_t *content; + + if (OpenClipboard(NULL)) { + clipboard_handle = GetClipboardData(CF_UNICODETEXT); + if (clipboard_handle != NULL) { + content = GlobalLock(clipboard_handle); + if (content != NULL) { + int required_len; + size_t content_len; + + content_len = wcslen(content); + + /* compute length */ + required_len = WideCharToMultiByte( + CP_UTF8, + WC_NO_BEST_FIT_CHARS, + content, + content_len, + NULL, + 0, + NULL, + NULL); + /* allocate buffer and do conversion */ + *buffer = malloc(required_len); + *length = WideCharToMultiByte( + CP_UTF8, + WC_NO_BEST_FIT_CHARS, + content, + content_len, + *buffer, + required_len, + NULL, + NULL); + + GlobalUnlock(clipboard_handle); + } + } + CloseClipboard(); + } +} + + +/** + * Core tells front end to put given text in clipboard + * + * \param buffer UTF-8 text, owned by core + * \param length Byte length of UTF-8 text in buffer + * \param styles Array of styles given to text runs, owned by core, or NULL + * \param n_styles Number of text run styles in array + */ +static void +gui_set_clipboard(const char *buffer, + size_t length, + nsclipboard_styles styles[], + int n_styles) +{ + HGLOBAL hglbCopy; + wchar_t *content; /* clipboard content */ + int content_len; /* characters in content */ + + if (OpenClipboard(NULL)) { + EmptyClipboard(); + content_len = MultiByteToWideChar(CP_UTF8, + MB_PRECOMPOSED, + buffer, length, + NULL, 0); + + hglbCopy = GlobalAlloc(GMEM_MOVEABLE, + ((content_len + 1) * sizeof(wchar_t))); + if (hglbCopy != NULL) { + content = GlobalLock(hglbCopy); + MultiByteToWideChar(CP_UTF8, + MB_PRECOMPOSED, + buffer, length, + content, content_len); + content[content_len] = 0; /* null terminate */ + + GlobalUnlock(hglbCopy); + SetClipboardData(CF_UNICODETEXT, hglbCopy); + } + CloseClipboard(); + } +} + + + +static struct gui_clipboard_table clipboard_table = { + .get = gui_get_clipboard, + .set = gui_set_clipboard, +}; + +struct gui_clipboard_table *win32_clipboard_table = &clipboard_table; diff --git a/frontends/windows/clipboard.h b/frontends/windows/clipboard.h new file mode 100644 index 000000000..c707c2437 --- /dev/null +++ b/frontends/windows/clipboard.h @@ -0,0 +1,27 @@ +/* + * Copyright 2019 Vincent Sanders + * + * This file is part of NetSurf, http://www.netsurf-browser.org/ + * + * NetSurf is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * NetSurf is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#ifndef NETSURF_WINDOWS_CLIPBOARD_H +#define NETSURF_WINDOWS_CLIPBOARD_H + +/** + * The clipboard operation function table for win32 + */ +struct gui_clipboard_table *win32_clipboard_table; + +#endif diff --git a/frontends/windows/drawable.c b/frontends/windows/drawable.c index f491e0a2a..939f4f946 100644 --- a/frontends/windows/drawable.c +++ b/frontends/windows/drawable.c @@ -581,6 +581,29 @@ nsws_window_drawable_event_callback(HWND hwnd, case WM_MOUSEWHEEL: return nsws_drawable_wheel(gw, hwnd, wparam); + case WM_PASTE: + browser_window_key_press(gw->bw, NS_KEY_PASTE); + return 0; + + case WM_COPY: + browser_window_key_press(gw->bw, NS_KEY_COPY_SELECTION); + return 0; + + case WM_CUT: + browser_window_key_press(gw->bw, NS_KEY_CUT_SELECTION); + return 0; + + case WM_CLEAR: + /** + * \todo win32 clear operation deletes the contents of + * the selection but ns clear selection only + * removes the highlight. + */ + browser_window_key_press(gw->bw, NS_KEY_CLEAR_SELECTION); + return 0; + + + } return DefWindowProc(hwnd, msg, wparam, lparam); } diff --git a/frontends/windows/gui.c b/frontends/windows/gui.c index bafe5a4b7..490f23433 100644 --- a/frontends/windows/gui.c +++ b/frontends/windows/gui.c @@ -36,7 +36,6 @@ #include "utils/file.h" #include "utils/messages.h" #include "netsurf/browser_window.h" -#include "netsurf/clipboard.h" #include "windows/schedule.h" #include "windows/window.h" @@ -181,65 +180,3 @@ nserror win32_warning(const char *warning, const char *detail) } -/** - * Core asks front end for clipboard contents. - * - * \param buffer UTF-8 text, allocated by front end, ownership yeilded to core - * \param length Byte length of UTF-8 text in buffer - */ -static void gui_get_clipboard(char **buffer, size_t *length) -{ - /* TODO: Implement this */ - HANDLE clipboard_handle; - char *content; - - clipboard_handle = GetClipboardData(CF_TEXT); - if (clipboard_handle != NULL) { - content = GlobalLock(clipboard_handle); - NSLOG(netsurf, INFO, "pasting %s", content); - GlobalUnlock(clipboard_handle); - } -} - - -/** - * Core tells front end to put given text in clipboard - * - * \param buffer UTF-8 text, owned by core - * \param length Byte length of UTF-8 text in buffer - * \param styles Array of styles given to text runs, owned by core, or NULL - * \param n_styles Number of text run styles in array - */ -static void gui_set_clipboard(const char *buffer, size_t length, - nsclipboard_styles styles[], int n_styles) -{ - /* TODO: Implement this */ - HANDLE hnew; - char *new, *original; - HANDLE h = GetClipboardData(CF_TEXT); - if (h == NULL) - original = (char *)""; - else - original = GlobalLock(h); - - size_t len = strlen(original) + 1; - hnew = GlobalAlloc(GHND, length + len); - new = (char *)GlobalLock(hnew); - snprintf(new, length + len, "%s%s", original, buffer); - - if (h != NULL) { - GlobalUnlock(h); - EmptyClipboard(); - } - GlobalUnlock(hnew); - SetClipboardData(CF_TEXT, hnew); -} - - - -static struct gui_clipboard_table clipboard_table = { - .get = gui_get_clipboard, - .set = gui_set_clipboard, -}; - -struct gui_clipboard_table *win32_clipboard_table = &clipboard_table; diff --git a/frontends/windows/gui.h b/frontends/windows/gui.h index 95dcfc1b2..8f8f0bcbf 100644 --- a/frontends/windows/gui.h +++ b/frontends/windows/gui.h @@ -17,11 +17,10 @@ * along with this program. If not, see . */ -#ifndef _NETSURF_WINDOWS_GUI_H_ -#define _NETSURF_WINDOWS_GUI_H_ +#ifndef NETSURF_WINDOWS_GUI_H +#define NETSURF_WINDOWS_GUI_H struct gui_window; -struct gui_clipboard_table *win32_clipboard_table; extern HINSTANCE hinst; diff --git a/frontends/windows/main.c b/frontends/windows/main.c index fd22ae1fe..b021751c9 100644 --- a/frontends/windows/main.c +++ b/frontends/windows/main.c @@ -54,6 +54,7 @@ #include "windows/fetch.h" #include "windows/pointers.h" #include "windows/bitmap.h" +#include "windows/clipboard.h" #include "windows/gui.h" char **respaths; /** exported global defined in windows/gui.h */ diff --git a/frontends/windows/window.c b/frontends/windows/window.c index 681b2e282..adfc79399 100644 --- a/frontends/windows/window.c +++ b/frontends/windows/window.c @@ -1056,48 +1056,35 @@ nsws_window_command(HWND hwnd, break; case IDM_EDIT_CUT: - OpenClipboard(gw->main); - EmptyClipboard(); - CloseClipboard(); if (GetFocus() == gw->urlbar) { SendMessage(gw->urlbar, WM_CUT, 0, 0); - } else if (gw->bw != NULL) { - browser_window_key_press(gw->bw, NS_KEY_CUT_SELECTION); + } else { + SendMessage(gw->drawingarea, WM_CUT, 0, 0); } break; case IDM_EDIT_COPY: - OpenClipboard(gw->main); - EmptyClipboard(); - CloseClipboard(); if (GetFocus() == gw->urlbar) { SendMessage(gw->urlbar, WM_COPY, 0, 0); - } else if (gw->bw != NULL) { - browser_window_key_press(gw->bw, NS_KEY_COPY_SELECTION); + } else { + SendMessage(gw->drawingarea, WM_COPY, 0, 0); } break; case IDM_EDIT_PASTE: { - OpenClipboard(gw->main); - HANDLE h = GetClipboardData(CF_TEXT); - if (h != NULL) { - char *content = GlobalLock(h); - NSLOG(netsurf, INFO, "pasting %s\n", content); - GlobalUnlock(h); - } - CloseClipboard(); - if (GetFocus() == gw->urlbar) + if (GetFocus() == gw->urlbar) { SendMessage(gw->urlbar, WM_PASTE, 0, 0); - else - browser_window_key_press(gw->bw, NS_KEY_PASTE); + } else { + SendMessage(gw->drawingarea, WM_PASTE, 0, 0); + } break; } case IDM_EDIT_DELETE: if (GetFocus() == gw->urlbar) - SendMessage(gw->urlbar, WM_CUT, 0, 0); + SendMessage(gw->urlbar, WM_CLEAR, 0, 0); else - browser_window_key_press(gw->bw, NS_KEY_DELETE_RIGHT); + SendMessage(gw->drawingarea, WM_CLEAR, 0, 0); break; case IDM_EDIT_SELECT_ALL: