Fix a regression in 0.26.0 that broke mapping of native keys who key codes did not fit in 21 bits
Fixes #5452
This commit is contained in:
parent
afada84f52
commit
992e90b0a3
@ -46,6 +46,8 @@ Detailed list of changes
|
|||||||
|
|
||||||
- hints kitten: hyperlink matching: Fix hints occasionally matching text on subsequent line as part of hyperlink (:pull:`5450`)
|
- hints kitten: hyperlink matching: Fix hints occasionally matching text on subsequent line as part of hyperlink (:pull:`5450`)
|
||||||
|
|
||||||
|
- Fix a regression in 0.26.0 that broke mapping of native keys who key codes did not fit in 21 bits (:iss:`5452`)
|
||||||
|
|
||||||
0.26.1 [2022-08-30]
|
0.26.1 [2022-08-30]
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
|||||||
28
kitty/keys.c
28
kitty/keys.c
@ -284,9 +284,9 @@ static PyMethodDef module_methods[] = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
// SingleKey {{{
|
// SingleKey {{{
|
||||||
typedef uint32_t keybitfield;
|
typedef uint64_t keybitfield;
|
||||||
#define KEY_BITS 21
|
#define KEY_BITS 51
|
||||||
#define MOD_BITS 10
|
#define MOD_BITS 12
|
||||||
#if 1 << (MOD_BITS-1) < GLFW_MOD_KITTY
|
#if 1 << (MOD_BITS-1) < GLFW_MOD_KITTY
|
||||||
#error "Not enough mod bits"
|
#error "Not enough mod bits"
|
||||||
#endif
|
#endif
|
||||||
@ -309,9 +309,9 @@ typedef struct {
|
|||||||
} SingleKey;
|
} SingleKey;
|
||||||
|
|
||||||
static inline void
|
static inline void
|
||||||
SingleKey_set_vals(SingleKey *self, long key, unsigned short mods, int is_native) {
|
SingleKey_set_vals(SingleKey *self, long long key, unsigned short mods, int is_native) {
|
||||||
if (key >= 0 && (unsigned long)key <= BIT_MASK(keybitfield, KEY_BITS)) {
|
if (key >= 0 && (unsigned long long)key <= BIT_MASK(keybitfield, KEY_BITS)) {
|
||||||
keybitfield k = (keybitfield)(unsigned long)key;
|
keybitfield k = (keybitfield)(unsigned long long)key;
|
||||||
self->key.key = k & BIT_MASK(keybitfield, KEY_BITS);
|
self->key.key = k & BIT_MASK(keybitfield, KEY_BITS);
|
||||||
}
|
}
|
||||||
if (!(mods & 1 << (MOD_BITS + 1))) self->key.mods = mods & BIT_MASK(u_int32_t, MOD_BITS);
|
if (!(mods & 1 << (MOD_BITS + 1))) self->key.mods = mods & BIT_MASK(u_int32_t, MOD_BITS);
|
||||||
@ -320,8 +320,8 @@ SingleKey_set_vals(SingleKey *self, long key, unsigned short mods, int is_native
|
|||||||
|
|
||||||
static PyObject *
|
static PyObject *
|
||||||
SingleKey_new(PyTypeObject *type, PyObject *args, PyObject *kw) {
|
SingleKey_new(PyTypeObject *type, PyObject *args, PyObject *kw) {
|
||||||
long key = -1; unsigned short mods = 1 << (MOD_BITS + 1); int is_native = -1;
|
long long key = -1; unsigned short mods = 1 << (MOD_BITS + 1); int is_native = -1;
|
||||||
if (!PyArg_ParseTupleAndKeywords(args, kw, "|Hpl", SingleKey_kwds, &mods, &is_native, &key)) return NULL;
|
if (!PyArg_ParseTupleAndKeywords(args, kw, "|HpL", SingleKey_kwds, &mods, &is_native, &key)) return NULL;
|
||||||
SingleKey *self = (SingleKey *)type->tp_alloc(type, 0);
|
SingleKey *self = (SingleKey *)type->tp_alloc(type, 0);
|
||||||
if (self) SingleKey_set_vals(self, key, mods, is_native);
|
if (self) SingleKey_set_vals(self, key, mods, is_native);
|
||||||
return (PyObject*)self;
|
return (PyObject*)self;
|
||||||
@ -341,8 +341,8 @@ SingleKey_repr(PyObject *s) {
|
|||||||
unsigned int mods = self->key.mods;
|
unsigned int mods = self->key.mods;
|
||||||
if (mods) pos += PyOS_snprintf(buf + pos, sizeof(buf) - pos, "mods=%u, ", mods);
|
if (mods) pos += PyOS_snprintf(buf + pos, sizeof(buf) - pos, "mods=%u, ", mods);
|
||||||
if (self->key.is_native) pos += PyOS_snprintf(buf + pos, sizeof(buf) - pos, "is_native=True, ");
|
if (self->key.is_native) pos += PyOS_snprintf(buf + pos, sizeof(buf) - pos, "is_native=True, ");
|
||||||
unsigned long key = self->key.key;
|
unsigned long long key = self->key.key;
|
||||||
if (key) pos += PyOS_snprintf(buf + pos, sizeof(buf) - pos, "key=%lu, ", key);
|
if (key) pos += PyOS_snprintf(buf + pos, sizeof(buf) - pos, "key=%llu, ", key);
|
||||||
if (buf[pos-1] == ' ') pos -= 2;
|
if (buf[pos-1] == ' ') pos -= 2;
|
||||||
pos += PyOS_snprintf(buf + pos, sizeof(buf) - pos, ")");
|
pos += PyOS_snprintf(buf + pos, sizeof(buf) - pos, ")");
|
||||||
return PyUnicode_FromString(buf);
|
return PyUnicode_FromString(buf);
|
||||||
@ -350,8 +350,8 @@ SingleKey_repr(PyObject *s) {
|
|||||||
|
|
||||||
static PyObject*
|
static PyObject*
|
||||||
SingleKey_get_key(SingleKey *self, void UNUSED *closure) {
|
SingleKey_get_key(SingleKey *self, void UNUSED *closure) {
|
||||||
const unsigned long val = self->key.key;
|
const unsigned long long val = self->key.key;
|
||||||
return PyLong_FromUnsignedLong(val);
|
return PyLong_FromUnsignedLongLong(val);
|
||||||
}
|
}
|
||||||
|
|
||||||
static PyObject*
|
static PyObject*
|
||||||
@ -436,8 +436,8 @@ SingleKey_resolve_kitty_mod(SingleKey *self, PyObject *km) {
|
|||||||
|
|
||||||
static PyObject*
|
static PyObject*
|
||||||
SingleKey_replace(SingleKey *self, PyObject *args, PyObject *kw) {
|
SingleKey_replace(SingleKey *self, PyObject *args, PyObject *kw) {
|
||||||
long key = -2; unsigned short mods = 1 << (MOD_BITS + 1); int is_native = -1;
|
long long key = -2; unsigned short mods = 1 << (MOD_BITS + 1); int is_native = -1;
|
||||||
if (!PyArg_ParseTupleAndKeywords(args, kw, "|Hpl", SingleKey_kwds, &mods, &is_native, &key)) return NULL;
|
if (!PyArg_ParseTupleAndKeywords(args, kw, "|HpL", SingleKey_kwds, &mods, &is_native, &key)) return NULL;
|
||||||
SingleKey *ans = (SingleKey*)SingleKey_Type.tp_alloc(&SingleKey_Type, 0);
|
SingleKey *ans = (SingleKey*)SingleKey_Type.tp_alloc(&SingleKey_Type, 0);
|
||||||
if (ans) {
|
if (ans) {
|
||||||
if (key == -1) key = 0;
|
if (key == -1) key = 0;
|
||||||
|
|||||||
@ -535,7 +535,7 @@ class TestDataTypes(BaseTest):
|
|||||||
q('a\x1b[bc', 'ac')
|
q('a\x1b[bc', 'ac')
|
||||||
q('a\x1b[12;34:43mbc', 'abc')
|
q('a\x1b[12;34:43mbc', 'abc')
|
||||||
|
|
||||||
def test_SingleKey(self):
|
def test_single_key(self):
|
||||||
from kitty.fast_data_types import (
|
from kitty.fast_data_types import (
|
||||||
GLFW_MOD_KITTY, GLFW_MOD_SHIFT, SingleKey
|
GLFW_MOD_KITTY, GLFW_MOD_SHIFT, SingleKey
|
||||||
)
|
)
|
||||||
@ -548,6 +548,7 @@ class TestDataTypes(BaseTest):
|
|||||||
self.ae(repr(SingleKey(key=23, mods=2, is_native=True)), 'SingleKey(mods=2, is_native=True, key=23)')
|
self.ae(repr(SingleKey(key=23, mods=2, is_native=True)), 'SingleKey(mods=2, is_native=True, key=23)')
|
||||||
self.ae(repr(SingleKey(key=23, mods=2)), 'SingleKey(mods=2, key=23)')
|
self.ae(repr(SingleKey(key=23, mods=2)), 'SingleKey(mods=2, key=23)')
|
||||||
self.ae(repr(SingleKey(key=23)), 'SingleKey(key=23)')
|
self.ae(repr(SingleKey(key=23)), 'SingleKey(key=23)')
|
||||||
|
self.ae(repr(SingleKey(key=0x1008ff57)), 'SingleKey(key=269025111)')
|
||||||
self.ae(repr(SingleKey(key=23)._replace(mods=2)), 'SingleKey(mods=2, key=23)')
|
self.ae(repr(SingleKey(key=23)._replace(mods=2)), 'SingleKey(mods=2, key=23)')
|
||||||
self.ae(repr(SingleKey(key=23)._replace(key=-1, mods=GLFW_MOD_KITTY)), f'SingleKey(mods={GLFW_MOD_KITTY})')
|
self.ae(repr(SingleKey(key=23)._replace(key=-1, mods=GLFW_MOD_KITTY)), f'SingleKey(mods={GLFW_MOD_KITTY})')
|
||||||
self.assertEqual(SingleKey(key=1), SingleKey(key=1))
|
self.assertEqual(SingleKey(key=1), SingleKey(key=1))
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user