summaryrefslogtreecommitdiff
path: root/pkg/netsurf/patch
diff options
context:
space:
mode:
authorMichael Forney <mforney@mforney.org>2016-12-23 15:32:20 -0800
committerMichael Forney <mforney@mforney.org>2016-12-29 23:29:18 -0800
commite7181404bf50baf29e3a3d9f0e9ebe8a97566316 (patch)
tree2ef48628d13ee934f9d43a37f1e4d58c6bb46ca1 /pkg/netsurf/patch
parent5084e84171fc00de2d65abd61e55577cd1fe1bff (diff)
Add netsurf 3.6
{nsgenbind,webidl}-{lexer,parser}.{c,h} were generated using flex and bison on unmodified 0.4 sources.
Diffstat (limited to 'pkg/netsurf/patch')
-rw-r--r--pkg/netsurf/patch/0001-Remove-non-reproducible-info-from-about-page.patch40
-rw-r--r--pkg/netsurf/patch/0002-framebuffer-Set-default-backend-to-wayland.patch25
-rw-r--r--pkg/netsurf/patch/0003-framebuffer-Fix-cookie-defaults.patch100
-rw-r--r--pkg/netsurf/patch/0004-framebuffer-Fix-font-layout-function-return-values.patch112
-rw-r--r--pkg/netsurf/patch/0005-framebuffer-Use-XKB-key-events.patch558
5 files changed, 835 insertions, 0 deletions
diff --git a/pkg/netsurf/patch/0001-Remove-non-reproducible-info-from-about-page.patch b/pkg/netsurf/patch/0001-Remove-non-reproducible-info-from-about-page.patch
new file mode 100644
index 00000000..98663d3a
--- /dev/null
+++ b/pkg/netsurf/patch/0001-Remove-non-reproducible-info-from-about-page.patch
@@ -0,0 +1,40 @@
+From ba5389200ff60bb5494efe503f1f1fc165383a85 Mon Sep 17 00:00:00 2001
+From: Michael Forney <mforney@mforney.org>
+Date: Fri, 23 Dec 2016 14:41:52 -0800
+Subject: [PATCH] Remove non-reproducible info from about page
+
+---
+ content/fetchers/about.c | 17 -----------------
+ 1 file changed, 17 deletions(-)
+
+diff --git a/content/fetchers/about.c b/content/fetchers/about.c
+index 4d14020b0..aff21c81a 100644
+--- a/content/fetchers/about.c
++++ b/content/fetchers/about.c
+@@ -477,23 +477,6 @@ static bool fetch_about_testament_handler(struct fetch_about_context *ctx)
+ if (fetch_about_send_callback(&msg, ctx))
+ goto fetch_about_testament_handler_aborted;
+
+-
+- slen = snprintf(buffer, sizeof buffer,
+- "Built by %s (%s) from %s at revision %s on %s\n\n",
+- GECOS, USERNAME, WT_BRANCHPATH, WT_REVID, WT_COMPILEDATE);
+-
+- msg.data.header_or_data.len = slen;
+- if (fetch_about_send_callback(&msg, ctx))
+- goto fetch_about_testament_handler_aborted;
+-
+- slen = snprintf(buffer, sizeof buffer,
+- "Built on %s in %s\n\n",
+- WT_HOSTNAME, WT_ROOT);
+-
+- msg.data.header_or_data.len = slen;
+- if (fetch_about_send_callback(&msg, ctx))
+- goto fetch_about_testament_handler_aborted;
+-
+ if (WT_MODIFIED > 0) {
+ slen = snprintf(buffer, sizeof buffer,
+ "Working tree has %d modification%s\n\n",
+--
+2.11.0
+
diff --git a/pkg/netsurf/patch/0002-framebuffer-Set-default-backend-to-wayland.patch b/pkg/netsurf/patch/0002-framebuffer-Set-default-backend-to-wayland.patch
new file mode 100644
index 00000000..4b63ac8e
--- /dev/null
+++ b/pkg/netsurf/patch/0002-framebuffer-Set-default-backend-to-wayland.patch
@@ -0,0 +1,25 @@
+From ecd460198f101721260d770a6dcc52922f643a62 Mon Sep 17 00:00:00 2001
+From: Michael Forney <mforney@mforney.org>
+Date: Fri, 23 Dec 2016 15:13:31 -0800
+Subject: [PATCH] framebuffer: Set default backend to wayland
+
+---
+ frontends/framebuffer/gui.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/frontends/framebuffer/gui.c b/frontends/framebuffer/gui.c
+index 4d4c7334f..2e819e6fa 100644
+--- a/frontends/framebuffer/gui.c
++++ b/frontends/framebuffer/gui.c
+@@ -466,7 +466,7 @@ process_cmdline(int argc, char** argv)
+
+ LOG("argc %d, argv %p", argc, argv);
+
+- fename = "sdl";
++ fename = "wayland";
+ febpp = 32;
+
+ fewidth = nsoption_int(window_width);
+--
+2.11.0
+
diff --git a/pkg/netsurf/patch/0003-framebuffer-Fix-cookie-defaults.patch b/pkg/netsurf/patch/0003-framebuffer-Fix-cookie-defaults.patch
new file mode 100644
index 00000000..17bc12f5
--- /dev/null
+++ b/pkg/netsurf/patch/0003-framebuffer-Fix-cookie-defaults.patch
@@ -0,0 +1,100 @@
+From 8a15a5505db85870f340c61fea1db3da16fde039 Mon Sep 17 00:00:00 2001
+From: Michael Forney <mforney@mforney.org>
+Date: Sat, 24 Dec 2016 16:57:34 -0800
+Subject: [PATCH] framebuffer: Fix cookie defaults
+
+---
+ frontends/framebuffer/gui.c | 48 +++++++++++++++++++++++++++++++++++++++++++--
+ 1 file changed, 46 insertions(+), 2 deletions(-)
+
+diff --git a/frontends/framebuffer/gui.c b/frontends/framebuffer/gui.c
+index 2e819e6fa..e176ac9e4 100644
+--- a/frontends/framebuffer/gui.c
++++ b/frontends/framebuffer/gui.c
+@@ -31,6 +31,7 @@
+
+ #include "utils/utils.h"
+ #include "utils/nsoption.h"
++#include "utils/file.h"
+ #include "utils/filepath.h"
+ #include "utils/log.h"
+ #include "utils/messages.h"
+@@ -61,6 +62,7 @@
+ fbtk_widget_t *fbtk;
+
+ static bool fb_complete = false;
++static char *fb_data_home;
+
+ struct gui_window *input_window = NULL;
+ struct gui_window *search_current_window;
+@@ -527,9 +529,18 @@ process_cmdline(int argc, char** argv)
+ */
+ static nserror set_defaults(struct nsoption_s *defaults)
+ {
++ char *fname;
++
+ /* Set defaults for absent option strings */
+- nsoption_setnull_charp(cookie_file, strdup("~/.netsurf/Cookies"));
+- nsoption_setnull_charp(cookie_jar, strdup("~/.netsurf/Cookies"));
++ fname = NULL;
++ netsurf_mkpath(&fname, NULL, 2, fb_data_home, "Cookies");
++ if (fname != NULL)
++ nsoption_setnull_charp(cookie_file, fname);
++
++ fname = NULL;
++ netsurf_mkpath(&fname, NULL, 2, fb_data_home, "Cookies");
++ if (fname != NULL)
++ nsoption_setnull_charp(cookie_jar, fname);
+
+ if (nsoption_charp(cookie_file) == NULL ||
+ nsoption_charp(cookie_jar) == NULL) {
+@@ -2076,6 +2087,34 @@ static struct gui_misc_table framebuffer_misc_table = {
+ .quit = gui_quit,
+ };
+
++static nserror get_data_home(char **data_home_out)
++{
++ nserror ret;
++ char *xdg_data_home, *data_home, *home;
++
++ xdg_data_home = getenv("XDG_DATA_HOME");
++ if ((xdg_data_home == NULL) || (*xdg_data_home == '\0')) {
++ home = getenv("HOME");
++ if (home == NULL)
++ return NSERROR_NOT_DIRECTORY;
++ ret = netsurf_mkpath(&data_home, NULL, 5, home, ".local", "share", "netsurf", "/");
++ } else {
++ ret = netsurf_mkpath(&data_home, NULL, 3, xdg_data_home, "netsurf", "/");
++ }
++ if (ret != NSERROR_OK)
++ return ret;
++
++ ret = netsurf_mkdir_all(data_home);
++ if (ret != NSERROR_OK) {
++ free(data_home);
++ return ret;
++ }
++ data_home[strlen(data_home) - 1] = 0;
++ *data_home_out = data_home;
++
++ return NSERROR_OK;
++}
++
+ /** Entry point from OS.
+ *
+ * /param argc The number of arguments in the string vector.
+@@ -2106,6 +2145,11 @@ main(int argc, char** argv)
+ die("NetSurf operation table failed registration");
+ }
+
++ ret = get_data_home(&fb_data_home);
++ if (ret != NSERROR_OK) {
++ die("Failed to get home data directory");
++ }
++
+ respaths = fb_init_resource(NETSURF_FB_RESPATH":"NETSURF_FB_FONTPATH);
+
+ /* initialise logging. Not fatal if it fails but not much we
+--
+2.11.0
+
diff --git a/pkg/netsurf/patch/0004-framebuffer-Fix-font-layout-function-return-values.patch b/pkg/netsurf/patch/0004-framebuffer-Fix-font-layout-function-return-values.patch
new file mode 100644
index 00000000..accd9cc0
--- /dev/null
+++ b/pkg/netsurf/patch/0004-framebuffer-Fix-font-layout-function-return-values.patch
@@ -0,0 +1,112 @@
+From 507e82825f659742b76df9179e59975b3bd55b30 Mon Sep 17 00:00:00 2001
+From: Michael Forney <mforney@mforney.org>
+Date: Sun, 25 Dec 2016 00:23:34 -0800
+Subject: [PATCH] framebuffer: Fix font layout function return values
+
+The return type is nserror, so they should return NSERROR_OK, not true.
+---
+ frontends/framebuffer/font_freetype.c | 10 +++++-----
+ frontends/framebuffer/font_internal.c | 10 +++++-----
+ 2 files changed, 10 insertions(+), 10 deletions(-)
+
+diff --git a/frontends/framebuffer/font_freetype.c b/frontends/framebuffer/font_freetype.c
+index 9235ad476..42be6d443 100644
+--- a/frontends/framebuffer/font_freetype.c
++++ b/frontends/framebuffer/font_freetype.c
+@@ -445,7 +445,7 @@ fb_font_width(const plot_font_style_t *fstyle,
+ *width += glyph->advance.x >> 16;
+ }
+
+- return true;
++ return NSERROR_OK;
+ }
+
+
+@@ -481,7 +481,7 @@ fb_font_position(const plot_font_style_t *fstyle,
+ *actual_x = prev_x;
+
+ *char_offset = nxtchr;
+- return true;
++ return NSERROR_OK;
+ }
+
+
+@@ -494,7 +494,7 @@ fb_font_position(const plot_font_style_t *fstyle,
+ * \param x width available
+ * \param char_offset updated to offset in string of actual_x, [1..length]
+ * \param actual_x updated to x coordinate of character closest to x
+- * \return true on success, false on error and error reported
++ * \return NSERROR_OK on success or error code on failure
+ *
+ * On exit, char_offset indicates first character after split point.
+ *
+@@ -537,7 +537,7 @@ fb_font_split(const plot_font_style_t *fstyle,
+ * found a space; return previous space */
+ *actual_x = last_space_x;
+ *char_offset = last_space_idx;
+- return true;
++ return NSERROR_OK;
+ }
+
+ nxtchr = utf8_next(string, length, nxtchr);
+@@ -545,7 +545,7 @@ fb_font_split(const plot_font_style_t *fstyle,
+
+ *char_offset = nxtchr;
+
+- return true;
++ return NSERROR_OK;
+ }
+
+ static struct gui_layout_table layout_table = {
+diff --git a/frontends/framebuffer/font_internal.c b/frontends/framebuffer/font_internal.c
+index 9164a29db..a9054098f 100644
+--- a/frontends/framebuffer/font_internal.c
++++ b/frontends/framebuffer/font_internal.c
+@@ -364,7 +364,7 @@ fb_font_width(const plot_font_style_t *fstyle,
+ }
+
+ *width *= fb_get_font_size(fstyle);
+- return true;
++ return NSERROR_OK;
+ }
+
+
+@@ -397,7 +397,7 @@ fb_font_position(const plot_font_style_t *fstyle,
+ *actual_x = x_pos;
+
+ *char_offset = nxtchr;
+- return true;
++ return NSERROR_OK;
+ }
+
+
+@@ -410,7 +410,7 @@ fb_font_position(const plot_font_style_t *fstyle,
+ * \param x width available
+ * \param char_offset updated to offset in string of actual_x, [1..length]
+ * \param actual_x updated to x coordinate of character closest to x
+- * \return true on success, false on error and error reported
++ * \return NSERROR_OK on success or error code on failure
+ *
+ * On exit, char_offset indicates first character after split point.
+ *
+@@ -455,7 +455,7 @@ fb_font_split(const plot_font_style_t *fstyle,
+ * found a space; return previous space */
+ *actual_x = last_space_x;
+ *char_offset = last_space_idx;
+- return true;
++ return NSERROR_OK;
+ }
+
+ nxtchr = utf8_next(string, length, nxtchr);
+@@ -463,7 +463,7 @@ fb_font_split(const plot_font_style_t *fstyle,
+
+ *char_offset = nxtchr;
+
+- return true;
++ return NSERROR_OK;
+ }
+
+
+--
+2.11.0
+
diff --git a/pkg/netsurf/patch/0005-framebuffer-Use-XKB-key-events.patch b/pkg/netsurf/patch/0005-framebuffer-Use-XKB-key-events.patch
new file mode 100644
index 00000000..e79e4f4c
--- /dev/null
+++ b/pkg/netsurf/patch/0005-framebuffer-Use-XKB-key-events.patch
@@ -0,0 +1,558 @@
+From e8a794e1ee7422613be28dbe6263b5877d9bf840 Mon Sep 17 00:00:00 2001
+From: Michael Forney <mforney@mforney.org>
+Date: Sun, 25 Dec 2016 14:46:31 -0800
+Subject: [PATCH] framebuffer: Use XKB key events
+
+---
+ frontends/framebuffer/fbtk/event.c | 86 +------------
+ frontends/framebuffer/fbtk/text.c | 83 ++++---------
+ frontends/framebuffer/gui.c | 240 +++++++++++++++----------------------
+ 3 files changed, 128 insertions(+), 281 deletions(-)
+
+diff --git a/frontends/framebuffer/fbtk/event.c b/frontends/framebuffer/fbtk/event.c
+index a48e63809..29eed3286 100644
+--- a/frontends/framebuffer/fbtk/event.c
++++ b/frontends/framebuffer/fbtk/event.c
+@@ -224,6 +224,11 @@ fbtk_event(fbtk_widget_t *root, nsfb_event_t *event, int timeout)
+ }
+ break;
+
++ case NSFB_EVENT_XKB_KEY_DOWN:
++ case NSFB_EVENT_XKB_KEY_UP:
++ fbtk_input(root, event);
++ break;
++
+ case NSFB_EVENT_CONTROL:
+ unused = true;
+ break;
+@@ -261,87 +266,6 @@ fbtk_event(fbtk_widget_t *root, nsfb_event_t *event, int timeout)
+ return unused;
+ }
+
+-static int keymap[] = {
+- /* 0 1 2 3 4 5 6 7 8 9 */
+- -1, -1, -1, -1, -1, -1, -1, -1, 8, 9, /* 0 - 9 */
+- -1, -1, -1, 13, -1, -1, -1, -1, -1, -1, /* 10 - 19 */
+- -1, -1, -1, -1, -1, -1, -1, 27, -1, -1, /* 20 - 29 */
+- -1, -1, ' ', '!', '"', '#', '$', -1, '&','\'', /* 30 - 39 */
+- '(', ')', '*', '+', ',', '-', '.', '/', '0', '1', /* 40 - 49 */
+- '2', '3', '4', '5', '6', '7', '8', '9', ':', ';', /* 50 - 59 */
+- '<', '=', '>', '?', '@', -1, -1, -1, -1, -1, /* 60 - 69 */
+- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 70 - 79 */
+- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 80 - 89 */
+- -1, '[','\\', ']', '~', '_', '`', 'a', 'b', 'c', /* 90 - 99 */
+- 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', /* 100 - 109 */
+- 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', /* 110 - 119 */
+- 'x', 'y', 'z', -1, -1, -1, -1, -1, -1, -1, /* 120 - 129 */
+-};
+-
+-static int sh_keymap[] = {
+- /* 0 1 2 3 4 5 6 7 8 9 */
+- -1, -1, -1, -1, -1, -1, -1, -1, 8, 9, /* 0 - 9 */
+- -1, -1, -1, 13, -1, -1, -1, -1, -1, -1, /* 10 - 19 */
+- -1, -1, -1, -1, -1, -1, -1, 27, -1, -1, /* 20 - 29 */
+- -1, -1, ' ', '!', '"', '~', '$', -1, '&', '@', /* 30 - 39 */
+- '(', ')', '*', '+', '<', '_', '>', '?', ')', '!', /* 40 - 49 */
+- '"', 243, '$', '%', '^', '&', '*', '(', ';', ':', /* 50 - 59 */
+- '<', '+', '>', '?', '@', -1, -1, -1, -1, -1, /* 60 - 69 */
+- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 70 - 79 */
+- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 80 - 89 */
+- -1, '{', '|', '}', '~', '_', 254, 'A', 'B', 'C', /* 90 - 99 */
+- 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', /* 100 - 109 */
+- 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', /* 110 - 119 */
+- 'X', 'Y', 'Z', -1, -1, -1, -1, -1, -1, -1, /* 120 - 129 */
+-};
+-
+-
+-/* exported function documented in fbtk.h */
+-int
+-fbtk_keycode_to_ucs4(int code, fbtk_modifier_type mods)
+-{
+- int ucs4 = -1;
+-
+- if (mods & FBTK_MOD_LSHIFT || mods & FBTK_MOD_RSHIFT) {
+- if ((code >= 0) && (code < (int) NOF_ELEMENTS(sh_keymap)))
+- ucs4 = sh_keymap[code];
+-
+- } else if (mods == FBTK_MOD_CLEAR) {
+- if ((code >= 0) && (code < (int) NOF_ELEMENTS(keymap)))
+- ucs4 = keymap[code];
+-
+- } else if (mods & FBTK_MOD_LCTRL || mods & FBTK_MOD_RCTRL) {
+- switch (code) {
+- case NSFB_KEY_a:
+- ucs4 = NS_KEY_SELECT_ALL;
+- break;
+-
+- case NSFB_KEY_c:
+- ucs4 = NS_KEY_COPY_SELECTION;
+- break;
+-
+- case NSFB_KEY_u:
+- ucs4 = NS_KEY_DELETE_LINE;
+- break;
+-
+- case NSFB_KEY_v:
+- ucs4 = NS_KEY_PASTE;
+- break;
+-
+- case NSFB_KEY_x:
+- ucs4 = NS_KEY_CUT_SELECTION;
+- break;
+-
+- case NSFB_KEY_z:
+- ucs4 = NS_KEY_CLEAR_SELECTION;
+- break;
+- default:
+- break;
+- }
+- }
+- return ucs4;
+-}
+-
+ /*
+ * Local Variables:
+ * c-basic-offset:8
+diff --git a/frontends/framebuffer/fbtk/text.c b/frontends/framebuffer/fbtk/text.c
+index 00dcba491..95333a52f 100644
+--- a/frontends/framebuffer/fbtk/text.c
++++ b/frontends/framebuffer/fbtk/text.c
+@@ -26,6 +26,7 @@
+ #include <libnsfb_plot.h>
+ #include <libnsfb_plot_util.h>
+ #include <libnsfb_event.h>
++#include <xkbcommon/xkbcommon.h>
+
+ #include "utils/log.h"
+ #include "netsurf/browser_window.h"
+@@ -287,13 +288,14 @@ fb_text_input_remove_caret_cb(fbtk_widget_t *widget)
+ static int
+ text_input(fbtk_widget_t *widget, fbtk_callback_info *cbi)
+ {
+- int value;
+- static fbtk_modifier_type modifier = FBTK_MOD_CLEAR;
++ xkb_keysym_t sym;
++ enum nsfb_mod_e mods;
+ char *temp;
+ plot_font_style_t font_style;
+ int fh;
+ int border;
+ bool caret_moved = false;
++ uint32_t key;
+
+ fb_text_font_style(widget, &fh, &border, &font_style);
+
+@@ -305,34 +307,14 @@ text_input(fbtk_widget_t *widget, fbtk_callback_info *cbi)
+ return 0;
+ }
+
+- value = cbi->event->value.keycode;
+-
+- if (cbi->event->type != NSFB_EVENT_KEY_DOWN) {
+- switch (value) {
+- case NSFB_KEY_RSHIFT:
+- modifier &= ~FBTK_MOD_RSHIFT;
+- break;
+-
+- case NSFB_KEY_LSHIFT:
+- modifier &= ~FBTK_MOD_LSHIFT;
+- break;
+-
+- case NSFB_KEY_RCTRL:
+- modifier &= ~FBTK_MOD_RCTRL;
+- break;
+-
+- case NSFB_KEY_LCTRL:
+- modifier &= ~FBTK_MOD_LCTRL;
+- break;
+-
+- default:
+- break;
+- }
++ if (cbi->event->type != NSFB_EVENT_XKB_KEY_DOWN)
+ return 0;
+- }
+
+- switch (value) {
+- case NSFB_KEY_BACKSPACE:
++ sym = cbi->event->value.xkb.sym;
++ mods = cbi->event->value.xkb.mod;
++
++ switch (sym) {
++ case XKB_KEY_BackSpace:
+ if (widget->u.text.idx <= 0)
+ break;
+ memmove(widget->u.text.text + widget->u.text.idx - 1,
+@@ -348,13 +330,13 @@ text_input(fbtk_widget_t *widget, fbtk_callback_info *cbi)
+ caret_moved = true;
+ break;
+
+- case NSFB_KEY_RETURN:
++ case XKB_KEY_Return:
+ widget->u.text.enter(widget->u.text.pw, widget->u.text.text);
+ break;
+
+- case NSFB_KEY_RIGHT:
++ case XKB_KEY_Right:
+ if (widget->u.text.idx < widget->u.text.len) {
+- if (modifier == FBTK_MOD_CLEAR)
++ if (mods == 0)
+ widget->u.text.idx++;
+ else
+ widget->u.text.idx = widget->u.text.len;
+@@ -363,9 +345,9 @@ text_input(fbtk_widget_t *widget, fbtk_callback_info *cbi)
+ }
+ break;
+
+- case NSFB_KEY_LEFT:
++ case XKB_KEY_Left:
+ if (widget->u.text.idx > 0) {
+- if (modifier == FBTK_MOD_CLEAR)
++ if (mods == 0)
+ widget->u.text.idx--;
+ else
+ widget->u.text.idx = 0;
+@@ -374,34 +356,18 @@ text_input(fbtk_widget_t *widget, fbtk_callback_info *cbi)
+ }
+ break;
+
+- case NSFB_KEY_PAGEUP:
+- case NSFB_KEY_PAGEDOWN:
+- case NSFB_KEY_UP:
+- case NSFB_KEY_DOWN:
++ case XKB_KEY_Page_Up:
++ case XKB_KEY_Page_Down:
++ case XKB_KEY_Up:
++ case XKB_KEY_Down:
+ /* Not handling any of these correctly yet, but avoid putting
+ * charcters in the text widget when they're pressed. */
+ break;
+
+- case NSFB_KEY_RSHIFT:
+- modifier |= FBTK_MOD_RSHIFT;
+- break;
+-
+- case NSFB_KEY_LSHIFT:
+- modifier |= FBTK_MOD_LSHIFT;
+- break;
+-
+- case NSFB_KEY_RCTRL:
+- modifier |= FBTK_MOD_RCTRL;
+- break;
+-
+- case NSFB_KEY_LCTRL:
+- modifier |= FBTK_MOD_LCTRL;
+- break;
+-
+ default:
+- if (modifier & FBTK_MOD_LCTRL || modifier & FBTK_MOD_RCTRL) {
++ if (mods & NSFB_MOD_CTRL) {
+ /* CTRL pressed, don't enter any text */
+- if (value == NSFB_KEY_u) {
++ if (sym == XKB_KEY_u) {
+ /* CTRL+U: clear writable */
+ widget->u.text.idx = 0;
+ widget->u.text.len = 0;
+@@ -412,6 +378,10 @@ text_input(fbtk_widget_t *widget, fbtk_callback_info *cbi)
+ break;
+ }
+
++ key = xkb_keysym_to_utf32(sym);
++ if (key == 0)
++ break;
++
+ /* allow for new character and null */
+ temp = realloc(widget->u.text.text, widget->u.text.len + 2);
+ if (temp == NULL) {
+@@ -422,8 +392,7 @@ text_input(fbtk_widget_t *widget, fbtk_callback_info *cbi)
+ memmove(widget->u.text.text + widget->u.text.idx + 1,
+ widget->u.text.text + widget->u.text.idx,
+ widget->u.text.len - widget->u.text.idx);
+- widget->u.text.text[widget->u.text.idx] =
+- fbtk_keycode_to_ucs4(value, modifier);
++ widget->u.text.text[widget->u.text.idx] = key;
+ widget->u.text.idx++;
+ widget->u.text.len++;
+ widget->u.text.text[widget->u.text.len] = '\0';
+diff --git a/frontends/framebuffer/gui.c b/frontends/framebuffer/gui.c
+index e176ac9e4..6bf5152c0 100644
+--- a/frontends/framebuffer/gui.c
++++ b/frontends/framebuffer/gui.c
+@@ -28,6 +28,7 @@
+ #include <libnsfb.h>
+ #include <libnsfb_plot.h>
+ #include <libnsfb_event.h>
++#include <xkbcommon/xkbcommon.h>
+
+ #include "utils/utils.h"
+ #include "utils/nsoption.h"
+@@ -831,170 +832,123 @@ static int
+ fb_browser_window_input(fbtk_widget_t *widget, fbtk_callback_info *cbi)
+ {
+ struct gui_window *gw = cbi->context;
+- static fbtk_modifier_type modifier = FBTK_MOD_CLEAR;
+- int ucs4 = -1;
++ xkb_keysym_t sym = cbi->event->value.xkb.sym;
++ enum nsfb_mod_e mods = cbi->event->value.xkb.mod;
++ uint32_t key;
+
+- LOG("got value %d", cbi->event->value.keycode);
+-
+- switch (cbi->event->type) {
+- case NSFB_EVENT_KEY_DOWN:
+- switch (cbi->event->value.keycode) {
+-
+- case NSFB_KEY_DELETE:
+- browser_window_key_press(gw->bw, NS_KEY_DELETE_RIGHT);
+- break;
++ if (cbi->event->type != NSFB_EVENT_XKB_KEY_DOWN)
++ return 0;
+
+- case NSFB_KEY_PAGEUP:
+- if (browser_window_key_press(gw->bw,
+- NS_KEY_PAGE_UP) == false)
+- widget_scroll_y(gw, -fbtk_get_height(
+- gw->browser), false);
+- break;
++ LOG("got value %d", cbi->event->value.xkb.sym);
+
+- case NSFB_KEY_PAGEDOWN:
+- if (browser_window_key_press(gw->bw,
+- NS_KEY_PAGE_DOWN) == false)
+- widget_scroll_y(gw, fbtk_get_height(
+- gw->browser), false);
+- break;
++ switch (sym) {
++ case XKB_KEY_Delete:
++ browser_window_key_press(gw->bw, NS_KEY_DELETE_RIGHT);
++ break;
+
+- case NSFB_KEY_RIGHT:
+- if (modifier & FBTK_MOD_RCTRL ||
+- modifier & FBTK_MOD_LCTRL) {
+- /* CTRL held */
+- if (browser_window_key_press(gw->bw,
+- NS_KEY_LINE_END) == false)
+- widget_scroll_x(gw, INT_MAX, true);
+-
+- } else if (modifier & FBTK_MOD_RSHIFT ||
+- modifier & FBTK_MOD_LSHIFT) {
+- /* SHIFT held */
+- if (browser_window_key_press(gw->bw,
+- NS_KEY_WORD_RIGHT) == false)
+- widget_scroll_x(gw, fbtk_get_width(
+- gw->browser), false);
++ case XKB_KEY_Page_Up:
++ if (browser_window_key_press(gw->bw,
++ NS_KEY_PAGE_UP) == false)
++ widget_scroll_y(gw, -fbtk_get_height(
++ gw->browser), false);
++ break;
+
+- } else {
+- /* no modifier */
+- if (browser_window_key_press(gw->bw,
+- NS_KEY_RIGHT) == false)
+- widget_scroll_x(gw, 100, false);
+- }
+- break;
++ case XKB_KEY_Page_Down:
++ if (browser_window_key_press(gw->bw,
++ NS_KEY_PAGE_DOWN) == false)
++ widget_scroll_y(gw, fbtk_get_height(
++ gw->browser), false);
++ break;
+
+- case NSFB_KEY_LEFT:
+- if (modifier & FBTK_MOD_RCTRL ||
+- modifier & FBTK_MOD_LCTRL) {
+- /* CTRL held */
+- if (browser_window_key_press(gw->bw,
+- NS_KEY_LINE_START) == false)
+- widget_scroll_x(gw, 0, true);
+-
+- } else if (modifier & FBTK_MOD_RSHIFT ||
+- modifier & FBTK_MOD_LSHIFT) {
+- /* SHIFT held */
+- if (browser_window_key_press(gw->bw,
+- NS_KEY_WORD_LEFT) == false)
+- widget_scroll_x(gw, -fbtk_get_width(
+- gw->browser), false);
++ case XKB_KEY_Right:
++ if (mods & NSFB_MOD_CTRL) {
++ /* CTRL held */
++ if (browser_window_key_press(gw->bw,
++ NS_KEY_LINE_END) == false)
++ widget_scroll_x(gw, INT_MAX, true);
+
+- } else {
+- /* no modifier */
+- if (browser_window_key_press(gw->bw,
+- NS_KEY_LEFT) == false)
+- widget_scroll_x(gw, -100, false);
+- }
+- break;
++ } else if (mods & NSFB_MOD_SHIFT) {
++ /* SHIFT held */
++ if (browser_window_key_press(gw->bw,
++ NS_KEY_WORD_RIGHT) == false)
++ widget_scroll_x(gw, fbtk_get_width(
++ gw->browser), false);
+
+- case NSFB_KEY_UP:
++ } else {
++ /* no modifier */
+ if (browser_window_key_press(gw->bw,
+- NS_KEY_UP) == false)
+- widget_scroll_y(gw, -100, false);
+- break;
++ NS_KEY_RIGHT) == false)
++ widget_scroll_x(gw, 100, false);
++ }
++ break;
+
+- case NSFB_KEY_DOWN:
++ case XKB_KEY_Left:
++ if (mods & NSFB_MOD_CTRL) {
++ /* CTRL held */
+ if (browser_window_key_press(gw->bw,
+- NS_KEY_DOWN) == false)
+- widget_scroll_y(gw, 100, false);
+- break;
++ NS_KEY_LINE_START) == false)
++ widget_scroll_x(gw, 0, true);
+
+- case NSFB_KEY_RSHIFT:
+- modifier |= FBTK_MOD_RSHIFT;
+- break;
++ } else if (mods & NSFB_MOD_SHIFT) {
++ /* SHIFT held */
++ if (browser_window_key_press(gw->bw,
++ NS_KEY_WORD_LEFT) == false)
++ widget_scroll_x(gw, -fbtk_get_width(
++ gw->browser), false);
+
+- case NSFB_KEY_LSHIFT:
+- modifier |= FBTK_MOD_LSHIFT;
+- break;
++ } else {
++ /* no modifier */
++ if (browser_window_key_press(gw->bw,
++ NS_KEY_LEFT) == false)
++ widget_scroll_x(gw, -100, false);
++ }
++ break;
+
+- case NSFB_KEY_RCTRL:
+- modifier |= FBTK_MOD_RCTRL;
+- break;
++ case XKB_KEY_Up:
++ if (browser_window_key_press(gw->bw,
++ NS_KEY_UP) == false)
++ widget_scroll_y(gw, -100, false);
++ break;
+
+- case NSFB_KEY_LCTRL:
+- modifier |= FBTK_MOD_LCTRL;
+- break;
++ case XKB_KEY_Down:
++ if (browser_window_key_press(gw->bw,
++ NS_KEY_DOWN) == false)
++ widget_scroll_y(gw, 100, false);
++ break;
+
+- case NSFB_KEY_y:
+- case NSFB_KEY_z:
+- if (cbi->event->value.keycode == NSFB_KEY_z &&
+- (modifier & FBTK_MOD_RCTRL ||
+- modifier & FBTK_MOD_LCTRL) &&
+- (modifier & FBTK_MOD_RSHIFT ||
+- modifier & FBTK_MOD_LSHIFT)) {
+- /* Z pressed with CTRL and SHIFT held */
+- browser_window_key_press(gw->bw, NS_KEY_REDO);
++ default:
++ if (mods & NSFB_MOD_CTRL) {
++ switch (sym) {
++ case XKB_KEY_a:
++ key = NS_KEY_SELECT_ALL;
+ break;
+-
+- } else if (cbi->event->value.keycode == NSFB_KEY_z &&
+- (modifier & FBTK_MOD_RCTRL ||
+- modifier & FBTK_MOD_LCTRL)) {
+- /* Z pressed with CTRL held */
+- browser_window_key_press(gw->bw, NS_KEY_UNDO);
++ case XKB_KEY_c:
++ key = NS_KEY_COPY_SELECTION;
+ break;
+-
+- } else if (cbi->event->value.keycode == NSFB_KEY_y &&
+- (modifier & FBTK_MOD_RCTRL ||
+- modifier & FBTK_MOD_LCTRL)) {
+- /* Y pressed with CTRL held */
+- browser_window_key_press(gw->bw, NS_KEY_REDO);
++ case XKB_KEY_u:
++ key = NS_KEY_DELETE_LINE;
++ break;
++ case XKB_KEY_v:
++ key = NS_KEY_PASTE;
++ break;
++ case XKB_KEY_x:
++ key = NS_KEY_CUT_SELECTION;
++ break;
++ case XKB_KEY_y:
++ key = NS_KEY_REDO;
++ break;
++ case XKB_KEY_z:
++ key = mods & NSFB_MOD_SHIFT ? NS_KEY_REDO : NS_KEY_UNDO;
++ break;
++ default:
++ key = 0;
+ break;
+ }
+- /* Z or Y pressed but not undo or redo;
+- * Fall through to default handling */
+-
+- default:
+- ucs4 = fbtk_keycode_to_ucs4(cbi->event->value.keycode,
+- modifier);
+- if (ucs4 != -1)
+- browser_window_key_press(gw->bw, ucs4);
+- break;
+- }
+- break;
+-
+- case NSFB_EVENT_KEY_UP:
+- switch (cbi->event->value.keycode) {
+- case NSFB_KEY_RSHIFT:
+- modifier &= ~FBTK_MOD_RSHIFT;
+- break;
+-
+- case NSFB_KEY_LSHIFT:
+- modifier &= ~FBTK_MOD_LSHIFT;
+- break;
+-
+- case NSFB_KEY_RCTRL:
+- modifier &= ~FBTK_MOD_RCTRL;
+- break;
+-
+- case NSFB_KEY_LCTRL:
+- modifier &= ~FBTK_MOD_LCTRL;
+- break;
+-
+- default:
+- break;
+ }
+- break;
+-
+- default:
++ if (key == 0)
++ key = xkb_keysym_to_utf32(cbi->event->value.xkb.sym);
++ if (key != 0)
++ browser_window_key_press(gw->bw, key);
+ break;
+ }
+
+--
+2.11.0
+