diff --git a/.gitignore b/.gitignore index 7e0d8cad..c9cb7baf 100644 --- a/.gitignore +++ b/.gitignore @@ -4,6 +4,7 @@ *.o *.so *~ +*.pyc Makefile Makefile.in .deps diff --git a/configure.ac b/configure.ac index fd2eae3e..e67e22d5 100644 --- a/configure.ac +++ b/configure.ac @@ -340,7 +340,7 @@ data/icons/scalable/Makefile data/themes/Makefile data/keyboards/Makefile examples/Makefile -examples/eekboard-inscript/Makefile +examples/eekxml/Makefile examples/simple-client/Makefile eek/eek-${EEK_API_VERSION}.pc eek/eek-clutter-${EEK_API_VERSION}.pc diff --git a/eek/eek-element.c b/eek/eek-element.c index ed008b9d..5d5db86a 100644 --- a/eek/eek-element.c +++ b/eek/eek-element.c @@ -487,7 +487,7 @@ eek_element_set_bounds (EekElement *element, /** * eek_element_get_bounds: * @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 * parent, position of @bounds are relative to the parent. To obtain diff --git a/eek/eek-key.c b/eek/eek-key.c index db8ae747..0cd40b9d 100644 --- a/eek/eek-key.c +++ b/eek/eek-key.c @@ -540,7 +540,7 @@ eek_key_set_symbol_matrix (EekKey *key, * @key: an #EekKey * * Get the symbol matrix of @key. - * Returns: #EekSymbolMatrix or %NULL + * Returns: (transfer none): #EekSymbolMatrix or %NULL */ EekSymbolMatrix * eek_key_get_symbol_matrix (EekKey *key) diff --git a/eek/eek-theme.c b/eek/eek-theme.c index cf924023..a80d0433 100644 --- a/eek/eek-theme.c +++ b/eek/eek-theme.c @@ -489,11 +489,11 @@ eek_theme_get_property (GObject *object, /** * 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 - * @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 - * @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 * * Return value: the newly created theme object diff --git a/examples/Makefile.am b/examples/Makefile.am index c7d4fd8e..deb702a6 100644 --- a/examples/Makefile.am +++ b/examples/Makefile.am @@ -1 +1 @@ -SUBDIRS = eekboard-inscript simple-client +SUBDIRS = eekxml simple-client diff --git a/examples/eekboard-inscript/Makefile.am b/examples/eekboard-inscript/Makefile.am deleted file mode 100644 index 007ea71d..00000000 --- a/examples/eekboard-inscript/Makefile.am +++ /dev/null @@ -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 diff --git a/examples/eekboard-inscript/eekboard-inscript.in b/examples/eekboard-inscript/eekboard-inscript.in deleted file mode 100644 index d5115652..00000000 --- a/examples/eekboard-inscript/eekboard-inscript.in +++ /dev/null @@ -1,23 +0,0 @@ -#!/bin/sh - -# Copyright (C) 2011 Daiki Ueno -# 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 $@ diff --git a/examples/eekboard-inscript/inscript.py b/examples/eekboard-inscript/inscript.py deleted file mode 100644 index f0d5a778..00000000 --- a/examples/eekboard-inscript/inscript.py +++ /dev/null @@ -1,226 +0,0 @@ -#!/usr/bin/env python - -# Copyright (C) 2011 Daiki Ueno -# 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) diff --git a/examples/eekboard-inscript/main.py b/examples/eekboard-inscript/main.py deleted file mode 100644 index b96f6dea..00000000 --- a/examples/eekboard-inscript/main.py +++ /dev/null @@ -1,60 +0,0 @@ -# Copyright (C) 2011 Daiki Ueno -# 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() diff --git a/examples/eekxml/Makefile.am b/examples/eekxml/Makefile.am new file mode 100644 index 00000000..77363720 --- /dev/null +++ b/examples/eekxml/Makefile.am @@ -0,0 +1,5 @@ +bin_SCRIPTS = eekxml +EXTRA_DIST = mim2remap + +eekxml: eekxml.in + $(AM_V_GEN) sed '1s!@''PYTHON@!'$(PYTHON)'!' $< > $@ diff --git a/examples/eekxml/eekxml.in b/examples/eekxml/eekxml.in new file mode 100644 index 00000000..d7ec6ddd --- /dev/null +++ b/examples/eekxml/eekxml.in @@ -0,0 +1,124 @@ +#!@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']) + 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) diff --git a/examples/eekxml/mim2remap b/examples/eekxml/mim2remap new file mode 100755 index 00000000..b3441d5c --- /dev/null +++ b/examples/eekxml/mim2remap @@ -0,0 +1,73 @@ +#!/usr/bin/env python + +# Copyright (C) 2011 Daiki Ueno +# 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 diff --git a/src/Makefile.am b/src/Makefile.am index 52fd4065..da64b6b4 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -18,8 +18,7 @@ bin_PROGRAMS = \ eekboard \ - eekboard-server \ - eekboard-xml + eekboard-server eekboard_CFLAGS = \ -I$(top_srcdir) \ @@ -92,33 +91,10 @@ endif eekboard_server_headers = server-service.h server-context-service.h 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 eekboard_HEADERS = \ $(libeekboard_headers) noinst_HEADERS = \ $(eekboard_headers) \ - $(eekboard_server_headers) \ - $(eekboard_xml_headers) + $(eekboard_server_headers) diff --git a/src/xml-main.c b/src/xml-main.c deleted file mode 100644 index 70282bbb..00000000 --- a/src/xml-main.c +++ /dev/null @@ -1,263 +0,0 @@ -/* - * Copyright (C) 2011 Daiki Ueno - * 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 -#include -#include -#include - -#include "eek/eek.h" -#include "eek/eek-xkl.h" - -#if HAVE_CLUTTER_GTK -#include -#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; -}