continued rearrangement

This commit is contained in:
sezanzeb 2020-11-09 23:34:30 +01:00 committed by sezanzeb
parent a402732bc4
commit 44bc36098f
7 changed files with 35 additions and 75 deletions

View File

@ -3,6 +3,5 @@
default xkb_keycodes "basic" {{
minimum = {minimum};
maximum = {maximum};
include "evdev"
{xkb_keycodes}
}};

View File

@ -4,7 +4,6 @@
// /usr/share/X11/xkb/keycodes/key-mapper
default xkb_symbols "basic" {{
include "{system_default}"
name[Group1] = "{name}";
{xkb_symbols}
}};

View File

@ -102,7 +102,6 @@ def create_setxkbmap_config(device, preset):
device : string
preset : string
"""
print('create_setxkbmap_config', len(mapping), mapping._mapping)
if len(mapping) == 0:
logger.debug('Got empty mappings')
return None
@ -175,9 +174,7 @@ def create_identity_mapping():
# and the minimum 8
maximum = 255
minimum = 8
for keycode, _ in mapping:
# only those keys that are in the mapping, so that the others
# get mappings from the default keyboard.
for keycode in range(minimum, maximum + 1):
xkb_keycodes.append(f'<{keycode}> = {keycode};')
template_path = get_data_path('xkb_keycodes_template')
@ -191,7 +188,7 @@ def create_identity_mapping():
)
if not os.path.exists(KEYCODES_PATH):
logger.info('Creating "%s"', KEYCODES_PATH)
logger.debug('Creating "%s"', KEYCODES_PATH)
os.makedirs(os.path.dirname(KEYCODES_PATH), exist_ok=True)
os.mknod(KEYCODES_PATH)
with open(KEYCODES_PATH, 'w') as keycodes:
@ -208,8 +205,6 @@ def generate_symbols_content(device, preset):
device : string
preset : string
"""
system_default = 'us' # TODO get the system default
if len(mapping) == 0:
raise ValueError('Mapping is empty')
@ -224,7 +219,7 @@ def generate_symbols_content(device, preset):
for keycode, character in mapping:
if f'<{keycode}>' not in keycodes:
logger.error(f'Unknown keycode <{keycode}> for "{character}"')
# continue, otherwise X would crash when loading
# don't append that one, otherwise X would crash when loading
continue
xkb_symbols.append(f'key <{keycode}> {{ [ {character} ] }};')
if len(xkb_symbols) == 0:
@ -237,8 +232,7 @@ def generate_symbols_content(device, preset):
result = template.format(
name=f'{device}/{preset}',
xkb_symbols='\n '.join(xkb_symbols),
system_default=system_default
xkb_symbols='\n '.join(xkb_symbols)
)
return result
@ -260,3 +254,27 @@ def get_xinput_id_mapping():
names = [name for name in names if name != '']
ids = [int(id) for id in ids if id != '']
return zip(names, ids)
def parse_symbols_file(device, preset):
"""Parse a symbols file and return the keycodes."""
path = get_home_path(device, preset)
if not os.path.exists(path):
logger.debug(
'Tried to load non existing preset "%s" for %s',
preset, device
)
mapping.empty()
mapping.changed = False
return
with open(path, 'r') as f:
# from "key <12> { [ 1 ] };" extract 12 and 1,
# avoid lines that start with special characters
# (might be comments)
result = re.findall(r'\n\s+?key <(.+?)>.+?\[\s+(\w+)', f.read())
logger.debug('Found %d mappings in this preset', len(result))
for keycode, character in result:
mapping.changed = False
mapping.change(None, int(keycode), character)

View File

@ -29,7 +29,7 @@ from gi.repository import Gtk, Gdk, GLib
from keymapper.data import get_data_path
from keymapper.X import create_setxkbmap_config, apply_preset, \
create_preset, mapping
create_preset, mapping, parse_symbols_file
from keymapper.presets import get_presets, find_newest_preset, \
delete_preset, rename_preset
from keymapper.logger import logger
@ -141,6 +141,7 @@ class Window:
"""Remove all rows from the mappings table."""
key_list = self.get('key_list')
key_list.forall(key_list.remove)
mapping.empty()
def on_save_preset_clicked(self, button):
"""Save changes to a preset to the file system."""
@ -215,10 +216,7 @@ class Window:
logger.debug('Selecting preset "%s"', preset)
self.selected_preset = preset
mapping.load(
self.selected_device,
self.selected_preset
)
parse_symbols_file(self.selected_device, self.selected_preset)
key_list = self.get('key_list')
for keycode, character in mapping:

View File

@ -19,13 +19,9 @@
# along with key-mapper. If not, see <https://www.gnu.org/licenses/>.
"""TODO"""
"""Contains and manages mappings."""
import os
import re
from keymapper.paths import get_home_path
from keymapper.logger import logger
@ -46,34 +42,6 @@ class Mapping:
def __len__(self):
return len(self._mapping)
def load(self, device, preset):
"""Parse the X config to replace the current mapping with that one."""
# TODO put that logic out of the mapper to make mapper display server
# agnostic
path = get_home_path(device, preset)
if not os.path.exists(path):
logger.debug(
'Tried to load non existing preset "%s" for %s',
preset, device
)
self._mapping = {}
return
with open(path, 'r') as f:
# from "key <12> { [ 1 ] };" extract 12 and 1,
# avoid lines that start with special characters
# (might be comments)
result = re.findall(r'\n\s+?key <(.+?)>.+?\[\s+(\w+)', f.read())
logger.debug('Found %d mappings in this preset', len(result))
self._mapping = {
int(keycode): character
for keycode, character
in result
}
self.changed = False
def change(self, previous_keycode, new_keycode, character):
"""Replace the mapping of a keycode with a different one.

View File

@ -1,19 +0,0 @@
#!/usr/bin/python3
# -*- coding: utf-8 -*-
# key-mapper - GUI for device specific keyboard mappings
# Copyright (C) 2020 sezanzeb <proxima@hip70890b.de>
#
# This file is part of key-mapper.
#
# key-mapper is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# key-mapper is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with key-mapper. If not, see <https://www.gnu.org/licenses/>.

View File

@ -75,11 +75,8 @@ class TestConfig(unittest.TestCase):
self.assertTrue(os.path.exists(KEYCODES_PATH))
with open(KEYCODES_PATH, 'r') as f:
keycodes = f.read()
self.assertNotIn('<9> = 9;', keycodes)
self.assertIn('<10> = 10;', keycodes)
self.assertIn('<11> = 11;', keycodes)
self.assertIn('<12> = 12;', keycodes)
self.assertNotIn('<13> = 13;', keycodes)
self.assertIn('<8> = 8;', keycodes)
self.assertIn('<255> = 255;', keycodes)
content = generate_symbols_content('device', 'preset')
self.assertIn('key <10> { [ a ] };', content)