mirror of
https://github.com/sezanzeb/input-remapper
synced 2024-11-04 12:00:16 +00:00
continued rearrangement
This commit is contained in:
parent
88ba61205d
commit
91fd2340b5
@ -3,6 +3,5 @@
|
||||
default xkb_keycodes "basic" {{
|
||||
minimum = {minimum};
|
||||
maximum = {maximum};
|
||||
include "evdev"
|
||||
{xkb_keycodes}
|
||||
}};
|
||||
|
@ -4,7 +4,6 @@
|
||||
// /usr/share/X11/xkb/keycodes/key-mapper
|
||||
|
||||
default xkb_symbols "basic" {{
|
||||
include "{system_default}"
|
||||
name[Group1] = "{name}";
|
||||
{xkb_symbols}
|
||||
}};
|
||||
|
@ -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
|
||||
@ -259,4 +253,28 @@ 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)
|
||||
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)
|
||||
|
@ -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:
|
||||
|
@ -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.
|
||||
|
||||
|
@ -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/>.
|
@ -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)
|
||||
|
Loading…
Reference in New Issue
Block a user