129 lines
		
	
	
		
			5.1 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			129 lines
		
	
	
		
			5.1 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
#!@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'])
 | 
						|
                    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'):
 | 
						|
                        cat = Eek.symbol_category_from_name(mapped['category'])
 | 
						|
                        replace.set_category(cat)
 | 
						|
                    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)
 |