mirror of
https://github.com/sezanzeb/input-remapper
synced 2024-11-18 03:25:52 +00:00
button to load the default preset
This commit is contained in:
parent
055132625e
commit
2f5a66743a
@ -244,11 +244,15 @@
|
|||||||
<placeholder/>
|
<placeholder/>
|
||||||
</child>
|
</child>
|
||||||
</object>
|
</object>
|
||||||
|
<object class="GtkImage" id="gtk-redo-icon-2">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can_focus">False</property>
|
||||||
|
<property name="stock">gtk-redo</property>
|
||||||
|
</object>
|
||||||
<object class="GtkWindow" id="window">
|
<object class="GtkWindow" id="window">
|
||||||
<property name="width_request">450</property>
|
<property name="width_request">450</property>
|
||||||
<property name="can_focus">False</property>
|
<property name="can_focus">False</property>
|
||||||
<property name="title" translatable="yes">Key Mapper</property>
|
<property name="title" translatable="yes">Key Mapper</property>
|
||||||
<property name="default_height">280</property>
|
|
||||||
<property name="icon_name">mouse</property>
|
<property name="icon_name">mouse</property>
|
||||||
<signal name="delete-event" handler="on_close" swapped="no"/>
|
<signal name="delete-event" handler="on_close" swapped="no"/>
|
||||||
<child>
|
<child>
|
||||||
@ -478,6 +482,26 @@
|
|||||||
<property name="position">2</property>
|
<property name="position">2</property>
|
||||||
</packing>
|
</packing>
|
||||||
</child>
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkButton" id="apply_defaults">
|
||||||
|
<property name="label" translatable="yes">Apply Defaults</property>
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can_focus">True</property>
|
||||||
|
<property name="receives_default">True</property>
|
||||||
|
<property name="tooltip_text" translatable="yes">To give your keys back their original mapping.</property>
|
||||||
|
<property name="halign">end</property>
|
||||||
|
<property name="margin_end">10</property>
|
||||||
|
<property name="margin_bottom">10</property>
|
||||||
|
<property name="border_width">0</property>
|
||||||
|
<property name="image">gtk-redo-icon-2</property>
|
||||||
|
<signal name="clicked" handler="on_apply_defaults_clicked" swapped="no"/>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="expand">False</property>
|
||||||
|
<property name="fill">False</property>
|
||||||
|
<property name="position">3</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
<child>
|
<child>
|
||||||
<object class="GtkSeparator">
|
<object class="GtkSeparator">
|
||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
@ -486,7 +510,7 @@
|
|||||||
<packing>
|
<packing>
|
||||||
<property name="expand">False</property>
|
<property name="expand">False</property>
|
||||||
<property name="fill">True</property>
|
<property name="fill">True</property>
|
||||||
<property name="position">3</property>
|
<property name="position">4</property>
|
||||||
</packing>
|
</packing>
|
||||||
</child>
|
</child>
|
||||||
<child>
|
<child>
|
||||||
@ -505,7 +529,7 @@
|
|||||||
<packing>
|
<packing>
|
||||||
<property name="expand">False</property>
|
<property name="expand">False</property>
|
||||||
<property name="fill">True</property>
|
<property name="fill">True</property>
|
||||||
<property name="position">4</property>
|
<property name="position">5</property>
|
||||||
</packing>
|
</packing>
|
||||||
</child>
|
</child>
|
||||||
</object>
|
</object>
|
||||||
|
@ -153,8 +153,32 @@ DEFAULT_SYMBOLS_NAME = get_preset_name('default')
|
|||||||
|
|
||||||
|
|
||||||
def apply_preset(device, preset):
|
def apply_preset(device, preset):
|
||||||
"""Apply a preset to the device."""
|
"""Apply a preset to the device.
|
||||||
logger.info('Applying preset "%s" on device %s', preset, device)
|
|
||||||
|
Parameters
|
||||||
|
----------
|
||||||
|
device : string
|
||||||
|
preset : string
|
||||||
|
"""
|
||||||
|
layout = get_preset_name(device, preset)
|
||||||
|
setxkbmap(device, layout)
|
||||||
|
|
||||||
|
|
||||||
|
def setxkbmap(device, layout):
|
||||||
|
"""Apply a preset to the device.
|
||||||
|
|
||||||
|
Parameters
|
||||||
|
----------
|
||||||
|
device : string
|
||||||
|
layout : string
|
||||||
|
For example 'de', passed to setxkbmap unmodified
|
||||||
|
"""
|
||||||
|
with open(os.path.join(X11_SYMBOLS, layout), 'r') as f:
|
||||||
|
if f.read() == '':
|
||||||
|
logger.error('Tried to load empty config')
|
||||||
|
return
|
||||||
|
|
||||||
|
logger.info('Applying layout "%s" on device %s', layout, device)
|
||||||
group = get_devices()[device]
|
group = get_devices()[device]
|
||||||
|
|
||||||
# apply it to every device that hangs on the same usb port, because I
|
# apply it to every device that hangs on the same usb port, because I
|
||||||
@ -165,15 +189,9 @@ def apply_preset(device, preset):
|
|||||||
# only all virtual devices of the same hardware device
|
# only all virtual devices of the same hardware device
|
||||||
continue
|
continue
|
||||||
|
|
||||||
layout_path = get_usr_path(device, preset)
|
|
||||||
with open(layout_path, 'r') as f:
|
|
||||||
if f.read() == '':
|
|
||||||
logger.error('Tried to load empty config')
|
|
||||||
return
|
|
||||||
|
|
||||||
cmd = [
|
cmd = [
|
||||||
'setxkbmap',
|
'setxkbmap',
|
||||||
'-layout', get_preset_name(device, preset),
|
'-layout', layout,
|
||||||
'-keycodes', 'key-mapper',
|
'-keycodes', 'key-mapper',
|
||||||
'-device', str(xinput_id)
|
'-device', str(xinput_id)
|
||||||
]
|
]
|
||||||
@ -314,8 +332,8 @@ def parse_symbols_file(device, preset):
|
|||||||
result = re.findall(r'\n\s+?key <(.+?)>.+?\[\s+(\w+)', f.read())
|
result = re.findall(r'\n\s+?key <(.+?)>.+?\[\s+(\w+)', f.read())
|
||||||
logger.debug('Found %d mappings in this preset', len(result))
|
logger.debug('Found %d mappings in this preset', len(result))
|
||||||
for keycode, character in result:
|
for keycode, character in result:
|
||||||
custom_mapping.changed = False
|
|
||||||
custom_mapping.change(None, int(keycode), character)
|
custom_mapping.change(None, int(keycode), character)
|
||||||
|
custom_mapping.changed = False
|
||||||
|
|
||||||
|
|
||||||
def create_default_symbols():
|
def create_default_symbols():
|
||||||
|
46
keymapper/gtk/unsaved.py
Normal file
46
keymapper/gtk/unsaved.py
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
#!/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/>.
|
||||||
|
|
||||||
|
|
||||||
|
"""Error dialog."""
|
||||||
|
|
||||||
|
|
||||||
|
import gi
|
||||||
|
gi.require_version('Gtk', '3.0')
|
||||||
|
gi.require_version('GLib', '2.0')
|
||||||
|
from gi.repository import Gtk
|
||||||
|
|
||||||
|
from keymapper.data import get_data_path
|
||||||
|
|
||||||
|
|
||||||
|
CONTINUE = True
|
||||||
|
GO_BACK = False
|
||||||
|
|
||||||
|
|
||||||
|
def unsavedChangesDialog():
|
||||||
|
gladefile = get_data_path('key-mapper.glade')
|
||||||
|
builder = Gtk.Builder()
|
||||||
|
builder.add_from_file(gladefile)
|
||||||
|
dialog = builder.get_object('unsaved_changes')
|
||||||
|
dialog.show()
|
||||||
|
dialog.run()
|
||||||
|
dialog.hide()
|
||||||
|
# TODO do something meaningful
|
||||||
|
return GO_BACK
|
@ -29,12 +29,14 @@ from gi.repository import Gtk, Gdk, GLib
|
|||||||
|
|
||||||
from keymapper.data import get_data_path
|
from keymapper.data import get_data_path
|
||||||
from keymapper.X import create_setxkbmap_config, apply_preset, \
|
from keymapper.X import create_setxkbmap_config, apply_preset, \
|
||||||
create_preset, custom_mapping, parse_symbols_file
|
create_preset, custom_mapping, parse_symbols_file, setxkbmap, \
|
||||||
|
DEFAULT_SYMBOLS_NAME
|
||||||
from keymapper.presets import get_presets, find_newest_preset, \
|
from keymapper.presets import get_presets, find_newest_preset, \
|
||||||
delete_preset, rename_preset
|
delete_preset, rename_preset
|
||||||
from keymapper.logger import logger
|
from keymapper.logger import logger
|
||||||
from keymapper.linux import get_devices, keycode_reader
|
from keymapper.linux import get_devices, keycode_reader
|
||||||
from keymapper.gtk.row import Row
|
from keymapper.gtk.row import Row
|
||||||
|
from keymapper.gtk.unsaved import unsavedChangesDialog, GO_BACK
|
||||||
|
|
||||||
|
|
||||||
def gtk_iteration():
|
def gtk_iteration():
|
||||||
@ -169,6 +171,10 @@ class Window:
|
|||||||
key_list.forall(key_list.remove)
|
key_list.forall(key_list.remove)
|
||||||
custom_mapping.empty()
|
custom_mapping.empty()
|
||||||
|
|
||||||
|
def on_apply_defaults_clicked(self, button):
|
||||||
|
"""Load the mapping that was known to be used before key-mapper."""
|
||||||
|
setxkbmap(self.selected_device, DEFAULT_SYMBOLS_NAME)
|
||||||
|
|
||||||
def on_save_preset_clicked(self, button):
|
def on_save_preset_clicked(self, button):
|
||||||
"""Save changes to a preset to the file system."""
|
"""Save changes to a preset to the file system."""
|
||||||
new_name = self.get('preset_name_input').get_text()
|
new_name = self.get('preset_name_input').get_text()
|
||||||
@ -215,7 +221,9 @@ class Window:
|
|||||||
|
|
||||||
def on_select_device(self, dropdown):
|
def on_select_device(self, dropdown):
|
||||||
"""List all presets, create one if none exist yet."""
|
"""List all presets, create one if none exist yet."""
|
||||||
# TODO unsaved changes dialog
|
if custom_mapping.changed:
|
||||||
|
if unsavedChangesDialog() == GO_BACK:
|
||||||
|
return
|
||||||
|
|
||||||
device = dropdown.get_active_text()
|
device = dropdown.get_active_text()
|
||||||
|
|
||||||
@ -231,7 +239,9 @@ class Window:
|
|||||||
|
|
||||||
def on_create_preset_clicked(self, button):
|
def on_create_preset_clicked(self, button):
|
||||||
"""Create a new preset and select it."""
|
"""Create a new preset and select it."""
|
||||||
# TODO unsaved changes dialog
|
if custom_mapping.changed:
|
||||||
|
if unsavedChangesDialog() == GO_BACK:
|
||||||
|
return
|
||||||
|
|
||||||
new_preset = create_preset(self.selected_device)
|
new_preset = create_preset(self.selected_device)
|
||||||
self.get('preset_selection').append(new_preset, new_preset)
|
self.get('preset_selection').append(new_preset, new_preset)
|
||||||
@ -240,7 +250,9 @@ class Window:
|
|||||||
|
|
||||||
def on_select_preset(self, dropdown):
|
def on_select_preset(self, dropdown):
|
||||||
"""Show the mappings of the preset."""
|
"""Show the mappings of the preset."""
|
||||||
# TODO unsaved changes dialog
|
if custom_mapping.changed:
|
||||||
|
if unsavedChangesDialog() == GO_BACK:
|
||||||
|
return
|
||||||
|
|
||||||
self.clear_mapping_table()
|
self.clear_mapping_table()
|
||||||
|
|
||||||
@ -296,3 +308,5 @@ class Window:
|
|||||||
self.selected_device,
|
self.selected_device,
|
||||||
self.selected_preset
|
self.selected_preset
|
||||||
)
|
)
|
||||||
|
|
||||||
|
custom_mapping.changed = False
|
||||||
|
Loading…
Reference in New Issue
Block a user