parent
28447d3389
commit
000c1cf306
@ -41,9 +41,9 @@ Changelog
|
|||||||
- The :opt:`focus_follows_mouse` option now also works across top-level kitty OS windows
|
- The :opt:`focus_follows_mouse` option now also works across top-level kitty OS windows
|
||||||
(:iss:`754`)
|
(:iss:`754`)
|
||||||
|
|
||||||
|
|
||||||
- Fix detection of URLs in HTML source code (URLs inside quotes) (:iss:`785`)
|
- Fix detection of URLs in HTML source code (URLs inside quotes) (:iss:`785`)
|
||||||
|
|
||||||
|
- Implement support for emoji skin tone modifiers (:iss:`787`)
|
||||||
|
|
||||||
0.11.3 [2018-07-10]
|
0.11.3 [2018-07-10]
|
||||||
------------------------------
|
------------------------------
|
||||||
|
|||||||
@ -20,6 +20,7 @@ non_characters |= frozenset(range(0xffff, 0x10ffff + 1, 0x10000))
|
|||||||
non_characters |= frozenset(range(0xfdd0, 0xfdf0))
|
non_characters |= frozenset(range(0xfdd0, 0xfdf0))
|
||||||
if len(non_characters) != 66:
|
if len(non_characters) != 66:
|
||||||
raise SystemExit('non_characters table incorrect')
|
raise SystemExit('non_characters table incorrect')
|
||||||
|
emoji_skin_tone_modifiers = frozenset(range(0x1f3fb, 0x1F3FF + 1))
|
||||||
|
|
||||||
|
|
||||||
def get_data(fname, folder='UCD'):
|
def get_data(fname, folder='UCD'):
|
||||||
@ -41,7 +42,7 @@ def get_data(fname, folder='UCD'):
|
|||||||
class_maps = {}
|
class_maps = {}
|
||||||
name_map = {}
|
name_map = {}
|
||||||
word_search_map = defaultdict(set)
|
word_search_map = defaultdict(set)
|
||||||
marks = set()
|
marks = set(emoji_skin_tone_modifiers)
|
||||||
not_assigned = set(range(0, sys.maxunicode))
|
not_assigned = set(range(0, sys.maxunicode))
|
||||||
|
|
||||||
|
|
||||||
@ -251,7 +252,13 @@ def gen_ucd():
|
|||||||
cz = {c for c in class_maps if c[0] in 'CZ'}
|
cz = {c for c in class_maps if c[0] in 'CZ'}
|
||||||
with create_header('kitty/unicode-data.c') as p:
|
with create_header('kitty/unicode-data.c') as p:
|
||||||
p('#include "unicode-data.h"')
|
p('#include "unicode-data.h"')
|
||||||
category_test('is_combining_char', p, {c for c in class_maps if c.startswith('M')}, 'M category (marks)')
|
category_test(
|
||||||
|
'is_combining_char', p,
|
||||||
|
{c for c in class_maps if c.startswith('M')},
|
||||||
|
'M category (marks)',
|
||||||
|
# See https://github.com/harfbuzz/harfbuzz/issues/169
|
||||||
|
extra_chars=emoji_skin_tone_modifiers
|
||||||
|
)
|
||||||
category_test('is_ignored_char', p, 'Cc Cf Cs'.split(), 'Control characters and non-characters', extra_chars=non_characters)
|
category_test('is_ignored_char', p, 'Cc Cf Cs'.split(), 'Control characters and non-characters', extra_chars=non_characters)
|
||||||
category_test('is_word_char', p, {c for c in class_maps if c[0] in 'LN'}, 'L and N categories')
|
category_test('is_word_char', p, {c for c in class_maps if c[0] in 'LN'}, 'L and N categories')
|
||||||
category_test('is_CZ_category', p, cz, 'C and Z categories')
|
category_test('is_CZ_category', p, cz, 'C and Z categories')
|
||||||
|
|||||||
2
kittens/unicode_input/names.h
generated
2
kittens/unicode_input/names.h
generated
@ -1,4 +1,4 @@
|
|||||||
// unicode data, built from the unicode standard on: 2018-06-14
|
// unicode data, built from the unicode standard on: 2018-08-04
|
||||||
// see gen-wcwidth.py
|
// see gen-wcwidth.py
|
||||||
#pragma once
|
#pragma once
|
||||||
#include "data-types.h"
|
#include "data-types.h"
|
||||||
|
|||||||
2
kitty/emoji.h
generated
2
kitty/emoji.h
generated
@ -1,4 +1,4 @@
|
|||||||
// unicode data, built from the unicode standard on: 2018-06-14
|
// unicode data, built from the unicode standard on: 2018-08-04
|
||||||
// see gen-wcwidth.py
|
// see gen-wcwidth.py
|
||||||
#pragma once
|
#pragma once
|
||||||
#include "data-types.h"
|
#include "data-types.h"
|
||||||
|
|||||||
@ -304,7 +304,10 @@ width(Line *self, PyObject *val) {
|
|||||||
void
|
void
|
||||||
line_add_combining_char(Line *self, uint32_t ch, unsigned int x) {
|
line_add_combining_char(Line *self, uint32_t ch, unsigned int x) {
|
||||||
CPUCell *cell = self->cpu_cells + x;
|
CPUCell *cell = self->cpu_cells + x;
|
||||||
if (!cell->ch) return; // dont allow adding combining chars to a null cell
|
if (!cell->ch) {
|
||||||
|
if (x > 0 && (self->gpu_cells[x-1].attrs & WIDTH_MASK) == 2 && self->cpu_cells[x-1].ch) cell = self->cpu_cells + x - 1;
|
||||||
|
else return; // dont allow adding combining chars to a null cell
|
||||||
|
}
|
||||||
for (unsigned i = 0; i < arraysz(cell->cc_idx); i++) {
|
for (unsigned i = 0; i < arraysz(cell->cc_idx); i++) {
|
||||||
if (!cell->cc_idx[i]) { cell->cc_idx[i] = mark_for_codepoint(ch); return; }
|
if (!cell->cc_idx[i]) { cell->cc_idx[i] = mark_for_codepoint(ch); return; }
|
||||||
}
|
}
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
12
kitty/wcwidth-std.h
generated
12
kitty/wcwidth-std.h
generated
@ -1,4 +1,4 @@
|
|||||||
// unicode data, built from the unicode standard on: 2018-06-14
|
// unicode data, built from the unicode standard on: 2018-08-04
|
||||||
// see gen-wcwidth.py
|
// see gen-wcwidth.py
|
||||||
#pragma once
|
#pragma once
|
||||||
#include "data-types.h"
|
#include "data-types.h"
|
||||||
@ -8,7 +8,7 @@ START_ALLOW_CASE_RANGE
|
|||||||
static int
|
static int
|
||||||
wcwidth_std(int32_t code) {
|
wcwidth_std(int32_t code) {
|
||||||
switch(code) {
|
switch(code) {
|
||||||
// Marks (2234 codepoints) {{{
|
// Marks (2239 codepoints) {{{
|
||||||
case 0x0:
|
case 0x0:
|
||||||
return 0;
|
return 0;
|
||||||
case 0x300 ... 0x36f:
|
case 0x300 ... 0x36f:
|
||||||
@ -559,6 +559,8 @@ wcwidth_std(int32_t code) {
|
|||||||
return 0;
|
return 0;
|
||||||
case 0x1e944 ... 0x1e94a:
|
case 0x1e944 ... 0x1e94a:
|
||||||
return 0;
|
return 0;
|
||||||
|
case 0x1f3fb ... 0x1f3ff:
|
||||||
|
return 0;
|
||||||
case 0xe0100 ... 0xe01ef:
|
case 0xe0100 ... 0xe01ef:
|
||||||
return 0;
|
return 0;
|
||||||
// }}}
|
// }}}
|
||||||
@ -1209,7 +1211,7 @@ wcwidth_std(int32_t code) {
|
|||||||
return -2;
|
return -2;
|
||||||
// }}}
|
// }}}
|
||||||
|
|
||||||
// East Asian double width (181796 codepoints) {{{
|
// East Asian double width (181791 codepoints) {{{
|
||||||
case 0x1100 ... 0x115f:
|
case 0x1100 ... 0x115f:
|
||||||
return 2;
|
return 2;
|
||||||
case 0x231a ... 0x231b:
|
case 0x231a ... 0x231b:
|
||||||
@ -1386,7 +1388,9 @@ wcwidth_std(int32_t code) {
|
|||||||
return 2;
|
return 2;
|
||||||
case 0x1f3f4:
|
case 0x1f3f4:
|
||||||
return 2;
|
return 2;
|
||||||
case 0x1f3f8 ... 0x1f43e:
|
case 0x1f3f8 ... 0x1f3fa:
|
||||||
|
return 2;
|
||||||
|
case 0x1f400 ... 0x1f43e:
|
||||||
return 2;
|
return 2;
|
||||||
case 0x1f440:
|
case 0x1f440:
|
||||||
return 2;
|
return 2;
|
||||||
|
|||||||
@ -89,6 +89,13 @@ class TestScreen(BaseTest):
|
|||||||
self.ae(str(s.line(4)), 'a\u0306b1\u030623')
|
self.ae(str(s.line(4)), 'a\u0306b1\u030623')
|
||||||
self.ae((s.cursor.x, s.cursor.y), (2, 4))
|
self.ae((s.cursor.x, s.cursor.y), (2, 4))
|
||||||
|
|
||||||
|
def test_emoji_skin_tone_modifiers(self):
|
||||||
|
s = self.create_screen()
|
||||||
|
q = chr(0x1f469) + chr(0x1f3fd)
|
||||||
|
s.draw(q)
|
||||||
|
self.ae(str(s.line(0)), q)
|
||||||
|
self.ae(s.cursor.x, 2)
|
||||||
|
|
||||||
def test_char_manipulation(self):
|
def test_char_manipulation(self):
|
||||||
s = self.create_screen()
|
s = self.create_screen()
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user