From 8840a844f178d16ff451726c7622ebf3d5110e71 Mon Sep 17 00:00:00 2001 From: Eivind Magnus Hvidevold Date: Fri, 30 Jan 2015 18:42:34 +0100 Subject: [PATCH] Add multibyte support. Increased vim.js compiled size from 25MB to 44MB. It is disabled by default. Uses builtin emscripten UTF8 functions. --- build.sh | 2 +- web/usr/local/share/vim/vimrc | 2 ++ web/vim_lib.js | 27 ++++++++++++++++++++++----- 3 files changed, 25 insertions(+), 6 deletions(-) diff --git a/build.sh b/build.sh index d16a029..3227ead 100755 --- a/build.sh +++ b/build.sh @@ -1,6 +1,6 @@ #!/bin/bash set -e -[ -z $EM_DIR] && EM_DIR=~/src/emscripten +[ -z "$EM_DIR" ] && EM_DIR=~/src/emscripten do_config() { echo config diff --git a/web/usr/local/share/vim/vimrc b/web/usr/local/share/vim/vimrc index 39cf7e4..b99c257 100644 --- a/web/usr/local/share/vim/vimrc +++ b/web/usr/local/share/vim/vimrc @@ -55,6 +55,8 @@ set wildmenu set tabstop=4 set expandtab set nocompatible +set encoding=utf8 +set termencoding=utf8 set fileencodings=utf8 set backspace=indent,eol,start set wildmode=longest,list,full diff --git a/web/vim_lib.js b/web/vim_lib.js index 0792b28..9dafd79 100644 --- a/web/vim_lib.js +++ b/web/vim_lib.js @@ -91,8 +91,19 @@ var LibraryVIM = { } } - if(!handled) - vimjs.gui_web_handle_key(charCode || keyCode, modifiers, 0, 0); + if(!handled) { + var MAX_UTF8_BYTES = 6; + var chars = new Uint8Array(MAX_UTF8_BYTES + 1); // null-terminated + var charLen = stringToUTF8Array(String.fromCharCode(charCode), chars, 0, MAX_UTF8_BYTES); + if (charLen == 1) { + vimjs.gui_web_handle_key(chars[0], modifiers, 0, 0); + } else { + // no modifers for UTF-8, should be handled in chars already + for (var i = 0; i < charLen; i++) { + vimjs.gui_web_handle_key(chars[i], 0, 0, 0); + } + } + } },//VIMJS_FOLD_END @@ -778,7 +789,15 @@ var LibraryVIM = { }, vimjs_draw_string__deps: ['vimjs_clear_block'], - vimjs_draw_string: function(row, col, s, len, flags) { + vimjs_draw_string: function(row, col, s_ptr, len, flags) { + var byteArray = []; + for (var i = 0; i < len; i++) { + c = getValue(s_ptr + i, 'i8', true); + byteArray.push(c); + } + byteArray.push(0); + var s = UTF8ArrayToString(byteArray, 0); + len = s.length; // TODO: use macros for flag constants if(!(flags & 0x01)) { @@ -788,8 +807,6 @@ var LibraryVIM = { var font = vimjs.font; if(flags & 0x02) font = 'bold ' + font; - s = Pointer_stringify(s, len); - var ctx = vimjs.canvas_ctx; ctx.font = font;