Replace eekboard-xml and eekboard-inscript with eekxml and mim2remap.
This commit is contained in:
		
							
								
								
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							@ -4,6 +4,7 @@
 | 
				
			|||||||
*.o
 | 
					*.o
 | 
				
			||||||
*.so
 | 
					*.so
 | 
				
			||||||
*~
 | 
					*~
 | 
				
			||||||
 | 
					*.pyc
 | 
				
			||||||
Makefile
 | 
					Makefile
 | 
				
			||||||
Makefile.in
 | 
					Makefile.in
 | 
				
			||||||
.deps
 | 
					.deps
 | 
				
			||||||
 | 
				
			|||||||
@ -340,7 +340,7 @@ data/icons/scalable/Makefile
 | 
				
			|||||||
data/themes/Makefile
 | 
					data/themes/Makefile
 | 
				
			||||||
data/keyboards/Makefile
 | 
					data/keyboards/Makefile
 | 
				
			||||||
examples/Makefile
 | 
					examples/Makefile
 | 
				
			||||||
examples/eekboard-inscript/Makefile
 | 
					examples/eekxml/Makefile
 | 
				
			||||||
examples/simple-client/Makefile
 | 
					examples/simple-client/Makefile
 | 
				
			||||||
eek/eek-${EEK_API_VERSION}.pc
 | 
					eek/eek-${EEK_API_VERSION}.pc
 | 
				
			||||||
eek/eek-clutter-${EEK_API_VERSION}.pc
 | 
					eek/eek-clutter-${EEK_API_VERSION}.pc
 | 
				
			||||||
 | 
				
			|||||||
@ -487,7 +487,7 @@ eek_element_set_bounds (EekElement  *element,
 | 
				
			|||||||
/**
 | 
					/**
 | 
				
			||||||
 * eek_element_get_bounds:
 | 
					 * eek_element_get_bounds:
 | 
				
			||||||
 * @element: an #EekElement
 | 
					 * @element: an #EekElement
 | 
				
			||||||
 * @bounds: pointer where bounding box of @element will be stored
 | 
					 * @bounds: (out): pointer where bounding box of @element will be stored
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 * Get the bounding box of @element.  Note that if @element has
 | 
					 * Get the bounding box of @element.  Note that if @element has
 | 
				
			||||||
 * parent, position of @bounds are relative to the parent.  To obtain
 | 
					 * parent, position of @bounds are relative to the parent.  To obtain
 | 
				
			||||||
 | 
				
			|||||||
@ -540,7 +540,7 @@ eek_key_set_symbol_matrix (EekKey          *key,
 | 
				
			|||||||
 * @key: an #EekKey
 | 
					 * @key: an #EekKey
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 * Get the symbol matrix of @key.
 | 
					 * Get the symbol matrix of @key.
 | 
				
			||||||
 * Returns: #EekSymbolMatrix or %NULL
 | 
					 * Returns: (transfer none): #EekSymbolMatrix or %NULL
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
EekSymbolMatrix *
 | 
					EekSymbolMatrix *
 | 
				
			||||||
eek_key_get_symbol_matrix (EekKey *key)
 | 
					eek_key_get_symbol_matrix (EekKey *key)
 | 
				
			||||||
 | 
				
			|||||||
@ -489,11 +489,11 @@ eek_theme_get_property (GObject    *object,
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * eek_theme_new:
 | 
					 * eek_theme_new:
 | 
				
			||||||
 * @application_stylesheet: The highest priority stylesheet, representing application-specific
 | 
					 * @application_stylesheet: (allow-none): The highest priority stylesheet, representing application-specific
 | 
				
			||||||
 *   styling; this is associated with the CSS "author" stylesheet, may be %NULL
 | 
					 *   styling; this is associated with the CSS "author" stylesheet, may be %NULL
 | 
				
			||||||
 * @theme_stylesheet: The second priority stylesheet, representing theme-specific styling ;
 | 
					 * @theme_stylesheet: (allow-none): The second priority stylesheet, representing theme-specific styling ;
 | 
				
			||||||
 *   this is associated with the CSS "user" stylesheet, may be %NULL
 | 
					 *   this is associated with the CSS "user" stylesheet, may be %NULL
 | 
				
			||||||
 * @default_stylesheet: The lowest priority stylesheet, representing global default styling;
 | 
					 * @default_stylesheet: (allow-none): The lowest priority stylesheet, representing global default styling;
 | 
				
			||||||
 *   this is associated with the CSS "user agent" stylesheet, may be %NULL
 | 
					 *   this is associated with the CSS "user agent" stylesheet, may be %NULL
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 * Return value: the newly created theme object
 | 
					 * Return value: the newly created theme object
 | 
				
			||||||
 | 
				
			|||||||
@ -1 +1 @@
 | 
				
			|||||||
SUBDIRS = eekboard-inscript simple-client
 | 
					SUBDIRS = eekxml simple-client
 | 
				
			||||||
 | 
				
			|||||||
@ -1,14 +0,0 @@
 | 
				
			|||||||
bin_SCRIPTS = eekboard-inscript
 | 
					 | 
				
			||||||
keyboarddir = $(pkgdatadir)/keyboards
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
eekboard_inscript_datadir = $(datarootdir)/eekboard-inscript
 | 
					 | 
				
			||||||
eekboard_inscript_data_PYTHON = inscript.py main.py
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
eekboard-inscript: eekboard-inscript.in
 | 
					 | 
				
			||||||
	$(AM_V_GEN) sed -e 's!@''PYTHON@!'$(PYTHON)'!' \
 | 
					 | 
				
			||||||
			-e 's!@EEKBOARD_KEYBOARDDIR@!'$(keyboarddir)'!' \
 | 
					 | 
				
			||||||
			-e 's!@M17N_DIR@!'$(datadir)/m17n'!' \
 | 
					 | 
				
			||||||
			-e 's!@EEKBOARD_INSCRIPT_DATADIR@!'$(eekboard_inscript_datadir)'!' < $< > $@
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
CLEANFILES = eekboard-inscript
 | 
					 | 
				
			||||||
EXTRA_DIST = eekboard-inscript.in
 | 
					 | 
				
			||||||
@ -1,23 +0,0 @@
 | 
				
			|||||||
#!/bin/sh
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# 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
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
export EEKBOARD_KEYBOARDDIR=@EEKBOARD_KEYBOARDDIR@
 | 
					 | 
				
			||||||
export M17N_DIR=@M17N_DIR@
 | 
					 | 
				
			||||||
exec @PYTHON@ @EEKBOARD_INSCRIPT_DATADIR@/main.py $@
 | 
					 | 
				
			||||||
@ -1,226 +0,0 @@
 | 
				
			|||||||
#!/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 eekboard
 | 
					 | 
				
			||||||
import gobject, gtk, virtkey
 | 
					 | 
				
			||||||
import sys, os.path, re
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
KEYCODE_TABLE = {
 | 
					 | 
				
			||||||
    '1': 10, '2': 11, '3': 12, '4': 13, '5': 14, '6': 15, '7': 16, '8': 17,
 | 
					 | 
				
			||||||
    '9': 18, '0': 19, '-': 20, '=': 21, 'q': 24, 'w': 25, 'e': 26, 'r': 27,
 | 
					 | 
				
			||||||
    't': 28, 'y': 29, 'u': 30, 'i': 31, 'o': 32, 'p': 33, '[': 34, ']': 35,
 | 
					 | 
				
			||||||
    'a': 38, 's': 39, 'd': 40, 'f': 41, 'g': 42, 'h': 43, 'j': 44, 'k': 45,
 | 
					 | 
				
			||||||
    'l': 46, ';': 47, '\'': 48, '`': 49, '\\': 51, 'z': 52, 'x': 53, 'c': 54,
 | 
					 | 
				
			||||||
    'v': 55, 'b': 56, 'n': 57, 'm': 58, ',': 59, '.': 60, '/': 61
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
MARK_UPPER = '~!@#$%^&*()_+{}|:"<>?'
 | 
					 | 
				
			||||||
MARK_LOWER = '`1234567890-=[]\\;\',./'
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
INSCRIPT_MAPS = (
 | 
					 | 
				
			||||||
    "as-inscript",
 | 
					 | 
				
			||||||
    "bn-inscript",
 | 
					 | 
				
			||||||
    "gu-inscript",
 | 
					 | 
				
			||||||
    "hi-inscript",
 | 
					 | 
				
			||||||
    "kn-inscript",
 | 
					 | 
				
			||||||
    "ml-inscript",
 | 
					 | 
				
			||||||
    "mr-inscript",
 | 
					 | 
				
			||||||
    "or-inscript",
 | 
					 | 
				
			||||||
    "pa-inscript",
 | 
					 | 
				
			||||||
    "sd-inscript",
 | 
					 | 
				
			||||||
    "ta-inscript",
 | 
					 | 
				
			||||||
    "te-inscript",
 | 
					 | 
				
			||||||
    "kn-inscript2",
 | 
					 | 
				
			||||||
    "kok-inscript2-deva",
 | 
					 | 
				
			||||||
    "mai-inscript2",
 | 
					 | 
				
			||||||
    "ml-inscript2",
 | 
					 | 
				
			||||||
    "mni-inscript2-beng",
 | 
					 | 
				
			||||||
    "mni-inscript2-mtei",
 | 
					 | 
				
			||||||
    "mr-inscript2",
 | 
					 | 
				
			||||||
    "ne-inscript2-deva",
 | 
					 | 
				
			||||||
    "or-inscript2",
 | 
					 | 
				
			||||||
    "pa-inscript2-guru",
 | 
					 | 
				
			||||||
    "sa-inscript2",
 | 
					 | 
				
			||||||
    "sat-inscript2-deva",
 | 
					 | 
				
			||||||
    "sat-inscript2-olck",
 | 
					 | 
				
			||||||
    "sd-inscript2-deva",
 | 
					 | 
				
			||||||
    "ta-inscript2",
 | 
					 | 
				
			||||||
    "te-inscript2")
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
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:
 | 
					 | 
				
			||||||
                    insert = match.group(3).decode('UTF-8')
 | 
					 | 
				
			||||||
                    if match.group(1):
 | 
					 | 
				
			||||||
                        keyseq = re.sub(r'\\(.)', r'\1', match.group(1))
 | 
					 | 
				
			||||||
                        self.__add_symbol_entry(keyseq, insert)
 | 
					 | 
				
			||||||
                    else:
 | 
					 | 
				
			||||||
                        keyseq = re.sub(r'\\(.)', r'\1', match.group(2))
 | 
					 | 
				
			||||||
                        self.__add_text_entry(keyseq, insert)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    def get_entry_for_keycode(self, keycode):
 | 
					 | 
				
			||||||
        return self.__dict.get(keycode)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    def __add_entry(self, letter, level, insert):
 | 
					 | 
				
			||||||
        if letter.isupper():
 | 
					 | 
				
			||||||
            level |= 1
 | 
					 | 
				
			||||||
            letter = letter.lower()
 | 
					 | 
				
			||||||
        elif letter in MARK_UPPER:
 | 
					 | 
				
			||||||
            level |= 1
 | 
					 | 
				
			||||||
            letter = MARK_LOWER[MARK_UPPER.index(letter)]
 | 
					 | 
				
			||||||
        keycode = KEYCODE_TABLE[letter]
 | 
					 | 
				
			||||||
        if keycode not in self.__dict:
 | 
					 | 
				
			||||||
            self.__dict[keycode] = list([None,None,None,None])
 | 
					 | 
				
			||||||
        self.__dict[keycode][level] = insert
 | 
					 | 
				
			||||||
        
 | 
					 | 
				
			||||||
    def __add_symbol_entry(self, symbol, insert):
 | 
					 | 
				
			||||||
        level = 0
 | 
					 | 
				
			||||||
        if symbol.startswith('G-'):
 | 
					 | 
				
			||||||
            level |= 2
 | 
					 | 
				
			||||||
            symbol = symbol[2:]
 | 
					 | 
				
			||||||
        if not symbol.startswith('KP_'):
 | 
					 | 
				
			||||||
            self.__add_entry(symbol, level, insert)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    def __add_text_entry(self, text, insert):
 | 
					 | 
				
			||||||
        self.__add_entry(text, 0, insert)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
class Keyboard(gobject.GObject):
 | 
					 | 
				
			||||||
    __gtype_name__ = "PYInscriptKeyboard"
 | 
					 | 
				
			||||||
    __gsignals__ = {
 | 
					 | 
				
			||||||
        'quit': (
 | 
					 | 
				
			||||||
            gobject.SIGNAL_RUN_LAST,
 | 
					 | 
				
			||||||
            gobject.TYPE_NONE,
 | 
					 | 
				
			||||||
            ()),
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    def __init__(self, client_name, map_path, kbd_path):
 | 
					 | 
				
			||||||
        super(Keyboard, self).__init__()
 | 
					 | 
				
			||||||
        self.__keyboard = self.__create_keyboard(map_path, kbd_path)
 | 
					 | 
				
			||||||
        self.__eekboard = eekboard.Eekboard()
 | 
					 | 
				
			||||||
        self.__context = self.__eekboard.create_context(client_name)
 | 
					 | 
				
			||||||
        keyboard_id = self.__context.add_keyboard(self.__keyboard)
 | 
					 | 
				
			||||||
        self.__context.set_keyboard(keyboard_id)
 | 
					 | 
				
			||||||
        self.__keyboard.connect('key-pressed', self.__key_pressed_cb)
 | 
					 | 
				
			||||||
        self.__keyboard.connect('key-released', self.__key_released_cb)
 | 
					 | 
				
			||||||
        self.__virtkey = virtkey.virtkey()
 | 
					 | 
				
			||||||
        self.__english = False
 | 
					 | 
				
			||||||
        self.__eekboard.connect('destroyed', self.__destroyed_cb)
 | 
					 | 
				
			||||||
        self.__context.connect('destroyed', self.__destroyed_cb)
 | 
					 | 
				
			||||||
        self.__context.connect('notify::keyboard-visible', self.__notify_keyboard_visible_cb)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    def __create_keyboard(self, map_path, kbd_path):
 | 
					 | 
				
			||||||
        def __each_key(element, data):
 | 
					 | 
				
			||||||
            keycode = element.get_keycode()
 | 
					 | 
				
			||||||
            # keycode 37 is used to toggle English/Inscript
 | 
					 | 
				
			||||||
            if keycode == 37:
 | 
					 | 
				
			||||||
                matrix = eekboard.SymbolMatrix.new(2, 1)
 | 
					 | 
				
			||||||
                keysym = eekboard.Keysym.new(0)
 | 
					 | 
				
			||||||
                keysym.set_label("Ind")
 | 
					 | 
				
			||||||
                keysym.set_category(eekboard.SymbolCategory.FUNCTION)
 | 
					 | 
				
			||||||
                matrix.set_symbol(0, 0, keysym)
 | 
					 | 
				
			||||||
                keysym = eekboard.Keysym.new(0)
 | 
					 | 
				
			||||||
                keysym.set_label("Eng")
 | 
					 | 
				
			||||||
                keysym.set_category(eekboard.SymbolCategory.FUNCTION)
 | 
					 | 
				
			||||||
                matrix.set_symbol(1, 0, keysym)
 | 
					 | 
				
			||||||
                element.set_symbol_matrix(matrix)
 | 
					 | 
				
			||||||
                return
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            # group(0) is us keyboard
 | 
					 | 
				
			||||||
            matrix = eekboard.SymbolMatrix.new(2, 4)
 | 
					 | 
				
			||||||
            for l in xrange(4):
 | 
					 | 
				
			||||||
                keysym = element.get_symbol_at_index(0, l, 0, 0)
 | 
					 | 
				
			||||||
                matrix.set_symbol(0, l, keysym)
 | 
					 | 
				
			||||||
            # group(1) is inscript keyboard
 | 
					 | 
				
			||||||
            entry = data.get_entry_for_keycode(keycode)
 | 
					 | 
				
			||||||
            for l in xrange(4):
 | 
					 | 
				
			||||||
                if entry and entry[l]:
 | 
					 | 
				
			||||||
                    try:
 | 
					 | 
				
			||||||
                        keyval = gtk.gdk.unicode_to_keyval(ord(entry[l]))
 | 
					 | 
				
			||||||
                        keysym = eekboard.Keysym.new(keyval)
 | 
					 | 
				
			||||||
                    except:
 | 
					 | 
				
			||||||
                        keysym = eekboard.Keysym.new(0)
 | 
					 | 
				
			||||||
                        keysym.set_label(entry[l].encode('UTF-8'))
 | 
					 | 
				
			||||||
                        keysym.set_category(eekboard.SymbolCategory.LETTER)
 | 
					 | 
				
			||||||
                        print >> sys.stderr, "can't convert %s (%d) to keyval" % (entry[l], keycode)
 | 
					 | 
				
			||||||
                else:
 | 
					 | 
				
			||||||
                    keysym = element.get_symbol_at_index(1, l, 0, 0)
 | 
					 | 
				
			||||||
                matrix.set_symbol(1, l, keysym)
 | 
					 | 
				
			||||||
            element.set_symbol_matrix(matrix)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        def __each_section(element, data):
 | 
					 | 
				
			||||||
            element.foreach_child(__each_key, data)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        mapfile = MapFile(map_path)
 | 
					 | 
				
			||||||
        keyboard = eekboard.XmlKeyboard(kbd_path,
 | 
					 | 
				
			||||||
                                        eekboard.MODIFIER_BEHAVIOR_LATCH)
 | 
					 | 
				
			||||||
        keyboard.foreach_child(__each_section, mapfile)
 | 
					 | 
				
			||||||
        return keyboard
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    def __destroyed_cb(self, *args):
 | 
					 | 
				
			||||||
        self.emit('quit')
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    def __notify_keyboard_visible_cb(self, obj, pspec):
 | 
					 | 
				
			||||||
        if not obj.get_property(pspec.name):
 | 
					 | 
				
			||||||
            self.emit('quit')
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    def enable(self):
 | 
					 | 
				
			||||||
        self.__eekboard.push_context(self.__context)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    def disable(self):
 | 
					 | 
				
			||||||
        self.__eekboard.pop_context(self.__context)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    def show(self):
 | 
					 | 
				
			||||||
        self.__context.show_keyboard()
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    def set_group(self, group):
 | 
					 | 
				
			||||||
        self.__group = group
 | 
					 | 
				
			||||||
        self.__context.set_group(self.__group)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    def __key_pressed_cb(self, keyboard, key):
 | 
					 | 
				
			||||||
        if key.get_keycode() == 37:
 | 
					 | 
				
			||||||
            return
 | 
					 | 
				
			||||||
        symbol = key.get_symbol()
 | 
					 | 
				
			||||||
        if isinstance(symbol, eekboard.Keysym):
 | 
					 | 
				
			||||||
            xkeysym = symbol.get_xkeysym()
 | 
					 | 
				
			||||||
            modifiers = self.__keyboard.get_modifiers()
 | 
					 | 
				
			||||||
            self.__virtkey.latch_mod(modifiers)
 | 
					 | 
				
			||||||
            self.__virtkey.press_keysym(xkeysym)
 | 
					 | 
				
			||||||
            self.__virtkey.unlatch_mod(modifiers)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    def __key_released_cb(self, keyboard, key):
 | 
					 | 
				
			||||||
        if key.get_keycode() == 37:
 | 
					 | 
				
			||||||
            if self.__english:
 | 
					 | 
				
			||||||
                self.__context.set_group(self.__group)
 | 
					 | 
				
			||||||
                self.__english = False
 | 
					 | 
				
			||||||
            else:
 | 
					 | 
				
			||||||
                self.__context.set_group(0)
 | 
					 | 
				
			||||||
                self.__english = True
 | 
					 | 
				
			||||||
            return
 | 
					 | 
				
			||||||
        symbol = key.get_symbol()
 | 
					 | 
				
			||||||
        if isinstance(symbol, eekboard.Keysym):
 | 
					 | 
				
			||||||
            xkeysym = symbol.get_xkeysym()
 | 
					 | 
				
			||||||
            self.__virtkey.release_keysym(xkeysym)
 | 
					 | 
				
			||||||
@ -1,60 +0,0 @@
 | 
				
			|||||||
# 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 inscript
 | 
					 | 
				
			||||||
import gtk
 | 
					 | 
				
			||||||
from optparse import OptionParser
 | 
					 | 
				
			||||||
import sys, os, os.path, glob
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
parser = OptionParser()
 | 
					 | 
				
			||||||
parser.add_option("-n", "--name=LANGCODE", dest="langcode",
 | 
					 | 
				
			||||||
                  help="Specify language code to LANGCODE",
 | 
					 | 
				
			||||||
                  metavar="LANGCODE")
 | 
					 | 
				
			||||||
parser.add_option("-l", "--list", dest="list", default=False,
 | 
					 | 
				
			||||||
                  action="store_true",
 | 
					 | 
				
			||||||
                  help="List available language codes")
 | 
					 | 
				
			||||||
(options, args) = parser.parse_args()
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
if options.list:
 | 
					 | 
				
			||||||
    pat = os.path.join(os.getenv("M17N_DIR"), "*.mim")
 | 
					 | 
				
			||||||
    for fname in sorted(glob.glob(pat)):
 | 
					 | 
				
			||||||
        mname = os.path.basename(fname[:-4])
 | 
					 | 
				
			||||||
        if mname in inscript.INSCRIPT_MAPS:
 | 
					 | 
				
			||||||
            print mname
 | 
					 | 
				
			||||||
    exit(0)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
if options.langcode is None:
 | 
					 | 
				
			||||||
    print >> sys.stderr, "Specify language code with -n"
 | 
					 | 
				
			||||||
    exit(1)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
map_path = os.path.join(os.getenv("M17N_DIR"), options.langcode + ".mim")
 | 
					 | 
				
			||||||
if not os.path.exists(map_path):
 | 
					 | 
				
			||||||
    print >> sys.stderr, "%s not found" % map_path
 | 
					 | 
				
			||||||
    exit(1)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
kbd_path = os.path.join(os.getenv("EEKBOARD_KEYBOARDDIR"), "us-qwerty.xml")
 | 
					 | 
				
			||||||
if not os.path.exists(kbd_path):
 | 
					 | 
				
			||||||
    print >> sys.stderr, "%s not found" % kbd_path
 | 
					 | 
				
			||||||
    exit(1)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
keyboard = inscript.Keyboard("eekboard-inscript", map_path, kbd_path)
 | 
					 | 
				
			||||||
keyboard.connect('quit', lambda *args: gtk.main_quit())
 | 
					 | 
				
			||||||
keyboard.set_group(1)
 | 
					 | 
				
			||||||
keyboard.enable()
 | 
					 | 
				
			||||||
keyboard.show()
 | 
					 | 
				
			||||||
gtk.main()
 | 
					 | 
				
			||||||
							
								
								
									
										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
 | 
				
			||||||
@ -18,8 +18,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
bin_PROGRAMS = \
 | 
					bin_PROGRAMS = \
 | 
				
			||||||
	eekboard \
 | 
						eekboard \
 | 
				
			||||||
	eekboard-server \
 | 
						eekboard-server
 | 
				
			||||||
	eekboard-xml
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
eekboard_CFLAGS = \
 | 
					eekboard_CFLAGS = \
 | 
				
			||||||
	-I$(top_srcdir) \
 | 
						-I$(top_srcdir) \
 | 
				
			||||||
@ -92,33 +91,10 @@ endif
 | 
				
			|||||||
eekboard_server_headers = server-service.h server-context-service.h
 | 
					eekboard_server_headers = server-service.h server-context-service.h
 | 
				
			||||||
eekboard_server_SOURCES = server-service.c server-context-service.c server-main.c
 | 
					eekboard_server_SOURCES = server-service.c server-context-service.c server-main.c
 | 
				
			||||||
 | 
					
 | 
				
			||||||
eekboard_xml_CFLAGS = \
 | 
					 | 
				
			||||||
	-I$(top_srcdir) \
 | 
					 | 
				
			||||||
	$(GIO2_CFLAGS) \
 | 
					 | 
				
			||||||
	$(GTK_CFLAGS) \
 | 
					 | 
				
			||||||
	$(LIBXKLAVIER_CFLAGS)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
eekboard_xml_LDADD = \
 | 
					 | 
				
			||||||
	$(top_builddir)/eekboard/libeekboard.la \
 | 
					 | 
				
			||||||
	$(top_builddir)/eek/libeek.la \
 | 
					 | 
				
			||||||
	$(top_builddir)/eek/libeek-xkl.la \
 | 
					 | 
				
			||||||
	$(top_builddir)/eek/libeek-gtk.la \
 | 
					 | 
				
			||||||
	$(GIO2_LIBS) \
 | 
					 | 
				
			||||||
	$(GTK_LIBS) \
 | 
					 | 
				
			||||||
	$(LIBXKLAVIER_LIBS)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
if ENABLE_CLUTTER
 | 
					 | 
				
			||||||
eekboard_xml_CFLAGS += $(CLUTTER_CFLAGS) $(CLUTTER_GTK_CFLAGS)
 | 
					 | 
				
			||||||
eekboard_xml_LDADD += $(CLUTTER_LIBS) $(top_builddir)/eek/libeek-clutter.la $(CLUTTER_GTK_LIBS)
 | 
					 | 
				
			||||||
endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
eekboard_xml_SOURCES = xml-main.c
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
eekboarddir = $(includedir)/eekboard-$(EEK_API_VERSION)/eekboard
 | 
					eekboarddir = $(includedir)/eekboard-$(EEK_API_VERSION)/eekboard
 | 
				
			||||||
eekboard_HEADERS =				\
 | 
					eekboard_HEADERS =				\
 | 
				
			||||||
	$(libeekboard_headers)
 | 
						$(libeekboard_headers)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
noinst_HEADERS = \
 | 
					noinst_HEADERS = \
 | 
				
			||||||
	$(eekboard_headers) \
 | 
						$(eekboard_headers) \
 | 
				
			||||||
	$(eekboard_server_headers) \
 | 
						$(eekboard_server_headers)
 | 
				
			||||||
	$(eekboard_xml_headers)
 | 
					 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										263
									
								
								src/xml-main.c
									
									
									
									
									
								
							
							
						
						
									
										263
									
								
								src/xml-main.c
									
									
									
									
									
								
							@ -1,263 +0,0 @@
 | 
				
			|||||||
/* 
 | 
					 | 
				
			||||||
 * 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
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
#ifdef HAVE_CONFIG_H
 | 
					 | 
				
			||||||
#include "config.h"
 | 
					 | 
				
			||||||
#endif  /* HAVE_CONFIG_H */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#include <string.h>
 | 
					 | 
				
			||||||
#include <stdlib.h>
 | 
					 | 
				
			||||||
#include <gdk/gdkx.h>
 | 
					 | 
				
			||||||
#include <glib/gi18n.h>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#include "eek/eek.h"
 | 
					 | 
				
			||||||
#include "eek/eek-xkl.h"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#if HAVE_CLUTTER_GTK
 | 
					 | 
				
			||||||
#include <clutter-gtk/clutter-gtk.h>
 | 
					 | 
				
			||||||
#include "eek/eek-clutter.h"
 | 
					 | 
				
			||||||
#else  /* HAVE_CLUTTER_GTK */
 | 
					 | 
				
			||||||
#include "eek/eek-gtk.h"
 | 
					 | 
				
			||||||
#endif  /* !HAVE_CLUTTER_GTK */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#include "eekboard/eekboard-xklutil.h"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#define BUFSIZE 8192
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static gchar *opt_load = NULL;
 | 
					 | 
				
			||||||
static gboolean opt_dump = FALSE;
 | 
					 | 
				
			||||||
static gchar *opt_list = NULL;
 | 
					 | 
				
			||||||
static guint opt_group = 0;
 | 
					 | 
				
			||||||
static gchar *opt_theme = NULL;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static const GOptionEntry options[] = {
 | 
					 | 
				
			||||||
    {"load", 'l', 0, G_OPTION_ARG_STRING, &opt_load,
 | 
					 | 
				
			||||||
     N_("Show the keyboard loaded from an XML file")},
 | 
					 | 
				
			||||||
    {"dump", 'd', 0, G_OPTION_ARG_NONE, &opt_dump,
 | 
					 | 
				
			||||||
     N_("Output the current layout into an XML file")},
 | 
					 | 
				
			||||||
    {"list", 'L', 0, G_OPTION_ARG_STRING, &opt_list,
 | 
					 | 
				
			||||||
     N_("List configuration items for given spec")},
 | 
					 | 
				
			||||||
    {"group", 'g', 0, G_OPTION_ARG_INT, &opt_group,
 | 
					 | 
				
			||||||
     N_("Specify group")},
 | 
					 | 
				
			||||||
    {"theme", 't', 0, G_OPTION_ARG_STRING, &opt_theme,
 | 
					 | 
				
			||||||
     N_("Specify theme")},
 | 
					 | 
				
			||||||
    {NULL}
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#if HAVE_CLUTTER_GTK
 | 
					 | 
				
			||||||
static void
 | 
					 | 
				
			||||||
on_allocation_changed (ClutterActor          *stage,
 | 
					 | 
				
			||||||
                       ClutterActorBox       *box,
 | 
					 | 
				
			||||||
                       ClutterAllocationFlags flags,
 | 
					 | 
				
			||||||
                       gpointer               user_data)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    ClutterActor *actor = user_data;
 | 
					 | 
				
			||||||
    clutter_actor_set_size (actor,
 | 
					 | 
				
			||||||
                            box->x2 - box->x1,
 | 
					 | 
				
			||||||
                            box->y2 - box->y1);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static void
 | 
					 | 
				
			||||||
on_destroy (gpointer user_data)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    gtk_main_quit ();
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static void
 | 
					 | 
				
			||||||
print_item (gpointer data,
 | 
					 | 
				
			||||||
            gpointer user_data)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    XklConfigItem *item = data;
 | 
					 | 
				
			||||||
    g_assert (item);
 | 
					 | 
				
			||||||
    printf ("%s: %s\n", item->name, item->description);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
int
 | 
					 | 
				
			||||||
main (int argc, char **argv)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    GOptionContext *context;
 | 
					 | 
				
			||||||
    EekKeyboard *keyboard = NULL;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#if HAVE_CLUTTER_GTK
 | 
					 | 
				
			||||||
    if (gtk_clutter_init (&argc, &argv) != CLUTTER_INIT_SUCCESS) {
 | 
					 | 
				
			||||||
        g_printerr ("Can't init GTK with Clutter\n");
 | 
					 | 
				
			||||||
        exit (1);
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
#else
 | 
					 | 
				
			||||||
    if (!gtk_init_check (&argc, &argv)) {
 | 
					 | 
				
			||||||
        g_printerr ("Can't init GTK\n");
 | 
					 | 
				
			||||||
        exit (1);
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    g_log_set_always_fatal (G_LOG_LEVEL_CRITICAL);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    context = g_option_context_new ("eek-example-xml");
 | 
					 | 
				
			||||||
    g_option_context_add_main_entries (context, options, NULL);
 | 
					 | 
				
			||||||
    g_option_context_parse (context, &argc, &argv, NULL);
 | 
					 | 
				
			||||||
    g_option_context_free (context);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if (!opt_list && !opt_load && !opt_dump) {
 | 
					 | 
				
			||||||
        g_printerr ("Specify -l, -d, or -L option\n");
 | 
					 | 
				
			||||||
        exit (1);
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if (opt_list) {
 | 
					 | 
				
			||||||
        GdkDisplay *display;
 | 
					 | 
				
			||||||
        XklEngine *engine;
 | 
					 | 
				
			||||||
        XklConfigRegistry *registry;
 | 
					 | 
				
			||||||
        GSList *items = NULL, *head;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        display = gdk_display_get_default ();
 | 
					 | 
				
			||||||
        engine = xkl_engine_get_instance (GDK_DISPLAY_XDISPLAY(display));
 | 
					 | 
				
			||||||
        registry = xkl_config_registry_get_instance (engine);
 | 
					 | 
				
			||||||
        xkl_config_registry_load (registry, FALSE);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        if (g_strcmp0 (opt_list, "model") == 0) {
 | 
					 | 
				
			||||||
            items = eekboard_xkl_list_models (registry);
 | 
					 | 
				
			||||||
        } else if (g_strcmp0 (opt_list, "layout") == 0) {
 | 
					 | 
				
			||||||
            items = eekboard_xkl_list_layouts (registry);
 | 
					 | 
				
			||||||
        } else if (g_strcmp0 (opt_list, "option-group") == 0) {
 | 
					 | 
				
			||||||
            items = eekboard_xkl_list_option_groups (registry);
 | 
					 | 
				
			||||||
        } else if (g_str_has_prefix (opt_list, "layout-variant-")) {
 | 
					 | 
				
			||||||
            items =  eekboard_xkl_list_layout_variants
 | 
					 | 
				
			||||||
                (registry,
 | 
					 | 
				
			||||||
                 opt_list + strlen ("layout-variant-"));
 | 
					 | 
				
			||||||
        } else if (g_str_has_prefix (opt_list, "option-")) {
 | 
					 | 
				
			||||||
            items = eekboard_xkl_list_options
 | 
					 | 
				
			||||||
                (registry,
 | 
					 | 
				
			||||||
                 opt_list + strlen ("option-"));
 | 
					 | 
				
			||||||
        } else {
 | 
					 | 
				
			||||||
            g_printerr ("Unknown list spec \"%s\"\n", opt_list);
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        g_slist_foreach (items, print_item, NULL);
 | 
					 | 
				
			||||||
        for (head = items; head; head = g_slist_next (head))
 | 
					 | 
				
			||||||
            g_object_unref (head->data);
 | 
					 | 
				
			||||||
        g_slist_free (items);
 | 
					 | 
				
			||||||
        g_object_unref (engine);
 | 
					 | 
				
			||||||
        g_object_unref (registry);
 | 
					 | 
				
			||||||
        exit (0);
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if (opt_load) {
 | 
					 | 
				
			||||||
        EekLayout *layout;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        if (g_str_has_prefix (opt_load, "xkb:")) {
 | 
					 | 
				
			||||||
            XklConfigRec *rec;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            rec = eekboard_xkl_config_rec_from_string (&opt_load[4]);
 | 
					 | 
				
			||||||
            layout = eek_xkl_layout_new ();
 | 
					 | 
				
			||||||
            eek_xkl_layout_set_config (EEK_XKL_LAYOUT(layout), rec);
 | 
					 | 
				
			||||||
            g_object_unref (rec);
 | 
					 | 
				
			||||||
        } else {
 | 
					 | 
				
			||||||
            GFile *file;
 | 
					 | 
				
			||||||
            GFileInputStream *input;
 | 
					 | 
				
			||||||
            GError *error;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            file = g_file_new_for_path (opt_load);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            error = NULL;
 | 
					 | 
				
			||||||
            input = g_file_read (file, NULL, &error);
 | 
					 | 
				
			||||||
            if (error) {
 | 
					 | 
				
			||||||
                g_printerr ("Can't read file %s: %s\n",
 | 
					 | 
				
			||||||
                            opt_load, error->message);
 | 
					 | 
				
			||||||
                exit (1);
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            layout = eek_xml_layout_new (G_INPUT_STREAM(input));
 | 
					 | 
				
			||||||
            g_object_unref (input);
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        keyboard = eek_keyboard_new (layout, 640, 480);
 | 
					 | 
				
			||||||
        g_object_unref (layout);
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if (!keyboard) {
 | 
					 | 
				
			||||||
        g_printerr ("Can't create keyboard\n");
 | 
					 | 
				
			||||||
        exit (1);
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if (opt_dump) {
 | 
					 | 
				
			||||||
        GString *output;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        output = g_string_sized_new (BUFSIZE);
 | 
					 | 
				
			||||||
        eek_keyboard_output (keyboard, output, 0);
 | 
					 | 
				
			||||||
        g_object_unref (keyboard);
 | 
					 | 
				
			||||||
        fwrite (output->str, sizeof(gchar), output->len, stdout);
 | 
					 | 
				
			||||||
        g_string_free (output, TRUE);
 | 
					 | 
				
			||||||
        exit (0);
 | 
					 | 
				
			||||||
    } else {
 | 
					 | 
				
			||||||
        EekBounds bounds;
 | 
					 | 
				
			||||||
        GtkWidget *widget, *window;
 | 
					 | 
				
			||||||
#if HAVE_CLUTTER_GTK
 | 
					 | 
				
			||||||
        ClutterActor *stage, *actor;
 | 
					 | 
				
			||||||
        ClutterColor stage_color = { 0xff, 0xff, 0xff, 0xff };
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        eek_element_set_group (EEK_ELEMENT(keyboard), opt_group);
 | 
					 | 
				
			||||||
        eek_element_get_bounds (EEK_ELEMENT(keyboard), &bounds);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#if HAVE_CLUTTER_GTK
 | 
					 | 
				
			||||||
        widget = gtk_clutter_embed_new ();
 | 
					 | 
				
			||||||
        stage = gtk_clutter_embed_get_stage (GTK_CLUTTER_EMBED(widget));
 | 
					 | 
				
			||||||
        actor = eek_clutter_keyboard_new (keyboard);
 | 
					 | 
				
			||||||
        if (opt_theme) {
 | 
					 | 
				
			||||||
            EekTheme *theme = eek_theme_new (opt_theme, NULL, NULL);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            eek_clutter_keyboard_set_theme (EEK_CLUTTER_KEYBOARD(actor), theme);
 | 
					 | 
				
			||||||
            g_object_unref (theme);
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        clutter_container_add_actor (CLUTTER_CONTAINER(stage), actor);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        clutter_stage_set_color (CLUTTER_STAGE(stage), &stage_color);
 | 
					 | 
				
			||||||
        clutter_stage_set_user_resizable (CLUTTER_STAGE(stage), TRUE);
 | 
					 | 
				
			||||||
        clutter_stage_set_minimum_size (CLUTTER_STAGE(stage),
 | 
					 | 
				
			||||||
                                        bounds.width / 3,
 | 
					 | 
				
			||||||
                                        bounds.height / 3);
 | 
					 | 
				
			||||||
        g_signal_connect (stage,
 | 
					 | 
				
			||||||
                          "allocation-changed",
 | 
					 | 
				
			||||||
                          G_CALLBACK(on_allocation_changed),
 | 
					 | 
				
			||||||
                          actor);
 | 
					 | 
				
			||||||
#else
 | 
					 | 
				
			||||||
        widget = eek_gtk_keyboard_new (keyboard);
 | 
					 | 
				
			||||||
        if (opt_theme) {
 | 
					 | 
				
			||||||
            EekTheme *theme = eek_theme_new (opt_theme, NULL, NULL);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            eek_gtk_keyboard_set_theme (EEK_GTK_KEYBOARD(widget), theme);
 | 
					 | 
				
			||||||
            g_object_unref (theme);
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
        g_object_unref (keyboard);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        gtk_widget_set_size_request (widget, bounds.width, bounds.height);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
 | 
					 | 
				
			||||||
        gtk_container_add (GTK_CONTAINER(window), widget);
 | 
					 | 
				
			||||||
        gtk_widget_show_all (window);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        g_signal_connect (G_OBJECT (window), "destroy",
 | 
					 | 
				
			||||||
                          G_CALLBACK (on_destroy), NULL);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        gtk_main ();
 | 
					 | 
				
			||||||
        exit (0);
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    return 0;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
		Reference in New Issue
	
	Block a user