Reduce key dictionary memory footprint

Instead of indexing `Key` objects that have multiple names by each
individual name, index by the set of names. This reduces the size of the
default key dictionary by a factor of between 2 and 3, and as result
also reduces reallocations/defragmentation.
Instead of instantiating all module/extension keys by default, append
them to the `maybe_key`-generator list.
This commit is contained in:
xs5871
2022-12-05 19:54:57 +00:00
parent 47c242a2c9
commit 9c1bd210eb
27 changed files with 439 additions and 434 deletions

View File

@@ -9,6 +9,9 @@ from tests.keyboard_test import KeyboardTest
class TestHoldTap(unittest.TestCase):
def setUp(self):
KC.clear()
def test_holdtap(self):
keyboard = KeyboardTest(
[Layers(), ModTap(), OneShot()],

View File

@@ -1,6 +1,6 @@
import unittest
from kmk.keys import KC, Key, ModifierKey, make_key
from kmk.keys import KC, Key, ModifierKey, make_key, maybe_make_key
from tests.keyboard_test import KeyboardTest
@@ -131,20 +131,14 @@ class TestKeys_dot(unittest.TestCase):
KC.invalid_key
def test_custom_key(self):
created = make_key(
KC.N2.code,
names=(
'EURO',
'',
),
has_modifiers={KC.LSFT.code, KC.ROPT.code},
KC._generators.append(
maybe_make_key(
KC.N2.code,
names=('EURO', ''),
has_modifiers={KC.LSFT.code, KC.ROPT.code},
)
)
assert created is KC.get('EURO')
assert created is KC.get('')
def test_match_exactly_case(self):
created = make_key(names=('ThIs_Is_A_StRaNgE_kEy',))
assert created is KC.get('ThIs_Is_A_StRaNgE_kEy')
assert KC.get('') is KC.get('EURO')
class TestKeys_index(unittest.TestCase):
@@ -176,20 +170,14 @@ class TestKeys_index(unittest.TestCase):
KC['not_a_valid_key']
def test_custom_key(self):
created = make_key(
KC['N2'].code,
names=(
'EURO',
'',
),
has_modifiers={KC['LSFT'].code, KC['ROPT'].code},
KC._generators.append(
maybe_make_key(
KC.N2.code,
names=('EURO', ''),
has_modifiers={KC.LSFT.code, KC.ROPT.code},
)
)
assert created is KC['EURO']
assert created is KC['']
def test_match_exactly_case(self):
created = make_key(names=('ThIs_Is_A_StRaNgE_kEy',))
assert created is KC['ThIs_Is_A_StRaNgE_kEy']
assert KC.get('') is KC.get('EURO')
class TestKeys_get(unittest.TestCase):
@@ -224,20 +212,14 @@ class TestKeys_get(unittest.TestCase):
assert KC.get('not_a_valid_key') is None
def test_custom_key(self):
created = make_key(
KC.get('N2').code,
names=(
'EURO',
'',
),
has_modifiers={KC.get('LSFT').code, KC.get('ROPT').code},
KC._generators.append(
maybe_make_key(
KC.N2.code,
names=('EURO', ''),
has_modifiers={KC.LSFT.code, KC.ROPT.code},
)
)
assert created is KC.get('EURO')
assert created is KC.get('')
def test_match_exactly_case(self):
created = make_key(names=('ThIs_Is_A_StRaNgE_kEy',))
assert created is KC.get('ThIs_Is_A_StRaNgE_kEy')
assert KC.get('') is KC.get('EURO')
def test_underscore(self):
assert KC.get('_')
@@ -251,8 +233,8 @@ class TestKeys_instances(unittest.TestCase):
KC.clear()
def test_make_key_new_instance(self):
key1 = make_key(code=1)
key2 = make_key(code=1)
key1, _ = make_key(code=1)
key2, _ = make_key(code=1)
assert key1 is not key2
assert key1.code == key2.code

View File

@@ -7,6 +7,7 @@ from tests.keyboard_test import KeyboardTest
class TestLayers(unittest.TestCase):
def setUp(self):
KC.clear()
self.kb = KeyboardTest(
[Layers()],
[

View File

@@ -9,6 +9,7 @@ from tests.keyboard_test import KeyboardTest
class TestTapDance(unittest.TestCase):
def setUp(self):
KC.clear()
self.keyboard = KeyboardTest(
[Layers(), HoldTap(), TapDance()],
[