Gitweb links:

...log 
http://git.netsurf-browser.org/netsurf.git/shortlog/8f9d434b1295215c377eab2ba7186ad8b2d92aa9
...commit 
http://git.netsurf-browser.org/netsurf.git/commit/8f9d434b1295215c377eab2ba7186ad8b2d92aa9
...tree 
http://git.netsurf-browser.org/netsurf.git/tree/8f9d434b1295215c377eab2ba7186ad8b2d92aa9

The branch, master has been updated
       via  8f9d434b1295215c377eab2ba7186ad8b2d92aa9 (commit)
       via  95b8d129508ccdec5eadabf46eb313b49a6b4369 (commit)
      from  896e531a7fb6874a0a52de746ea8f783a5f9b441 (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
commitdiff 
http://git.netsurf-browser.org/netsurf.git/commit/?id=8f9d434b1295215c377eab2ba7186ad8b2d92aa9
commit 8f9d434b1295215c377eab2ba7186ad8b2d92aa9
Author: Vincent Sanders <[email protected]>
Commit: Vincent Sanders <[email protected]>

    make win32 keyboard handling in browsing window functional
    
    makes the drawable area widget for the browser display use windows
    unicode input and copes with surrogate pairs for full unicode input
    coverage.
    
    fixes the keydown handling to only the necessary navigation operations
    like left, right up and down etc.

diff --git a/frontends/windows/drawable.c b/frontends/windows/drawable.c
index 939f4f9..e1fdbc8 100644
--- a/frontends/windows/drawable.c
+++ b/frontends/windows/drawable.c
@@ -41,7 +41,7 @@
 #include "windows/local_history.h"
 #include "windows/drawable.h"
 
-static const char windowclassname_drawable[] = "nswsdrawablewindow";
+static const wchar_t *windowclassname_drawable = L"nswsdrawablewindow";
 
 
 /**
@@ -223,19 +223,71 @@ nsws_drawable_resize(struct gui_window *gw)
        return 0;
 }
 
+/**
+ * Handle unicode character messages.
+ */
+static LRESULT
+nsws_drawable_unichar(struct gui_window *gw, HWND hwnd, WPARAM wparam)
+{
+       uint32_t nskey;
+
+       if (wparam == UNICODE_NOCHAR) {
+               return 1;
+       }
+
+       nskey = wparam;
+       browser_window_key_press(gw->bw, nskey);
+       return 0;
+}
 
 /**
- * Handle key press messages.
+ * Handle character messages.
+ *
+ * WM_CHAR is generated when WM_KEYDOWN message are passed to
+ * TranslateMessage; wParam is UTF-16.  If the codepoint is 4
+ * bytes, there are 2 WM_CHAR message, one with the high
+ * surrogate and one with the low surrogate.
  */
 static LRESULT
-nsws_drawable_key(struct gui_window *gw, HWND hwnd, WPARAM wparam)
+nsws_drawable_char(struct gui_window *gw, HWND hwnd, WPARAM wparam)
 {
-       if (GetFocus() != hwnd)
-               return 0 ;
+       uint32_t nskey;
+
+       nskey = wparam;
+
+       const uint32_t utf16_hi_surrogate_start = 0xD800;
+       const uint32_t utf16_lo_surrogate_start = 0xDC00;
+       const uint32_t utf16_surrogate_end = 0xDFFF;
+
+       static uint32_t highSurrogate = 0;
+
+       if ((nskey >= utf16_hi_surrogate_start) &&
+           (nskey < utf16_lo_surrogate_start) ) {
+               highSurrogate = nskey;
+       } else {
+               if ((nskey >= utf16_lo_surrogate_start) &&
+                   (nskey <= utf16_surrogate_end)) {
+                       uint32_t lowSurrogate = nskey;
+                       nskey = (highSurrogate - utf16_hi_surrogate_start) << 
10;
+                       nskey |= ( lowSurrogate - utf16_lo_surrogate_start );
+                       nskey += 0x10000;
+               }
+               highSurrogate = 0;
+
+               browser_window_key_press(gw->bw, nskey);
+       }
 
+       return 0;
+}
+
+/**
+ * Handle keydown messages.
+ */
+static LRESULT
+nsws_drawable_keydown(struct gui_window *gw, HWND hwnd, WPARAM wparam)
+{
        uint32_t i;
        bool shift = ((GetKeyState(VK_SHIFT) & 0x8000) == 0x8000);
-       bool capslock = ((GetKeyState(VK_CAPITAL) & 1) == 1);
 
        switch(wparam) {
        case VK_LEFT:
@@ -285,30 +337,18 @@ nsws_drawable_key(struct gui_window *gw, HWND hwnd, 
WPARAM wparam)
                break;
 
        case VK_NEXT:
-               i = wparam;
-               SendMessage(hwnd, WM_VSCROLL, MAKELONG(SB_PAGEDOWN, 0),
-                           0);
-               break;
+               SendMessage(hwnd, WM_VSCROLL, MAKELONG(SB_PAGEDOWN, 0), 0);
+               return 1;
 
        case VK_PRIOR:
-               i = wparam;
-               SendMessage(hwnd, WM_VSCROLL, MAKELONG(SB_PAGEUP, 0),
-                           0);
-               break;
+               SendMessage(hwnd, WM_VSCROLL, MAKELONG(SB_PAGEUP, 0), 0);
+               return 1;
 
        default:
-               i = wparam;
-               break;
-       }
-
-       if ((i >= 'A') &&
-           (i <= 'Z') &&
-           (((!capslock) && (!shift)) || ((capslock) && (shift)))) {
-               i += 'a' - 'A';
+               return 1;
        }
 
-       if (gw != NULL)
-               browser_window_key_press(gw->bw, i);
+       browser_window_key_press(gw->bw, i);
 
        return 0;
 }
@@ -544,7 +584,6 @@ nsws_window_drawable_event_callback(HWND hwnd,
                                        BROWSER_MOUSE_PRESS_2);
                SetFocus(hwnd);
                return 0;
-               break;
 
        case WM_LBUTTONUP:
                return nsws_drawable_mouseup(gw,
@@ -567,7 +606,16 @@ nsws_window_drawable_event_callback(HWND hwnd,
                return nsws_drawable_paint(gw, hwnd);
 
        case WM_KEYDOWN:
-               return nsws_drawable_key(gw, hwnd, wparam);
+               if (nsws_drawable_keydown(gw, hwnd, wparam) == 0) {
+                       return 0;
+               }
+               break;
+
+       case WM_CHAR:
+               return nsws_drawable_char(gw, hwnd, wparam);
+
+       case WM_UNICHAR:
+               return nsws_drawable_unichar(gw, hwnd, wparam);
 
        case WM_SIZE:
                return nsws_drawable_resize(gw);
@@ -618,14 +666,16 @@ nsws_window_create_drawable(HINSTANCE hinstance,
                            struct gui_window *gw)
 {
        HWND hwnd;
-       hwnd = CreateWindow(windowclassname_drawable,
-                           NULL,
-                           WS_VISIBLE | WS_CHILD,
-                           0, 0, 0, 0,
-                           hparent,
-                           NULL,
-                           hinstance,
-                           NULL);
+       hwnd = CreateWindowExW(0,
+                              windowclassname_drawable,
+                              NULL,
+                              WS_VISIBLE | WS_CHILD,
+                              0, 0,
+                              0, 0,
+                              hparent,
+                              NULL,
+                              hinstance,
+                              NULL);
 
        if (hwnd == NULL) {
                win_perror("WindowCreateDrawable");
@@ -646,7 +696,7 @@ nsws_window_create_drawable(HINSTANCE hinstance,
 nserror
 nsws_create_drawable_class(HINSTANCE hinstance) {
        nserror ret = NSERROR_OK;
-       WNDCLASSEX w;
+       WNDCLASSEXW w;
 
        /* drawable area */
        w.cbSize = sizeof(WNDCLASSEX);
@@ -662,7 +712,7 @@ nsws_create_drawable_class(HINSTANCE hinstance) {
        w.lpszClassName = windowclassname_drawable;
        w.hIconSm = NULL;
 
-       if (RegisterClassEx(&w) == 0) {
+       if (RegisterClassExW(&w) == 0) {
                win_perror("DrawableClass");
                ret = NSERROR_INIT_FAILED;
        }


commitdiff 
http://git.netsurf-browser.org/netsurf.git/commit/?id=95b8d129508ccdec5eadabf46eb313b49a6b4369
commit 95b8d129508ccdec5eadabf46eb313b49a6b4369
Author: Vincent Sanders <[email protected]>
Commit: Vincent Sanders <[email protected]>

    implement windows clipboard functionality
    
    This allows clipboard to operate (cut, copy, paste and delete) in the
     win32 front end. The clipboard is set and read in windows unicode
     mode and then converted to/from utf-8 for the browser core.

diff --git a/frontends/windows/Makefile b/frontends/windows/Makefile
index d22e171..087edb6 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 0000000..bc52a45
--- /dev/null
+++ b/frontends/windows/clipboard.c
@@ -0,0 +1,131 @@
+/*
+ * Copyright 2019 Vincent Sanders <[email protected]>
+ *
+ * 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 <http://www.gnu.org/licenses/>.
+ */
+
+/**
+ * \file
+ * win32 clipboard implementation.
+ */
+
+#include <windows.h>
+
+#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 0000000..c707c24
--- /dev/null
+++ b/frontends/windows/clipboard.h
@@ -0,0 +1,27 @@
+/*
+ * Copyright 2019 Vincent Sanders <[email protected]>
+ *
+ * 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 <http://www.gnu.org/licenses/>.
+ */
+
+#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 f491e0a..939f4f9 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 bafe5a4..490f234 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 95dcfc1..8f8f0bc 100644
--- a/frontends/windows/gui.h
+++ b/frontends/windows/gui.h
@@ -17,11 +17,10 @@
  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
-#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 fd22ae1..b021751 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 681b2e2..adfc793 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:


-----------------------------------------------------------------------

Summary of changes:
 frontends/windows/Makefile                         |    2 +-
 frontends/windows/clipboard.c                      |  131 ++++++++++++++++++
 .../image/webp.h => frontends/windows/clipboard.h  |   12 +-
 frontends/windows/drawable.c                       |  145 +++++++++++++++-----
 frontends/windows/gui.c                            |   63 ---------
 frontends/windows/gui.h                            |    5 +-
 frontends/windows/main.c                           |    1 +
 frontends/windows/window.c                         |   33 ++---
 8 files changed, 259 insertions(+), 133 deletions(-)
 create mode 100644 frontends/windows/clipboard.c
 copy content/handlers/image/webp.h => frontends/windows/clipboard.h (80%)

diff --git a/frontends/windows/Makefile b/frontends/windows/Makefile
index d22e171..087edb6 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 0000000..bc52a45
--- /dev/null
+++ b/frontends/windows/clipboard.c
@@ -0,0 +1,131 @@
+/*
+ * Copyright 2019 Vincent Sanders <[email protected]>
+ *
+ * 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 <http://www.gnu.org/licenses/>.
+ */
+
+/**
+ * \file
+ * win32 clipboard implementation.
+ */
+
+#include <windows.h>
+
+#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/content/handlers/image/webp.h b/frontends/windows/clipboard.h
similarity index 80%
copy from content/handlers/image/webp.h
copy to frontends/windows/clipboard.h
index b219f25..c707c24 100644
--- a/content/handlers/image/webp.h
+++ b/frontends/windows/clipboard.h
@@ -16,14 +16,12 @@
  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
+#ifndef NETSURF_WINDOWS_CLIPBOARD_H
+#define NETSURF_WINDOWS_CLIPBOARD_H
+
 /**
- * \file
- * Interface to image/webp content handlers
+ * The clipboard operation function table for win32
  */
-
-#ifndef _NETSURF_IMAGE_WEBP_H_
-#define _NETSURF_IMAGE_WEBP_H_
-
-nserror nswebp_init(void);
+struct gui_clipboard_table *win32_clipboard_table;
 
 #endif
diff --git a/frontends/windows/drawable.c b/frontends/windows/drawable.c
index f491e0a..e1fdbc8 100644
--- a/frontends/windows/drawable.c
+++ b/frontends/windows/drawable.c
@@ -41,7 +41,7 @@
 #include "windows/local_history.h"
 #include "windows/drawable.h"
 
-static const char windowclassname_drawable[] = "nswsdrawablewindow";
+static const wchar_t *windowclassname_drawable = L"nswsdrawablewindow";
 
 
 /**
@@ -223,19 +223,71 @@ nsws_drawable_resize(struct gui_window *gw)
        return 0;
 }
 
+/**
+ * Handle unicode character messages.
+ */
+static LRESULT
+nsws_drawable_unichar(struct gui_window *gw, HWND hwnd, WPARAM wparam)
+{
+       uint32_t nskey;
+
+       if (wparam == UNICODE_NOCHAR) {
+               return 1;
+       }
+
+       nskey = wparam;
+       browser_window_key_press(gw->bw, nskey);
+       return 0;
+}
 
 /**
- * Handle key press messages.
+ * Handle character messages.
+ *
+ * WM_CHAR is generated when WM_KEYDOWN message are passed to
+ * TranslateMessage; wParam is UTF-16.  If the codepoint is 4
+ * bytes, there are 2 WM_CHAR message, one with the high
+ * surrogate and one with the low surrogate.
  */
 static LRESULT
-nsws_drawable_key(struct gui_window *gw, HWND hwnd, WPARAM wparam)
+nsws_drawable_char(struct gui_window *gw, HWND hwnd, WPARAM wparam)
 {
-       if (GetFocus() != hwnd)
-               return 0 ;
+       uint32_t nskey;
+
+       nskey = wparam;
+
+       const uint32_t utf16_hi_surrogate_start = 0xD800;
+       const uint32_t utf16_lo_surrogate_start = 0xDC00;
+       const uint32_t utf16_surrogate_end = 0xDFFF;
 
+       static uint32_t highSurrogate = 0;
+
+       if ((nskey >= utf16_hi_surrogate_start) &&
+           (nskey < utf16_lo_surrogate_start) ) {
+               highSurrogate = nskey;
+       } else {
+               if ((nskey >= utf16_lo_surrogate_start) &&
+                   (nskey <= utf16_surrogate_end)) {
+                       uint32_t lowSurrogate = nskey;
+                       nskey = (highSurrogate - utf16_hi_surrogate_start) << 
10;
+                       nskey |= ( lowSurrogate - utf16_lo_surrogate_start );
+                       nskey += 0x10000;
+               }
+               highSurrogate = 0;
+
+               browser_window_key_press(gw->bw, nskey);
+       }
+
+       return 0;
+}
+
+/**
+ * Handle keydown messages.
+ */
+static LRESULT
+nsws_drawable_keydown(struct gui_window *gw, HWND hwnd, WPARAM wparam)
+{
        uint32_t i;
        bool shift = ((GetKeyState(VK_SHIFT) & 0x8000) == 0x8000);
-       bool capslock = ((GetKeyState(VK_CAPITAL) & 1) == 1);
 
        switch(wparam) {
        case VK_LEFT:
@@ -285,30 +337,18 @@ nsws_drawable_key(struct gui_window *gw, HWND hwnd, 
WPARAM wparam)
                break;
 
        case VK_NEXT:
-               i = wparam;
-               SendMessage(hwnd, WM_VSCROLL, MAKELONG(SB_PAGEDOWN, 0),
-                           0);
-               break;
+               SendMessage(hwnd, WM_VSCROLL, MAKELONG(SB_PAGEDOWN, 0), 0);
+               return 1;
 
        case VK_PRIOR:
-               i = wparam;
-               SendMessage(hwnd, WM_VSCROLL, MAKELONG(SB_PAGEUP, 0),
-                           0);
-               break;
+               SendMessage(hwnd, WM_VSCROLL, MAKELONG(SB_PAGEUP, 0), 0);
+               return 1;
 
        default:
-               i = wparam;
-               break;
+               return 1;
        }
 
-       if ((i >= 'A') &&
-           (i <= 'Z') &&
-           (((!capslock) && (!shift)) || ((capslock) && (shift)))) {
-               i += 'a' - 'A';
-       }
-
-       if (gw != NULL)
-               browser_window_key_press(gw->bw, i);
+       browser_window_key_press(gw->bw, i);
 
        return 0;
 }
@@ -544,7 +584,6 @@ nsws_window_drawable_event_callback(HWND hwnd,
                                        BROWSER_MOUSE_PRESS_2);
                SetFocus(hwnd);
                return 0;
-               break;
 
        case WM_LBUTTONUP:
                return nsws_drawable_mouseup(gw,
@@ -567,7 +606,16 @@ nsws_window_drawable_event_callback(HWND hwnd,
                return nsws_drawable_paint(gw, hwnd);
 
        case WM_KEYDOWN:
-               return nsws_drawable_key(gw, hwnd, wparam);
+               if (nsws_drawable_keydown(gw, hwnd, wparam) == 0) {
+                       return 0;
+               }
+               break;
+
+       case WM_CHAR:
+               return nsws_drawable_char(gw, hwnd, wparam);
+
+       case WM_UNICHAR:
+               return nsws_drawable_unichar(gw, hwnd, wparam);
 
        case WM_SIZE:
                return nsws_drawable_resize(gw);
@@ -581,6 +629,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);
 }
@@ -595,14 +666,16 @@ nsws_window_create_drawable(HINSTANCE hinstance,
                            struct gui_window *gw)
 {
        HWND hwnd;
-       hwnd = CreateWindow(windowclassname_drawable,
-                           NULL,
-                           WS_VISIBLE | WS_CHILD,
-                           0, 0, 0, 0,
-                           hparent,
-                           NULL,
-                           hinstance,
-                           NULL);
+       hwnd = CreateWindowExW(0,
+                              windowclassname_drawable,
+                              NULL,
+                              WS_VISIBLE | WS_CHILD,
+                              0, 0,
+                              0, 0,
+                              hparent,
+                              NULL,
+                              hinstance,
+                              NULL);
 
        if (hwnd == NULL) {
                win_perror("WindowCreateDrawable");
@@ -623,7 +696,7 @@ nsws_window_create_drawable(HINSTANCE hinstance,
 nserror
 nsws_create_drawable_class(HINSTANCE hinstance) {
        nserror ret = NSERROR_OK;
-       WNDCLASSEX w;
+       WNDCLASSEXW w;
 
        /* drawable area */
        w.cbSize = sizeof(WNDCLASSEX);
@@ -639,7 +712,7 @@ nsws_create_drawable_class(HINSTANCE hinstance) {
        w.lpszClassName = windowclassname_drawable;
        w.hIconSm = NULL;
 
-       if (RegisterClassEx(&w) == 0) {
+       if (RegisterClassExW(&w) == 0) {
                win_perror("DrawableClass");
                ret = NSERROR_INIT_FAILED;
        }
diff --git a/frontends/windows/gui.c b/frontends/windows/gui.c
index bafe5a4..490f234 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 95dcfc1..8f8f0bc 100644
--- a/frontends/windows/gui.h
+++ b/frontends/windows/gui.h
@@ -17,11 +17,10 @@
  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
-#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 fd22ae1..b021751 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 681b2e2..adfc793 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:


-- 
NetSurf Browser

_______________________________________________
netsurf-commits mailing list
[email protected]
http://listmaster.pepperfish.net/cgi-bin/mailman/listinfo/netsurf-commits-netsurf-browser.org

Reply via email to