Replace eekboard-xml and eekboard-inscript with eekxml and mim2remap.
This commit is contained in:
5
examples/eekxml/Makefile.am
Normal file
5
examples/eekxml/Makefile.am
Normal file
@ -0,0 +1,5 @@
|
||||
bin_SCRIPTS = eekxml
|
||||
EXTRA_DIST = mim2remap
|
||||
|
||||
eekxml: eekxml.in
|
||||
$(AM_V_GEN) sed '1s!@''PYTHON@!'$(PYTHON)'!' $< > $@
|
||||
124
examples/eekxml/eekxml.in
Normal file
124
examples/eekxml/eekxml.in
Normal file
@ -0,0 +1,124 @@
|
||||
#!@PYTHON@
|
||||
# -*- python -*-
|
||||
# Copyright (C) 2011 Daiki Ueno <ueno@unixuser.org>
|
||||
# Copyright (C) 2011 Red Hat, Inc.
|
||||
|
||||
# This program 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.
|
||||
|
||||
# This program 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 this program. If not, see
|
||||
# <http://www.gnu.org/licenses/>.
|
||||
|
||||
import argparse
|
||||
import json
|
||||
from gi.repository import GLib, Gtk, Eek, EekXkl, EekGtk, Gio
|
||||
|
||||
DEFAULT_WIDTH = 640
|
||||
DEFAULT_HEIGHT = 480
|
||||
|
||||
# XXX: level3 shift is not supported yet in remap files
|
||||
def remap(keyboard, mapping):
|
||||
def __each_key(element, data):
|
||||
matrix = element.get_symbol_matrix()
|
||||
for level in xrange(matrix.num_levels):
|
||||
symbol = matrix.get_symbol(0, level)
|
||||
if isinstance(symbol, Eek.Keysym):
|
||||
mapped = data.get(symbol.get_name(), None)
|
||||
if mapped:
|
||||
if mapped.has_key('xkeysym'):
|
||||
replace = Eek.Keysym.new(mapped['xkeysym'])
|
||||
else:
|
||||
replace = Eek.Symbol.new(mapped['name'])
|
||||
replace.set_category(Eek.SymbolCategory.LETTER)
|
||||
if mapped.has_key('label'):
|
||||
replace.set_label(mapped['label'])
|
||||
if mapped.has_key('category'):
|
||||
replace.set_category(mapped['category'])
|
||||
matrix.set_symbol(0, level, replace)
|
||||
def __each_section(element, data):
|
||||
element.foreach_child(__each_key, data)
|
||||
keyboard.foreach_child(__each_section, mapping)
|
||||
|
||||
def create_keyboard(args):
|
||||
if args.file:
|
||||
_file = Gio.file_new_for_path(args.file)
|
||||
layout = Eek.XmlLayout.new(_file.read(None))
|
||||
else:
|
||||
layout = EekXkl.Layout.new()
|
||||
if args.model:
|
||||
layout.set_model(args.model)
|
||||
if args.layout:
|
||||
layout.set_layouts(args.layout)
|
||||
if args.variant:
|
||||
layout.set_variants(args.variant)
|
||||
if args.option:
|
||||
layout.set_options(args.option)
|
||||
|
||||
keyboard = Eek.Keyboard.new(layout, DEFAULT_WIDTH, DEFAULT_HEIGHT)
|
||||
if args.remap_file:
|
||||
with open(args.remap_file) as remap_file:
|
||||
mapping = json.load(remap_file)
|
||||
remap(keyboard, mapping)
|
||||
return keyboard
|
||||
|
||||
def show(args):
|
||||
keyboard = create_keyboard(args)
|
||||
keyboard.set_modifier_behavior(Eek.ModifierBehavior.LATCH)
|
||||
widget = EekGtk.Keyboard.new(keyboard)
|
||||
if args.theme:
|
||||
theme = Eek.Theme.new(args.theme, None, None)
|
||||
widget.set_theme(theme)
|
||||
window = Gtk.Window.new(Gtk.WindowType.TOPLEVEL)
|
||||
bounds = keyboard.get_bounds()
|
||||
window.set_default_size(bounds.width, bounds.height)
|
||||
window.connect('destroy', lambda *args: Gtk.main_quit())
|
||||
window.add(widget)
|
||||
window.show_all()
|
||||
Gtk.main()
|
||||
|
||||
def dump(args):
|
||||
keyboard = create_keyboard(args)
|
||||
output = GLib.String()
|
||||
keyboard.output(output, 0)
|
||||
print output.str
|
||||
|
||||
# Add a simple function to print usage, for the 'help' command
|
||||
def usage(args, parser):
|
||||
parser.print_help()
|
||||
|
||||
def parse_cmdline():
|
||||
parser = argparse.ArgumentParser(
|
||||
description='manipulate XML files used by eekboard')
|
||||
subparsers = parser.add_subparsers(help='sub-command help')
|
||||
parser_help = subparsers.add_parser('help', help = 'show usage')
|
||||
parser_help.set_defaults(command = lambda args: usage(args, parser=parser))
|
||||
parser_common = subparsers.add_parser('common', add_help=False)
|
||||
parser_common.add_argument('--model', help='specify XKB model')
|
||||
parser_common.add_argument('--layout', help='specify XKB layout')
|
||||
parser_common.add_argument('--variant', help='specify XKB variant')
|
||||
parser_common.add_argument('--option', help='specify XKB option')
|
||||
parser_common.add_argument('--file', help='specify XML layout file')
|
||||
parser_common.add_argument('--remap-file', help='remap keysyms with the file')
|
||||
parser_show = subparsers.add_parser('show',
|
||||
help='show help',
|
||||
parents=[parser_common])
|
||||
parser_show.add_argument('--theme', help='use the theme file')
|
||||
parser_show.add_argument('--group', help='switch to the given group')
|
||||
parser_show.set_defaults(command = show)
|
||||
parser_dump = subparsers.add_parser('dump',
|
||||
help='dump help',
|
||||
parents=[parser_common])
|
||||
parser_dump.set_defaults(command = dump)
|
||||
return parser.parse_args()
|
||||
|
||||
if __name__ == '__main__':
|
||||
args = parse_cmdline()
|
||||
args.command(args)
|
||||
73
examples/eekxml/mim2remap
Executable file
73
examples/eekxml/mim2remap
Executable file
@ -0,0 +1,73 @@
|
||||
#!/usr/bin/env python
|
||||
|
||||
# Copyright (C) 2011 Daiki Ueno <ueno@unixuser.org>
|
||||
# Copyright (C) 2011 Red Hat, Inc.
|
||||
|
||||
# This library is free software; you can redistribute it and/or
|
||||
# modify it under the terms of the GNU Lesser General Public License
|
||||
# as published by the Free Software Foundation; either version 2 of
|
||||
# the License, or (at your option) any later version.
|
||||
|
||||
# This library 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
|
||||
# Lesser General Public License for more details.
|
||||
|
||||
# You should have received a copy of the GNU Lesser General Public
|
||||
# License along with this library; if not, write to the Free Software
|
||||
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
|
||||
# 02110-1301 USA
|
||||
|
||||
import json
|
||||
import gtk.gdk
|
||||
import sys, os.path, re
|
||||
|
||||
class MapFile(object):
|
||||
MAPENTRY_PATTERN = re.compile(r'\A\s*\((?:\((.*?)\)|"(.*?)")\s*(?:"(.*?)"|\?(.*?))\)')
|
||||
|
||||
def __init__(self, path):
|
||||
self.__dict = dict()
|
||||
|
||||
with open(path, 'r') as fp:
|
||||
for line in fp:
|
||||
match = re.match(self.MAPENTRY_PATTERN, line)
|
||||
if match:
|
||||
if match.group(1):
|
||||
keyseq = re.sub(r'\\(.)', r'\1', match.group(1))
|
||||
# should check G-* and A-*
|
||||
else:
|
||||
keyseq = re.sub(r'\\(.)', r'\1', match.group(2))
|
||||
# combination of keys is not supported
|
||||
if len(keyseq) > 1:
|
||||
continue
|
||||
try:
|
||||
keyval = gtk.gdk.unicode_to_keyval(ord(keyseq))
|
||||
keyseq = gtk.gdk.keyval_name(keyval)
|
||||
except:
|
||||
pass
|
||||
if match.group(3):
|
||||
insert = match.group(3).decode('UTF-8')
|
||||
else:
|
||||
insert = match.group(4).decode('UTF-8')
|
||||
replace = {}
|
||||
if len(insert) > 1:
|
||||
replace = { 'name': insert,
|
||||
'label': insert }
|
||||
else:
|
||||
try:
|
||||
keyval = gtk.gdk.unicode_to_keyval(ord(insert))
|
||||
name = gtk.gdk.keyval_name(keyval)
|
||||
replace = { 'name': name,
|
||||
'label': insert,
|
||||
'xkeysym': keyval }
|
||||
except:
|
||||
replace = { 'name': insert,
|
||||
'label': insert }
|
||||
self.__dict[keyseq] = replace
|
||||
|
||||
def __str__(self):
|
||||
return json.dumps(self.__dict)
|
||||
|
||||
if __name__ == "__main__":
|
||||
mapfile = MapFile(sys.argv[1])
|
||||
print mapfile
|
||||
Reference in New Issue
Block a user