summaryrefslogtreecommitdiffstats
path: root/osdep
diff options
context:
space:
mode:
authorwm4 <wm4@mplayer2.org>2012-01-13 07:59:21 +0100
committerUoti Urpala <uau@mplayer2.org>2012-03-25 22:30:37 +0300
commit7ea5c4c26c9c47639a1962385d9cacd531ba8466 (patch)
tree4f11ab7c989d9ed982acd4adff6a6004b72c35f2 /osdep
parent166a7de4cf94a78c34040b47a929a72d12f2945f (diff)
downloadmpv-7ea5c4c26c9c47639a1962385d9cacd531ba8466.tar.bz2
mpv-7ea5c4c26c9c47639a1962385d9cacd531ba8466.tar.xz
input: handle UTF-8 terminal input
This assumes the terminal uses UTF-8. If invalid UTF-8 is encountered (for example because the terminal uses a legacy encoding), the code falls back to the old method and feeds each byte as key code to the input code. In theory, UTF-8 input could randomly fail, because the code in getch2.c doesn't try to fill the input buffer correctly with input sequences longer than a byte. This is a problem with the design of the existing code.
Diffstat (limited to 'osdep')
-rw-r--r--osdep/getch2.c11
1 files changed, 11 insertions, 0 deletions
diff --git a/osdep/getch2.c b/osdep/getch2.c
index f421bdea7e..1a92866afd 100644
--- a/osdep/getch2.c
+++ b/osdep/getch2.c
@@ -57,6 +57,7 @@
#include <unistd.h>
#include <fcntl.h>
+#include "bstr.h"
#include "mp_fifo.h"
#include "input/keycodes.h"
#include "getch2.h"
@@ -201,6 +202,16 @@ void getch2(struct mp_fifo *fifo)
len = 2;
}
code = KEY_ENTER;
+ } else {
+ int utf8len = bstr_parse_utf8_code_length(code);
+ if (utf8len > 0 && utf8len <= getch2_len) {
+ struct bstr s = { getch2_buf, utf8len };
+ int unicode = bstr_decode_utf8(s, NULL);
+ if (unicode > 0) {
+ len = utf8len;
+ code = unicode;
+ }
+ }
}
}
else if (getch2_len > 1) {