#!@PYTHON@ # -*- python -*- # Copyright (C) 2011 Daiki Ueno # 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 # . 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']) elif mapped.has_key('text'): replace = Eek.Text.new(mapped['text']) else: replace = Eek.Symbol.new(mapped['name']) replace.set_category(Eek.SymbolCategory.LETTER) replace.set_name(symbol.get_name()) 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)