Compare commits

..

109 Commits

Author SHA1 Message Date
5099f7db88 Bump version to 1.0.6. 2012-03-30 17:41:46 +09:00
ab8cd246bf Fix make distcheck. 2012-03-30 17:40:16 +09:00
528981f913 Drop IBus dependency when compiling. 2012-03-30 17:23:47 +09:00
3fd5eb789c Fix EekboardContext::key_activated signature. 2012-03-30 16:27:48 +09:00
9c09777c09 Place preferences key on the right bottom corner. 2012-03-29 19:08:54 +09:00
7298d320e0 Refine keysym handling. 2012-03-29 16:27:56 +09:00
39154fa5ad Fix keysym replace logic. 2012-03-28 19:03:34 +09:00
6db99bee25 Don't enumerate over keys when find_by_keycode. 2012-03-28 14:43:49 +09:00
ee0505c100 Add keyboard selection dialog to preferences. 2012-03-28 12:54:22 +09:00
1943749cb6 Drop GTK2 support. 2012-03-23 18:07:05 +09:00
5763ed20bf Remove eekxml. 2012-03-23 18:07:05 +09:00
7eead1c1ff Fix some mistakes. 2012-03-23 18:07:05 +09:00
048e08b59a Factor out symbols from keyboard file. 2012-03-23 18:07:01 +09:00
523bd9b788 Remove unused code. 2012-03-19 10:53:27 +09:00
f442733b33 Fix some mistakes.
* remove useless g_obect_{set,get}_property call.
* free GError on error.
2012-03-16 18:15:50 +09:00
a6fe5bd859 Use GInitable to define EekXklLayout. 2012-03-16 17:36:20 +09:00
32a1d23c2a Simplify codebase.
* Drop clutter support.
* Unify eek-xkb into eek-xkl.
* Generate vapi from gir instead of gi.
2012-03-16 16:32:33 +09:00
06644945cf Remove python binding. 2012-03-16 15:47:36 +09:00
1774a2c23e Update version to 1.0.5. 2011-11-25 14:37:44 +09:00
668b974dd7 Improve border rendering without theme. 2011-10-14 10:04:16 +09:00
4427f81dd9 Fix eek-0.90 vala binding.
Mark struct types in eek-0.90.metadata; add eek-text.h to eek-0.90.files.
2011-10-12 11:33:56 +09:00
9490428535 Don't call g_log_set_always_fatal() in eekboard-server. 2011-10-11 11:37:02 +09:00
8d70eedc5f Update to 1.0.4. 2011-09-30 11:50:40 +09:00
74550d2424 Fix label alignment when the text is RTL. 2011-09-30 11:48:36 +09:00
148d8e7524 Revive eekboard -k option to specify keyboard from command line. 2011-09-28 15:07:46 +09:00
aca9a4dcb6 Fix some mistakes. 2011-09-15 17:47:38 +09:00
953c35bdac Change window strut when monitor changed. 2011-09-15 17:47:26 +09:00
596b33f149 Fix commit 15f7b0ec. 2011-09-12 17:24:36 +09:00
ef3ea618d2 Change the type of gsettings key "keyboard" from s to as.
Also rename it to "keyboards".
2011-09-12 15:33:59 +09:00
362b210a31 Set icon in keyboard files. 2011-09-12 13:47:39 +09:00
15f7b0ecff Send fake key event for each character in EekText symbol. 2011-09-12 12:51:17 +09:00
f72e9f5293 Copy pressed_keys list before sending released/cancelled signal (RHBZ#737396). 2011-09-12 11:06:52 +09:00
0d93f31eea Add window size constraint option in gsettings. 2011-09-02 18:18:47 +09:00
f1af125d24 Update to 1.0.3. 2011-09-02 17:06:02 +09:00
a6c08bee7b Allow 0xXXXX in mim2remap.el. 2011-09-01 15:08:43 +09:00
c2d2c8660f Add more keyboards convertd from m17n-db. 2011-09-01 12:51:03 +09:00
db3538af64 Send DestroyContext when EekboardClient#dispose. 2011-09-01 11:19:41 +09:00
04ac7fb19e Fix typo. 2011-08-31 16:22:42 +09:00
53e853fbc9 Change D-Bus signal name KeyPressed to KeyActivated. 2011-08-31 10:00:00 +09:00
747ce4e00b Add all subdirs to SUBDIRS regardless of automake conditionals. 2011-08-30 18:55:31 +09:00
5f6eb76d7f Add inscript keyboards. 2011-08-30 18:17:47 +09:00
3777620574 Preserve symbol attributes when serializing/deserializing XML. 2011-08-30 18:17:47 +09:00
b02ae1b7cc Support text symbol.
a
2011-08-30 18:17:45 +09:00
88816018d8 Rewrite mim2remap in elisp to properly parse *.mim files. 2011-08-30 16:23:11 +09:00
06e7e2afac Fix python binding. 2011-08-26 13:04:35 +09:00
ce2c4ed0f4 Update to 1.0.2. 2011-08-25 10:34:11 +09:00
099ca60975 Update doc comments. 2011-08-25 10:31:41 +09:00
43ab623fac Make sure that preferences dialog is kept above. 2011-08-25 07:11:50 +09:00
bcc9a8fd60 Swap ISO_Level3_Shift with Control_L in keyboard XML. 2011-08-25 07:11:40 +09:00
6fb96ea5d6 Fix crash in key replace logic. 2011-08-25 05:39:51 +09:00
2f64b3ee13 Fix doc comments. 2011-08-24 17:59:57 +09:00
d4a78e5dc7 Suppress compile warnings. 2011-08-24 17:44:31 +09:00
71033f5739 Update gtk-doc sections. 2011-08-24 17:43:55 +09:00
17444509fe Mark some files to be translated. 2011-08-24 17:43:12 +09:00
42baa22cdc Add doc comment for libeekboard. 2011-08-24 17:43:00 +09:00
f07de8cd3b Add a button to launch preferences dialog. 2011-08-24 17:05:52 +09:00
0772898b83 Improve icon rendering. 2011-08-24 17:05:41 +09:00
828b2d66d1 Save delay/interval as uint, instead of int. 2011-08-24 17:04:50 +09:00
8ab4fb7946 Implement preferences dialog. 2011-08-24 15:24:59 +09:00
e91a059f0f Ignore some files. 2011-08-24 11:10:28 +09:00
093d83ed89 Use AM_V_GEN for generating keysym-entries headers. 2011-08-24 11:03:46 +09:00
5c0381e4f0 Fix VAPIGEN macro. 2011-08-24 11:02:13 +09:00
657c6f8e35 Use GI instead of pygtk2 in mim2remap. 2011-08-24 11:01:33 +09:00
4bb984daf3 Rewrite simple-client in python. 2011-08-23 18:08:56 +09:00
e46a3f89ed Add theme option in gsettings. 2011-08-23 17:49:43 +09:00
6843cd62dd Fix vala binding. 2011-08-23 17:10:39 +09:00
52ffc77fdd Fix make distcheck. 2011-08-23 17:10:17 +09:00
158542ec0a Replace eekboard-xml and eekboard-inscript with eekxml and mim2remap. 2011-08-23 16:29:10 +09:00
360da8a3c9 Update vala binding. 2011-08-23 14:17:07 +09:00
65d1186317 Update python binding. 2011-08-23 10:27:29 +09:00
b7b4d68a9a Fix fullscreen mode and D-Bus service entry. 2011-08-22 22:24:17 +09:00
952f70b433 Fix typo. 2011-08-22 18:05:25 +09:00
74de8e5056 Fix clutter build. 2011-08-22 16:17:58 +09:00
9d88c1c5da Fix memleaks; add doc comments. 2011-08-22 16:12:23 +09:00
a6bde78168 Highlight locked modifiers. 2011-08-22 14:44:46 +09:00
bb85885e5d Revamp server-client API. 2011-08-20 13:17:16 +09:00
dd085be73d Fix GTK2 build. 2011-08-19 07:56:25 +09:00
f576310cdf Update keyboards. 2011-08-19 07:52:46 +09:00
70e1c98987 Rescale jp-kana.xml. 2011-08-18 18:34:59 +09:00
4f03aa82fe Rename kana.xml -> jp-kana.xml. 2011-08-18 18:29:24 +09:00
383c93a415 Fix fit-size calculation. 2011-08-18 18:06:52 +09:00
860fbe8ede Add kana keyboard. 2011-08-18 17:19:38 +09:00
39900bd987 Allow non-keysym symbols in XML. 2011-08-18 17:02:39 +09:00
5c09147551 Optimize container element traversal. 2011-08-18 17:01:48 +09:00
f0929a9bd8 Add Thai keyboard. 2011-08-18 15:23:57 +09:00
786496b3c4 Fix system (xklavier) layout handling. 2011-08-18 14:32:53 +09:00
e5f5c8273e Make GTK3 default. 2011-08-18 14:25:40 +09:00
ca250699ef Remove --model/layouts/options from eekboard-xml. 2011-08-18 12:48:32 +09:00
7f41af3ee7 Change xkb: keyboard type format.
It is now "MODEL/L0(V0);L1(V1);...;Ln(Vn)/O0;O1;...;On".
2011-08-18 12:47:38 +09:00
260dc3fddd Fix example/simple-client. 2011-08-18 12:16:39 +09:00
052c40cc26 Remove serialization code for EekKey, EekSection, and EekKeyboard. 2011-08-18 12:00:54 +09:00
1b5bab9c18 Add eek_init(). 2011-08-18 11:53:44 +09:00
6a7b256676 Remove unnecessary null initialization. 2011-08-18 11:31:01 +09:00
0e135129e2 Read keyboard type from GSettings. 2011-08-18 11:18:55 +09:00
7af6bf13ed Support feedback sounds. 2011-08-18 11:18:27 +09:00
91ed49b65a Make server responsible for loading keyboard files. 2011-08-17 18:19:36 +09:00
84f614528f Use GList instead of GSList in eek-container. 2011-08-17 13:23:19 +09:00
7c0e29fc86 Allow both -l and -d to be given to eekboard-xml. 2011-08-17 13:21:49 +09:00
1f9e4bd576 Fix dock support. 2011-08-16 18:03:20 +09:00
fc0a577dfb Suggest to use ibus focus-listener rather than atspi. 2011-08-16 17:34:15 +09:00
69d16ddce5 Use org.freedesktop.IBus.Panel.Focus{In,Out} instead of InputContext. 2011-08-16 17:24:07 +09:00
984813b154 Adjust the default values of key-repeat options.
Also make "auto-hide-delay" type integer rather than double.
2011-08-16 16:30:17 +09:00
b6beeedc26 Improve key-repeat behavior. 2011-08-16 16:30:13 +09:00
55f7a0d0dc Make sure large key does not overlap with the small key. 2011-08-15 18:13:55 +09:00
7919cc191e Capture motion-notify event. 2011-08-15 18:10:57 +09:00
db0c5088b7 Apply active style to the key under the large key. 2011-08-15 17:49:02 +09:00
cc4b9a6b45 Add cursor keys to us-qwerty map. 2011-08-15 17:25:22 +09:00
f4e33a4ad4 Make sure that large key bounds do not overflow the widget allocation. 2011-08-15 16:45:11 +09:00
0e0fe9ed51 Support key repeat. 2011-08-15 15:18:52 +09:00
168 changed files with 14691 additions and 10379 deletions

8
.gitignore vendored
View File

@ -4,6 +4,7 @@
*.o *.o
*.so *.so
*~ *~
*.pyc
Makefile Makefile
Makefile.in Makefile.in
.deps .deps
@ -41,12 +42,12 @@ eek/*.typelib
eekboard/*.pc eekboard/*.pc
eekboard/*.gir eekboard/*.gir
eekboard/*.typelib eekboard/*.typelib
eekboard/eekboard-marshalers.[ch]
tests/eek-simple-test tests/eek-simple-test
tests/eek-xkb-test tests/eek-xkb-test
tests/eek-xml-test tests/eek-xml-test
src/eekboard src/eekboard
src/eekboard-server src/eekboard-server
src/eekboard-xml
docs/reference/eek/*.stamp docs/reference/eek/*.stamp
docs/reference/eek/*.txt docs/reference/eek/*.txt
docs/reference/eek/eek.types docs/reference/eek/eek.types
@ -76,7 +77,8 @@ po/.intltool-merge-cache
bindings/vala/*.vapi bindings/vala/*.vapi
py-compile py-compile
data/org.fedorahosted.eekboard.gschema.xml data/org.fedorahosted.eekboard.gschema.xml
data/org.fedorahosted.eekboard.gschema.valid
data/eekboard-server.service data/eekboard-server.service
data/*.desktop data/*.desktop
examples/eekboard-inscript/eekboard-inscript examples/eekxml/eekxml
examples/simple-client/simple-client

57
README
View File

@ -3,12 +3,12 @@ eekboard - an easy to use virtual keyboard toolkit -*- outline -*-
eekboard is a virtual keyboard software package, including a set of eekboard is a virtual keyboard software package, including a set of
tools to implement desktop virtual keyboards. tools to implement desktop virtual keyboards.
* How to build * Building
** Dependencies ** Dependencies
REQUIRED: GLib2, GTK, PangoCairo, libxklavier, libcroco REQUIRED: GLib2, GTK, PangoCairo, libxklavier, libcroco
OPTIONAL: libXtst, at-spi2-core, IBus, Clutter, Clutter-Gtk, Python, Vala, gobject-introspection OPTIONAL: libXtst, at-spi2-core, IBus, Clutter, Clutter-Gtk, Python, Vala, gobject-introspection, libcanberra
** Build from git repo ** Build from git repo
@ -24,55 +24,12 @@ OPTIONAL: libXtst, at-spi2-core, IBus, Clutter, Clutter-Gtk, Python, Vala, gobje
$ make $ make
$ sudo make install $ sudo make install
* Using command-line tools * Running
eekboard currently includes 3 tools to implement your own virtual
keyboard.
** eekboard-server
eekboard-server is a D-Bus server which is responsible for drawing
interactive on-screen keyboards. Since it has a D-Bus service
activation entry, you will not need to start it manually, but you can
do that with:
$ eekboard-server &
** eekboard
eekboard is a client of eekboard-server. It listens desktop events
(keyboard change, focus in/out, and keystroke) and generates key
events when some keys are pressed on the on-screen keyboard. It can
be started with:
$ eekboard $ eekboard
$ eekboard -f # show/hide automatically based on focus-in/focus-out events
By default it renders current system keyboard layout. To read custom Even though eekboard -f watches a11y events by default, it currently
keyboard layout, specify --keyboard option like: works better with IBus. To use IBus, do:
$ eekboard --keyboard /usr/share/eekboard/keyboards/us-qwerty.xml $ gsettings set org.fedorahosted.eekboard focus-listener 'ibus'
** eekboard-xml
eekboard-xml is a tool to manipulate XML keyboard description read by
eekboard if --keyboard option is specified.
To dump the current system keyboard layout into an XML file:
$ eekboard-xml --dump > keyboard.xml
You can display the dumped layout with:
$ eekboard-xml --load keyboard.xml
* Using library
eekboard currently includes two libraries. One is to access
eekboard-server via D-Bus and another is to manually render on-screen
keyboards.
For the former, see
file:docs/reference/eekboard/html/index.html
For the latter, see
See file:docs/reference/eek/html/index.html

View File

@ -16,12 +16,4 @@
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
# 02110-1301 USA # 02110-1301 USA
SUBDIRS = SUBDIRS = vala
if ENABLE_PYTHON
SUBDIRS += python
endif
if ENABLE_VALA
SUBDIRS += vala
endif

View File

@ -1,18 +0,0 @@
# 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/>.
SUBDIRS = eekboard

View File

@ -1,21 +0,0 @@
# 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/>.
pkgpython_PYTHON = \
__init__.py \
eekboard.py \
context.py

View File

@ -1,67 +0,0 @@
# 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/>.
from gi.repository import Eek, EekXkl, Gio
from eekboard import Eekboard
from context import Context
Keyboard = Eek.Keyboard
Section = Eek.Section
Key = Eek.Key
Symbol = Eek.Symbol
Keysym = Eek.Keysym
SymbolMatrix = Eek.SymbolMatrix
MODIFIER_BEHAVIOR_NONE, \
MODIFIER_BEHAVIOR_LOCK, \
MODIFIER_BEHAVIOR_LATCH = \
(Eek.ModifierBehavior.NONE,
Eek.ModifierBehavior.LOCK,
Eek.ModifierBehavior.LATCH)
SymbolCategory = Eek.SymbolCategory
CSW = 640
CSH = 480
def XmlKeyboard(path, modifier_behavior=MODIFIER_BEHAVIOR_NONE):
_file = Gio.file_new_for_path(path)
layout = Eek.XmlLayout.new(_file.read())
keyboard = Eek.Keyboard.new(layout, CSW, CSH)
keyboard.set_modifier_behavior(modifier_behavior)
keyboard.set_alt_gr_mask(Eek.ModifierType.MOD5_MASK)
return keyboard
def XklKeyboard(modifier_behavior=MODIFIER_BEHAVIOR_NONE):
layout = EekXkl.Layout.new()
keyboard = Eek.Keyboard.new(layout, CSW, CSH)
keyboard.set_modifier_behavior(modifier_behavior)
return keyboard
__all__ = ['Eekboard',
'Context',
'Keyboard',
'Section',
'Key',
'Symbol',
'Keysym',
'MODIFIER_BEHAVIOR_NONE',
'MODIFIER_BEHAVIOR_LOCK',
'MODIFIER_BEHAVIOR_LATCH',
'XmlKeyboard',
'XklKeyboard']

View File

@ -1,100 +0,0 @@
# 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/>.
from gi.repository import Eekboard
import gobject
class Context(gobject.GObject):
__gtype_name__ = "PYEekboardContext"
__gsignals__ = {
'enabled': (
gobject.SIGNAL_RUN_LAST,
gobject.TYPE_NONE,
()),
'disabled': (
gobject.SIGNAL_RUN_LAST,
gobject.TYPE_NONE,
()),
'key-pressed': (
gobject.SIGNAL_RUN_LAST,
gobject.TYPE_NONE,
(gobject.TYPE_UINT,)),
'key-released': (
gobject.SIGNAL_RUN_LAST,
gobject.TYPE_NONE,
(gobject.TYPE_UINT,)),
'destroyed': (
gobject.SIGNAL_RUN_LAST,
gobject.TYPE_NONE,
()),
}
__gproperties__ = {
'keyboard-visible': (bool, None, None, False, gobject.PARAM_READWRITE),
}
def __init__(self, giobject):
super(Context, self).__init__()
self.__properties = dict()
self.__giobject = giobject
self.__giobject.connect('enabled', lambda *args: self.emit('enabled'))
self.__giobject.connect('disabled', lambda *args: self.emit('disabled'))
self.__giobject.connect('key-pressed', lambda *args: self.emit('key-pressed', args[1]))
self.__giobject.connect('key-released', lambda *args: self.emit('key-released', args[1]))
self.__giobject.connect('destroyed', lambda *args: self.emit('destroyed'))
self.__giobject.connect('notify::keyboard-visible', self.__notify_keyboard_visible_cb)
def do_set_property(self, pspec, value):
self.__properties[pspec.name] = value
def do_get_property(self, pspec):
return self.__properties[pspec.name]
def __notify_keyboard_visible_cb(self, *args):
self.set_property('keyboard-visible',
self.__giobject.get_property(args[1].name))
self.notify('keyboard-visible')
def get_giobject(self):
return self.__giobject
def add_keyboard(self, keyboard):
return self.__giobject.add_keyboard(keyboard, None)
def remove_keyboard(self, keyboard_id):
return self.__giobject.remove_keyboard(keyboard_id, None)
def set_keyboard(self, keyboard_id):
self.__giobject.set_keyboard(keyboard_id, None)
def show_keyboard(self):
self.__giobject.show_keyboard(None)
def hide_keyboard(self):
self.__giobject.hide_keyboard(None)
def set_group(self, group):
self.__giobject.set_group(group, None)
def press_key(self, keycode):
self.__giobject.press_key(keycode, None)
def release_key(self, keycode):
self.__giobject.release_key(keycode, None)
def is_enabled(self):
return self.__giobject.is_enabled()

View File

@ -1,49 +0,0 @@
# 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/>.
from gi.repository import Gio
import gi.repository
import gobject
from context import Context
class Eekboard(gobject.GObject):
__gtype_name__ = "PYEekboardEekboard"
__gsignals__ = {
'destroyed': (
gobject.SIGNAL_RUN_LAST,
gobject.TYPE_NONE,
())
}
def __init__(self):
super(Eekboard, self).__init__()
self.__connection = Gio.bus_get_sync(Gio.BusType.SESSION, None)
self.__eekboard = gi.repository.Eekboard.Eekboard.new(self.__connection, None);
self.__eekboard.connect('destroyed', lambda *args: self.emit('destroyed'))
def create_context(self, client_name):
context = self.__eekboard.create_context(client_name, None)
return Context(context)
def push_context(self, context):
self.__eekboard.push_context(context.get_giobject(), None)
def pop_context(self):
self.__eekboard.pop_context(None)
def destroy_context(self, context):
self.__eekboard.destroy_context(context.get_giobject(), None)

View File

@ -16,59 +16,68 @@
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
# 02110-1301 USA # 02110-1301 USA
if ENABLE_VALA
vapidir = $(datadir)/vala/vapi vapidir = $(datadir)/vala/vapi
dist_vapi_DATA = \ dist_vapi_DATA = \
eek-$(EEK_API_VERSION).vapi \ eek-$(EEK_API_VERSION).vapi \
eek-clutter-$(EEK_API_VERSION).vapi \ eek-$(EEK_API_VERSION).deps \
eek-gtk-$(EEK_API_VERSION).vapi \ eek-gtk-$(EEK_API_VERSION).vapi \
eek-xkb-$(EEK_API_VERSION).vapi \ eek-gtk-$(EEK_API_VERSION).deps \
eek-xkl-$(EEK_API_VERSION).vapi eek-xkl-$(EEK_API_VERSION).vapi \
MAINTAINERCLEANFILES = $(dist_vapi_DATA) eek-xkl-$(EEK_API_VERSION).deps \
$(NULL)
eek-$(EEK_API_VERSION).vapi: EXTRA_DIST = \
Eek-$(EEK_API_VERSION).metadata \
EekGtk-$(EEK_API_VERSION).metadata \
EekXkl-$(EEK_API_VERSION).metadata \
$(NULL)
maintainer-clean-local:
rm -f *.vapi
eek_vapi_deps = \
$(srcdir)/Eek-$(EEK_API_VERSION).metadata \
| \
$(top_srcdir)/eek/Eek-$(EEK_API_VERSION).gir \
$(NULL)
eek-$(EEK_API_VERSION).vapi: $(eek_vapi_deps)
$(VAPIGEN_V)$(VAPIGEN) \ $(VAPIGEN_V)$(VAPIGEN) \
--library eek-$(EEK_API_VERSION) \ --library eek-$(EEK_API_VERSION) \
--pkg gio-2.0 \ --pkg gio-2.0 \
eek-$(EEK_API_VERSION)/eek-$(EEK_API_VERSION).gi --metadatadir=$(srcdir) \
$(top_srcdir)/eek/Eek-$(EEK_API_VERSION).gir
eek-clutter-$(EEK_API_VERSION).vapi: eek-$(EEK_API_VERSION).vapi eek_gtk_vapi_deps = \
$(VAPIGEN_V)$(VAPIGEN) --vapidir=$(builddir) \ $(srcdir)/EekGtk-$(EEK_API_VERSION).metadata \
--library eek-clutter-$(EEK_API_VERSION) \ | \
--pkg eek-$(EEK_API_VERSION) \ $(top_srcdir)/eek/EekGtk-$(EEK_API_VERSION).gir \
--pkg clutter-1.0 \ $(NULL)
--pkg gio-2.0 \
--pkg atk \
eek-clutter-$(EEK_API_VERSION)/eek-clutter-$(EEK_API_VERSION).gi
eek-gtk-$(EEK_API_VERSION).vapi: eek-$(EEK_API_VERSION).vapi eek-gtk-$(EEK_API_VERSION).vapi: $(eek_gtk_vapi_deps)
$(VAPIGEN_V)$(VAPIGEN) --vapidir=$(builddir) \ $(VAPIGEN_V)$(VAPIGEN) --vapidir=$(builddir) \
--library eek-gtk-$(EEK_API_VERSION) \ --library eek-gtk-$(EEK_API_VERSION) \
--pkg eek-$(EEK_API_VERSION) \ --pkg eek-$(EEK_API_VERSION) \
--pkg gtk+-2.0 \ --pkg gtk+-3.0 \
eek-gtk-$(EEK_API_VERSION)/eek-gtk-$(EEK_API_VERSION).gi --metadatadir=$(srcdir) \
$(top_srcdir)/eek/EekGtk-$(EEK_API_VERSION).gir
eek-xkb-$(EEK_API_VERSION).vapi: eek-$(EEK_API_VERSION).vapi eek_xkl_vapi_deps = \
$(VAPIGEN_V)$(VAPIGEN) --vapidir=$(builddir) \ $(srcdir)/EekXkl-$(EEK_API_VERSION).metadata \
--library eek-xkb-$(EEK_API_VERSION) \ | \
--pkg eek-$(EEK_API_VERSION) \ $(top_srcdir)/eek/EekXkl-$(EEK_API_VERSION).gir \
--pkg gio-2.0 \ $(NULL)
eek-xkb-$(EEK_API_VERSION)/eek-xkb-$(EEK_API_VERSION).gi
eek-xkl-$(EEK_API_VERSION).vapi: eek-xkb-$(EEK_API_VERSION).vapi eek-xkl-$(EEK_API_VERSION).vapi: $(eek_xkl_vapi_deps)
$(VAPIGEN_V)$(VAPIGEN) --vapidir=$(builddir) \ $(VAPIGEN_V)$(VAPIGEN) --vapidir=$(builddir) \
--library eek-xkl-$(EEK_API_VERSION) \ --library eek-xkl-$(EEK_API_VERSION) \
--pkg eek-$(EEK_API_VERSION) \ --pkg eek-$(EEK_API_VERSION) \
--pkg eek-xkb-$(EEK_API_VERSION) --pkg gio-2.0 \ --metadatadir=$(srcdir) \
eek-xkl-$(EEK_API_VERSION)/eek-xkl-$(EEK_API_VERSION).gi $(top_srcdir)/eek/EekXkl-$(EEK_API_VERSION).gir
eekboard-$(EEK_API_VERSION).vapi:
$(VAPIGEN_V)$(VAPIGEN) \
--library eekboard-$(EEK_API_VERSION) \
--pkg eek-$(EEK_API_VERSION) \
--pkg gio-2.0 \
eek-$(EEK_API_VERSION)/eek-$(EEK_API_VERSION).gi
# set up the verbosity rules to avoid some build noise # set up the verbosity rules to avoid some build noise
VAPIGEN_V = $(VAPIGEN_V_$(V)) VAPIGEN_V = $(VAPIGEN_V_$(V))
VAPIGEN_V_ = $(VAPIGEN_V_$(AM_DEFAULT_VERBOSITY)) VAPIGEN_V_ = $(VAPIGEN_V_$(AM_DEFAULT_VERBOSITY))
VAPIGEN_V_0 = @echo " VAPIG " $^; VAPIGEN_V_0 = @echo " VAPIG " $@;
endif

View File

@ -0,0 +1 @@
gio-2.0

View File

@ -1,16 +0,0 @@
include/eek-0.90/eek/eek-container.h
include/eek-0.90/eek/eek-element.h
include/eek-0.90/eek/eek-enumtypes.h
include/eek-0.90/eek/eek-keyboard.h
include/eek-0.90/eek/eek-key.h
include/eek-0.90/eek/eek-keysym.h
include/eek-0.90/eek/eek-layout.h
include/eek-0.90/eek/eek-section.h
include/eek-0.90/eek/eek-serializable.h
include/eek-0.90/eek/eek-symbol.h
include/eek-0.90/eek/eek-symbol-matrix.h
include/eek-0.90/eek/eek-theme.h
include/eek-0.90/eek/eek-types.h
include/eek-0.90/eek/eek-xml.h
include/eek-0.90/eek/eek-xml-layout.h
lib/libeek.so

File diff suppressed because it is too large Load Diff

View File

@ -1 +0,0 @@
Eek

View File

@ -1,2 +0,0 @@
include/eek-0.90/eek/eek-clutter-keyboard.h
lib/libeek-clutter.so

View File

@ -1,28 +0,0 @@
<?xml version="1.0"?>
<api version="1.0">
<namespace name="EekClutter">
<object name="EekClutterKeyboard" parent="ClutterGroup" type-name="EekClutterKeyboard" get-type="eek_clutter_keyboard_get_type">
<implements>
<interface name="ClutterScriptable"/>
<interface name="ClutterAnimatable"/>
<interface name="AtkImplementor"/>
<interface name="ClutterContainer"/>
</implements>
<constructor name="new" symbol="eek_clutter_keyboard_new">
<return-type type="ClutterActor*"/>
<parameters>
<parameter name="keyboard" type="EekKeyboard*"/>
</parameters>
</constructor>
<method name="set_theme" symbol="eek_clutter_keyboard_set_theme">
<return-type type="void"/>
<parameters>
<parameter name="keyboard" type="EekClutterKeyboard*"/>
<parameter name="theme" type="EekTheme*"/>
</parameters>
</method>
<property name="keyboard" type="EekKeyboard*" readable="0" writable="1" construct="0" construct-only="1"/>
</object>
<constant name="EEK_CLUTTER_KEYBOARD_H" type="int" value="1"/>
</namespace>
</api>

View File

@ -1 +0,0 @@
EekClutter cheader_filename="eek/eek-clutter.h"

View File

@ -1 +0,0 @@
EekClutter

View File

@ -0,0 +1 @@
eek-0.90

View File

@ -1,2 +0,0 @@
include/eek-0.90/eek/eek-gtk-keyboard.h
lib/libeek-gtk.so

View File

@ -1,26 +0,0 @@
<?xml version="1.0"?>
<api version="1.0">
<namespace name="EekGtk">
<object name="EekGtkKeyboard" parent="GtkDrawingArea" type-name="EekGtkKeyboard" get-type="eek_gtk_keyboard_get_type">
<implements>
<interface name="AtkImplementor"/>
<interface name="GtkBuildable"/>
</implements>
<constructor name="new" symbol="eek_gtk_keyboard_new">
<return-type type="GtkWidget*"/>
<parameters>
<parameter name="keyboard" type="EekKeyboard*"/>
</parameters>
</constructor>
<method name="set_theme" symbol="eek_gtk_keyboard_set_theme">
<return-type type="void"/>
<parameters>
<parameter name="keyboard" type="EekGtkKeyboard*"/>
<parameter name="theme" type="EekTheme*"/>
</parameters>
</method>
<property name="keyboard" type="EekKeyboard*" readable="0" writable="1" construct="0" construct-only="1"/>
</object>
<constant name="EEK_GTK_KEYBOARD_H" type="int" value="1"/>
</namespace>
</api>

View File

@ -1 +0,0 @@
EekGtk

View File

@ -1,2 +0,0 @@
include/eek-0.90/eek/eek-xkb-layout.h
lib/libeek-xkb.so

View File

@ -1,75 +0,0 @@
<?xml version="1.0"?>
<api version="1.0">
<namespace name="EekXkb">
<object name="EekXkbLayout" parent="EekLayout" type-name="EekXkbLayout" get-type="eek_xkb_layout_get_type">
<method name="get_geometry" symbol="eek_xkb_layout_get_geometry">
<return-type type="gchar*"/>
<parameters>
<parameter name="layout" type="EekXkbLayout*"/>
</parameters>
</method>
<method name="get_keycodes" symbol="eek_xkb_layout_get_keycodes">
<return-type type="gchar*"/>
<parameters>
<parameter name="layout" type="EekXkbLayout*"/>
</parameters>
</method>
<method name="get_symbols" symbol="eek_xkb_layout_get_symbols">
<return-type type="gchar*"/>
<parameters>
<parameter name="layout" type="EekXkbLayout*"/>
</parameters>
</method>
<constructor name="new" symbol="eek_xkb_layout_new">
<return-type type="EekLayout*"/>
</constructor>
<method name="set_geometry" symbol="eek_xkb_layout_set_geometry">
<return-type type="gboolean"/>
<parameters>
<parameter name="layout" type="EekXkbLayout*"/>
<parameter name="geometry" type="gchar*"/>
</parameters>
</method>
<method name="set_keycodes" symbol="eek_xkb_layout_set_keycodes">
<return-type type="gboolean"/>
<parameters>
<parameter name="layout" type="EekXkbLayout*"/>
<parameter name="keycodes" type="gchar*"/>
</parameters>
</method>
<!--
<method name="set_names" symbol="eek_xkb_layout_set_names">
<return-type type="gboolean"/>
<parameters>
<parameter name="layout" type="EekXkbLayout*"/>
<parameter name="names" type="XkbComponentNamesRec*"/>
</parameters>
</method>
-->
<method name="set_names_full" symbol="eek_xkb_layout_set_names_full">
<return-type type="gboolean"/>
<parameters>
<parameter name="layout" type="EekXkbLayout*"/>
</parameters>
</method>
<method name="set_names_full_valist" symbol="eek_xkb_layout_set_names_full_valist">
<return-type type="gboolean"/>
<parameters>
<parameter name="layout" type="EekXkbLayout*"/>
<parameter name="var_args" type="va_list"/>
</parameters>
</method>
<method name="set_symbols" symbol="eek_xkb_layout_set_symbols">
<return-type type="gboolean"/>
<parameters>
<parameter name="layout" type="EekXkbLayout*"/>
<parameter name="symbols" type="gchar*"/>
</parameters>
</method>
<property name="geometry" type="char*" readable="1" writable="1" construct="0" construct-only="0"/>
<property name="keycodes" type="char*" readable="1" writable="1" construct="0" construct-only="0"/>
<property name="symbols" type="char*" readable="1" writable="1" construct="0" construct-only="0"/>
</object>
<constant name="EEK_XKB_LAYOUT_H" type="int" value="1"/>
</namespace>
</api>

View File

@ -1 +0,0 @@
EekXkb cheader_filename="eek/eek-xkb.h"

View File

@ -1 +0,0 @@
EekXkb

View File

@ -0,0 +1 @@
eek-0.90

View File

@ -1,2 +0,0 @@
include/eek-0.90/eek/eek-xkl-layout.h
lib/libeek-xkl.so

View File

@ -1,107 +0,0 @@
<?xml version="1.0"?>
<api version="1.0">
<namespace name="EekXkl">
<object name="EekXklLayout" parent="EekXkbLayout" type-name="EekXklLayout" get-type="eek_xkl_layout_get_type">
<method name="disable_option" symbol="eek_xkl_layout_disable_option">
<return-type type="gboolean"/>
<parameters>
<parameter name="layout" type="EekXklLayout*"/>
<parameter name="option" type="gchar*"/>
</parameters>
</method>
<method name="enable_option" symbol="eek_xkl_layout_enable_option">
<return-type type="gboolean"/>
<parameters>
<parameter name="layout" type="EekXklLayout*"/>
<parameter name="option" type="gchar*"/>
</parameters>
</method>
<method name="get_layouts" symbol="eek_xkl_layout_get_layouts">
<return-type type="gchar**"/>
<parameters>
<parameter name="layout" type="EekXklLayout*"/>
</parameters>
</method>
<method name="get_model" symbol="eek_xkl_layout_get_model">
<return-type type="gchar*"/>
<parameters>
<parameter name="layout" type="EekXklLayout*"/>
</parameters>
</method>
<method name="get_option" symbol="eek_xkl_layout_get_option">
<return-type type="gboolean"/>
<parameters>
<parameter name="layout" type="EekXklLayout*"/>
<parameter name="option" type="gchar*"/>
</parameters>
</method>
<method name="get_options" symbol="eek_xkl_layout_get_options">
<return-type type="gchar**"/>
<parameters>
<parameter name="layout" type="EekXklLayout*"/>
</parameters>
</method>
<method name="get_variants" symbol="eek_xkl_layout_get_variants">
<return-type type="gchar**"/>
<parameters>
<parameter name="layout" type="EekXklLayout*"/>
</parameters>
</method>
<constructor name="new" symbol="eek_xkl_layout_new">
<return-type type="EekLayout*"/>
</constructor>
<!--
<method name="set_config" symbol="eek_xkl_layout_set_config">
<return-type type="gboolean"/>
<parameters>
<parameter name="layout" type="EekXklLayout*"/>
<parameter name="config" type="XklConfigRec*"/>
</parameters>
</method>
-->
<method name="set_config_full" symbol="eek_xkl_layout_set_config_full">
<return-type type="gboolean"/>
<parameters>
<parameter name="layout" type="EekXklLayout*"/>
<parameter name="model" type="gchar*"/>
<parameter name="layouts" type="gchar**"/>
<parameter name="variants" type="gchar**"/>
<parameter name="options" type="gchar**"/>
</parameters>
</method>
<method name="set_layouts" symbol="eek_xkl_layout_set_layouts">
<return-type type="gboolean"/>
<parameters>
<parameter name="layout" type="EekXklLayout*"/>
<parameter name="layouts" type="gchar**"/>
</parameters>
</method>
<method name="set_model" symbol="eek_xkl_layout_set_model">
<return-type type="gboolean"/>
<parameters>
<parameter name="layout" type="EekXklLayout*"/>
<parameter name="model" type="gchar*"/>
</parameters>
</method>
<method name="set_options" symbol="eek_xkl_layout_set_options">
<return-type type="gboolean"/>
<parameters>
<parameter name="layout" type="EekXklLayout*"/>
<parameter name="options" type="gchar**"/>
</parameters>
</method>
<method name="set_variants" symbol="eek_xkl_layout_set_variants">
<return-type type="gboolean"/>
<parameters>
<parameter name="layout" type="EekXklLayout*"/>
<parameter name="variants" type="gchar**"/>
</parameters>
</method>
<property name="layouts" type="GStrv*" readable="1" writable="1" construct="0" construct-only="0"/>
<property name="model" type="char*" readable="1" writable="1" construct="0" construct-only="0"/>
<property name="options" type="GStrv*" readable="1" writable="1" construct="0" construct-only="0"/>
<property name="variants" type="GStrv*" readable="1" writable="1" construct="0" construct-only="0"/>
</object>
<constant name="EEK_XKL_LAYOUT_H" type="int" value="1"/>
</namespace>
</api>

View File

@ -1 +0,0 @@
EekXkl

View File

@ -1,2 +0,0 @@
include/eekboard-0.90/eekboard
lib/libeekboard.so

View File

@ -1,194 +0,0 @@
<?xml version="1.0"?>
<api version="1.0">
<namespace name="Eekboard">
<object name="EekboardContext" parent="GDBusProxy" type-name="EekboardContext" get-type="eekboard_context_get_type">
<implements>
<interface name="GInitable"/>
<interface name="GAsyncInitable"/>
</implements>
<method name="add_keyboard" symbol="eekboard_context_add_keyboard">
<return-type type="guint"/>
<parameters>
<parameter name="context" type="EekboardContext*"/>
<parameter name="keyboard" type="EekKeyboard*"/>
<parameter name="cancellable" type="GCancellable*"/>
</parameters>
</method>
<method name="hide_keyboard" symbol="eekboard_context_hide_keyboard">
<return-type type="void"/>
<parameters>
<parameter name="context" type="EekboardContext*"/>
<parameter name="cancellable" type="GCancellable*"/>
</parameters>
</method>
<method name="is_enabled" symbol="eekboard_context_is_enabled">
<return-type type="gboolean"/>
<parameters>
<parameter name="context" type="EekboardContext*"/>
</parameters>
</method>
<method name="is_keyboard_visible" symbol="eekboard_context_is_keyboard_visible">
<return-type type="gboolean"/>
<parameters>
<parameter name="context" type="EekboardContext*"/>
</parameters>
</method>
<constructor name="new" symbol="eekboard_context_new">
<return-type type="EekboardContext*"/>
<parameters>
<parameter name="connection" type="GDBusConnection*"/>
<parameter name="object_path" type="gchar*"/>
<parameter name="cancellable" type="GCancellable*"/>
</parameters>
</constructor>
<method name="press_key" symbol="eekboard_context_press_key">
<return-type type="void"/>
<parameters>
<parameter name="context" type="EekboardContext*"/>
<parameter name="keycode" type="guint"/>
<parameter name="cancellable" type="GCancellable*"/>
</parameters>
</method>
<method name="release_key" symbol="eekboard_context_release_key">
<return-type type="void"/>
<parameters>
<parameter name="context" type="EekboardContext*"/>
<parameter name="keycode" type="guint"/>
<parameter name="cancellable" type="GCancellable*"/>
</parameters>
</method>
<method name="remove_keyboard" symbol="eekboard_context_remove_keyboard">
<return-type type="void"/>
<parameters>
<parameter name="context" type="EekboardContext*"/>
<parameter name="keyboard_id" type="guint"/>
<parameter name="cancellable" type="GCancellable*"/>
</parameters>
</method>
<method name="set_enabled" symbol="eekboard_context_set_enabled">
<return-type type="void"/>
<parameters>
<parameter name="context" type="EekboardContext*"/>
<parameter name="enabled" type="gboolean"/>
</parameters>
</method>
<method name="set_fullscreen" symbol="eekboard_context_set_fullscreen">
<return-type type="void"/>
<parameters>
<parameter name="context" type="EekboardContext*"/>
<parameter name="fullscreen" type="gboolean"/>
<parameter name="cancellable" type="GCancellable*"/>
</parameters>
</method>
<method name="set_group" symbol="eekboard_context_set_group">
<return-type type="void"/>
<parameters>
<parameter name="context" type="EekboardContext*"/>
<parameter name="group" type="gint"/>
<parameter name="cancellable" type="GCancellable*"/>
</parameters>
</method>
<method name="set_keyboard" symbol="eekboard_context_set_keyboard">
<return-type type="void"/>
<parameters>
<parameter name="context" type="EekboardContext*"/>
<parameter name="keyboard_id" type="guint"/>
<parameter name="cancellable" type="GCancellable*"/>
</parameters>
</method>
<method name="show_keyboard" symbol="eekboard_context_show_keyboard">
<return-type type="void"/>
<parameters>
<parameter name="context" type="EekboardContext*"/>
<parameter name="cancellable" type="GCancellable*"/>
</parameters>
</method>
<property name="keyboard-visible" type="gboolean" readable="1" writable="0" construct="0" construct-only="0"/>
<signal name="destroyed" when="LAST">
<return-type type="void"/>
<parameters>
<parameter name="self" type="EekboardContext*"/>
</parameters>
</signal>
<signal name="disabled" when="LAST">
<return-type type="void"/>
<parameters>
<parameter name="self" type="EekboardContext*"/>
</parameters>
</signal>
<signal name="enabled" when="LAST">
<return-type type="void"/>
<parameters>
<parameter name="self" type="EekboardContext*"/>
</parameters>
</signal>
<signal name="key-pressed" when="LAST">
<return-type type="void"/>
<parameters>
<parameter name="self" type="EekboardContext*"/>
<parameter name="keycode" type="guint"/>
</parameters>
</signal>
<signal name="key-released" when="LAST">
<return-type type="void"/>
<parameters>
<parameter name="self" type="EekboardContext*"/>
<parameter name="keycode" type="guint"/>
</parameters>
</signal>
</object>
<object name="EekboardEekboard" parent="GDBusProxy" type-name="EekboardEekboard" get-type="eekboard_eekboard_get_type">
<implements>
<interface name="GInitable"/>
<interface name="GAsyncInitable"/>
</implements>
<method name="create_context" symbol="eekboard_eekboard_create_context">
<return-type type="EekboardContext*"/>
<parameters>
<parameter name="eekboard" type="EekboardEekboard*"/>
<parameter name="client_name" type="gchar*"/>
<parameter name="cancellable" type="GCancellable*"/>
</parameters>
</method>
<method name="destroy_context" symbol="eekboard_eekboard_destroy_context">
<return-type type="void"/>
<parameters>
<parameter name="eekboard" type="EekboardEekboard*"/>
<parameter name="context" type="EekboardContext*"/>
<parameter name="cancellable" type="GCancellable*"/>
</parameters>
</method>
<constructor name="new" symbol="eekboard_eekboard_new">
<return-type type="EekboardEekboard*"/>
<parameters>
<parameter name="connection" type="GDBusConnection*"/>
<parameter name="cancellable" type="GCancellable*"/>
</parameters>
</constructor>
<method name="pop_context" symbol="eekboard_eekboard_pop_context">
<return-type type="void"/>
<parameters>
<parameter name="eekboard" type="EekboardEekboard*"/>
<parameter name="cancellable" type="GCancellable*"/>
</parameters>
</method>
<method name="push_context" symbol="eekboard_eekboard_push_context">
<return-type type="void"/>
<parameters>
<parameter name="eekboard" type="EekboardEekboard*"/>
<parameter name="context" type="EekboardContext*"/>
<parameter name="cancellable" type="GCancellable*"/>
</parameters>
</method>
<signal name="destroyed" when="LAST">
<return-type type="void"/>
<parameters>
<parameter name="self" type="EekboardEekboard*"/>
</parameters>
</signal>
</object>
<constant name="EEKBOARD_CONTEXT_H" type="int" value="1"/>
<constant name="EEKBOARD_EEKBOARD_H" type="int" value="1"/>
<constant name="EEKBOARD_H" type="int" value="1"/>
</namespace>
</api>

View File

@ -1 +0,0 @@
Eekboard cheader_filename="eekboard/eekboard.h"

View File

@ -1 +0,0 @@
Eekboard

View File

@ -20,7 +20,7 @@ AC_PREREQ(2.63)
dnl AC_CONFIG_SRCDIR([configure.ac]) dnl AC_CONFIG_SRCDIR([configure.ac])
AC_CONFIG_MACRO_DIR([m4]) AC_CONFIG_MACRO_DIR([m4])
AC_INIT([eekboard], [1.0.1], [ueno@unixuser.org]) AC_INIT([eekboard], [1.0.6], [ueno@unixuser.org])
dnl Init automake dnl Init automake
AM_INIT_AUTOMAKE AM_INIT_AUTOMAKE
@ -44,34 +44,13 @@ AC_HEADER_STDC
LT_INIT LT_INIT
IT_PROG_INTLTOOL([0.35.0]) IT_PROG_INTLTOOL([0.35.0])
AC_MSG_CHECKING([which gtk+ version to compile against]) GTK_API_VERSION=3.0
AC_ARG_WITH([gtk],
[AS_HELP_STRING([--with-gtk=2.0|3.0],[which gtk+ version to compile against (default: 2.0)])],
[case "$with_gtk" in
2.0|3.0) ;;
*) AC_MSG_ERROR([invalid gtk version specified]) ;;
esac],
[with_gtk=2.0])
AC_MSG_RESULT([$with_gtk])
case "$with_gtk" in
2.0) GTK_API_VERSION=2.0
GTK_REQUIRED=2.14.0
EEK_API_VERSION=0.90
EEK_API_MAJOR_VERSION=0
EEK_API_MINOR_VERSION=90
EEK_API_PC_VERSION=0.90
EEK_LIBRARY_SUFFIX="-$EEK_API_VERSION"
;;
3.0) GTK_API_VERSION=3.0
GTK_REQUIRED=2.91.0 GTK_REQUIRED=2.91.0
EEK_API_VERSION=0.90 EEK_API_VERSION=0.90
EEK_API_MAJOR_VERSION=0 EEK_API_MAJOR_VERSION=0
EEK_API_MINOR_VERSION=90 EEK_API_MINOR_VERSION=90
EEK_API_PC_VERSION=0.90 EEK_API_PC_VERSION=0.90
EEK_LIBRARY_SUFFIX="-$EEK_API_VERSION" EEK_LIBRARY_SUFFIX="-$EEK_API_VERSION"
;;
esac
AC_SUBST([GTK_API_VERSION]) AC_SUBST([GTK_API_VERSION])
AC_SUBST([EEK_API_VERSION]) AC_SUBST([EEK_API_VERSION])
@ -81,9 +60,6 @@ AC_SUBST([EEK_API_PC_VERSION])
AC_SUBST([EEK_LIBRARY_SUFFIX]) AC_SUBST([EEK_LIBRARY_SUFFIX])
AC_SUBST([EEK_LIBRARY_SUFFIX_U],[AS_TR_SH([$EEK_LIBRARY_SUFFIX])]) AC_SUBST([EEK_LIBRARY_SUFFIX_U],[AS_TR_SH([$EEK_LIBRARY_SUFFIX])])
AM_CONDITIONAL([HAVE_GTK_2],[test "$with_gtk" = "2.0"])
AM_CONDITIONAL([HAVE_GTK_3],[test "$with_gtk" = "3.0"])
AM_PATH_GLIB_2_0 AM_PATH_GLIB_2_0
PKG_CHECK_MODULES([GLIB2], [glib-2.0 >= 2.26.0], , PKG_CHECK_MODULES([GLIB2], [glib-2.0 >= 2.26.0], ,
[AC_MSG_ERROR([GLib2 not found])]) [AC_MSG_ERROR([GLib2 not found])])
@ -97,8 +73,6 @@ PKG_CHECK_MODULES([GTK], [
gtk+-$GTK_API_VERSION >= $GTK_REQUIRED gtk+-$GTK_API_VERSION >= $GTK_REQUIRED
gdk-$GTK_API_VERSION >= $GTK_REQUIRED], , gdk-$GTK_API_VERSION >= $GTK_REQUIRED], ,
[AC_MSG_ERROR([GTK not found])]) [AC_MSG_ERROR([GTK not found])])
PKG_CHECK_MODULES([XKB], [x11], ,
[AC_MSG_ERROR([XKB support not found])])
PKG_CHECK_MODULES([LIBXKLAVIER], [libxklavier x11], , PKG_CHECK_MODULES([LIBXKLAVIER], [libxklavier x11], ,
[AC_MSG_ERROR([Libxklavier not found])]) [AC_MSG_ERROR([Libxklavier not found])])
PKG_CHECK_MODULES([LIBCROCO], [libcroco-0.6], , PKG_CHECK_MODULES([LIBCROCO], [libcroco-0.6], ,
@ -130,7 +104,7 @@ AC_ARG_ENABLE(x-dock,
enable_x_dock=yes) enable_x_dock=yes)
if test x$enable_x_dock = xyes; then if test x$enable_x_dock = xyes; then
PKG_CHECK_MODULES([XDOCK], [x], , enable_x_dock=no) PKG_CHECK_MODULES([XDOCK], [x11], , enable_x_dock=no)
if test x$enable_x_dock = xyes; then if test x$enable_x_dock = xyes; then
AC_DEFINE([HAVE_XDOCK], [1], [Define if X dock is found]) AC_DEFINE([HAVE_XDOCK], [1], [Define if X dock is found])
fi fi
@ -138,10 +112,7 @@ fi
AM_CONDITIONAL(ENABLE_XDOCK, [test x$enable_x_dock = xyes]) AM_CONDITIONAL(ENABLE_XDOCK, [test x$enable_x_dock = xyes])
AC_MSG_RESULT($enable_x_dock) AC_MSG_RESULT($enable_x_dock)
focus_listeners="" focus_listeners="ibus"
keystroke_listeners=""
focus_listeners=""
keystroke_listeners="" keystroke_listeners=""
dnl use AT-SPI 2 to capture focus/keystroke events dnl use AT-SPI 2 to capture focus/keystroke events
@ -163,60 +134,10 @@ fi
AC_MSG_RESULT($enable_atspi) AC_MSG_RESULT($enable_atspi)
AM_CONDITIONAL(ENABLE_ATSPI, [test x$enable_atspi = xyes]) AM_CONDITIONAL(ENABLE_ATSPI, [test x$enable_atspi = xyes])
dnl use IBus to capture focus events
AC_MSG_CHECKING([whether you enable IBus focus tracking])
AC_ARG_ENABLE(ibus,
AS_HELP_STRING([--enable-ibus=no/yes],
[Enable IBus focus tracking default=yes]),
enable_ibus=$enableval,
enable_ibus=yes)
if test x$enable_ibus = xyes; then
PKG_CHECK_MODULES([IBUS], [ibus-1.0 >= 1.3.99], , enable_ibus=no)
if test x$enable_ibus = xyes; then
AC_DEFINE([HAVE_IBUS], [1], [Define if IBus is found])
focus_listeners="ibus $focus_listeners"
fi
fi
AC_MSG_RESULT($enable_ibus)
AM_CONDITIONAL(ENABLE_IBUS, [test x$enable_ibus = xyes])
if test -n "$focus_listeners"; then if test -n "$focus_listeners"; then
AC_DEFINE(ENABLE_FOCUS_LISTENER, [1], [Define if eekboard can follow focus changes]) AC_DEFINE(ENABLE_FOCUS_LISTENER, [1], [Define if eekboard can follow focus changes])
fi fi
dnl Python language binding
AC_MSG_CHECKING([whether you enable Python language support])
AC_ARG_ENABLE(python,
AS_HELP_STRING([--enable-python=no/yes],
[Enable Python language binding default=yes]),
enable_python=$enableval,
enable_python=yes)
dnl check python unconditionally to re-generate
dnl eek/*-keysym-labels.txt when maintainer-mode enabled
AM_PATH_PYTHON([2.5], , enable_python=no)
if test x"$enable_python" = x"yes"; then
if test x$enable_python = xyes; then
AC_PATH_PROGS(PYTHON_CONFIG, [python$PYTHON_VERSION-config python-config])
if test x"$PYTHON_CONFIG" != x""; then
PYTHON_CFLAGS=`$PYTHON_CONFIG --includes`
PYTHON_LIBS=`$PYTHON_CONFIG --libs`
else
PYTHON_CFLAGS=`$PYTHON $srcdir/python-config.py --includes`
PYTHON_LIBS=`$PYTHON $srcdir/python-config.py --libs`
fi
PYTHON_INCLUDES="$PYTHON_CFLAGS"
AC_SUBST(PYTHON_CFLAGS)
AC_SUBST(PYTHON_INCLUDES)
AC_SUBST(PYTHON_LIBS)
fi
fi
AC_MSG_RESULT($enable_python)
AM_CONDITIONAL(ENABLE_PYTHON, [test x$enable_python = xyes])
GOBJECT_INTROSPECTION_CHECK([0.9.0]) GOBJECT_INTROSPECTION_CHECK([0.9.0])
dnl Vala langauge binding dnl Vala langauge binding
@ -251,42 +172,22 @@ fi
AC_MSG_RESULT($enable_vala) AC_MSG_RESULT($enable_vala)
AM_CONDITIONAL(ENABLE_VALA, [test x$enable_vala = xyes]) AM_CONDITIONAL(ENABLE_VALA, [test x$enable_vala = xyes])
dnl clutter dnl libcanberra
AC_MSG_CHECKING([whether you enable clutter]) AC_MSG_CHECKING([whether you enable libcanberra])
AC_ARG_ENABLE(clutter, AC_ARG_ENABLE(libcanberra,
AS_HELP_STRING([--enable-clutter=no/yes], AS_HELP_STRING([--enable-libcanberra=no/yes],
[Enable clutter user interface default=no]), [Enable libcanberra user interface default=no]),
enable_clutter=$enableval, enable_libcanberra=$enableval,
enable_clutter=no) enable_libcanberra=yes)
if test x$enable_clutter = xyes; then if test x$enable_libcanberra = xyes; then
PKG_CHECK_MODULES([CLUTTER], [clutter-1.0], , enable_clutter=no) PKG_CHECK_MODULES([LIBCANBERRA], [libcanberra-gtk3], , enable_libcanberra=no)
if test x$enable_clutter = xyes; then if test x$enable_libcanberra = xyes; then
AC_DEFINE([HAVE_CLUTTER], [1], [Define if clutter is found]) AC_DEFINE([HAVE_LIBCANBERRA], [1], [Define if libcanberra is found])
fi fi
fi fi
AM_CONDITIONAL(ENABLE_CLUTTER, [test x$enable_clutter = xyes]) AM_CONDITIONAL(ENABLE_LIBCANBERRA, [test x$enable_libcanberra = xyes])
AC_MSG_RESULT($enable_clutter) AC_MSG_RESULT($enable_libcanberra)
dnl clutter-gtk
if test x$enable_clutter = xyes; then
AC_MSG_CHECKING([whether you enable clutter-gtk])
AC_ARG_ENABLE(clutter-gtk,
AS_HELP_STRING([--enable-clutter-gtk=no/yes],
[Enable clutter user interface default=yes]),
enable_clutter_gtk=$enableval,
enable_clutter_gtk=yes)
if test x$enable_clutter_gtk = xyes; then
PKG_CHECK_MODULES([CLUTTER_GTK], [clutter-gtk-1.0], ,
enable_clutter_gtk=no)
if test x$enable_clutter_gtk = xyes; then
AC_DEFINE([HAVE_CLUTTER_GTK], [1], [Define if Clutter-Gtk is found])
fi
fi
AC_MSG_RESULT($enable_clutter_gtk)
fi
AM_CONDITIONAL(ENABLE_CLUTTER_GTK, [test x$enable_clutter_gtk = xyes])
GTK_DOC_CHECK([1.14],[--flavour no-tmpl]) GTK_DOC_CHECK([1.14],[--flavour no-tmpl])
@ -304,8 +205,6 @@ eekboard/Makefile
src/Makefile src/Makefile
tests/Makefile tests/Makefile
bindings/Makefile bindings/Makefile
bindings/python/Makefile
bindings/python/eekboard/Makefile
bindings/vala/Makefile bindings/vala/Makefile
docs/Makefile docs/Makefile
docs/reference/Makefile docs/reference/Makefile
@ -323,12 +222,9 @@ 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/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-gtk-${EEK_API_VERSION}.pc eek/eek-gtk-${EEK_API_VERSION}.pc
eek/eek-xkb-${EEK_API_VERSION}.pc
eek/eek-xkl-${EEK_API_VERSION}.pc eek/eek-xkl-${EEK_API_VERSION}.pc
eekboard/eekboard-${EEK_API_VERSION}.pc]) eekboard/eekboard-${EEK_API_VERSION}.pc])
AC_OUTPUT AC_OUTPUT
@ -339,11 +235,11 @@ Build options:
Build shared libs $enable_shared Build shared libs $enable_shared
Build static libs $enable_static Build static libs $enable_static
CFLAGS $CFLAGS CFLAGS $CFLAGS
GTK version $with_gtk
Build Clutter UI $enable_clutter
Build Vala binding $enable_vala Build Vala binding $enable_vala
Build Python binding $enable_python Sound support $enable_libcanberra
Build document $enable_gtk_doc Build document $enable_gtk_doc
Focus listeners $focus_listeners Focus listeners $focus_listeners
Keystroke listeners $keystroke_listeners Keystroke listeners $keystroke_listeners
]) ])

View File

@ -2,5 +2,5 @@
Name=Eekboard Name=Eekboard
Exec=eekboard -f Exec=eekboard -f
Type=Application Type=Application
AutostartCondition=GSettings org.gnome.desktop.a11y.applications screen-keyboard-enabled #AutostartCondition=GSettings org.gnome.desktop.a11y.applications screen-keyboard-enabled
X-GNOME-AutoRestart=true X-GNOME-AutoRestart=true

View File

@ -1,3 +1,3 @@
[D-BUS Service] [D-BUS Service]
Name=org.fedorahosted.Eekboard.Server Name=org.fedorahosted.Eekboard
Exec=@bindir@/eekboard-server Exec=@bindir@/eekboard-server

View File

@ -1,2 +1,38 @@
keyboarddir = $(pkgdatadir)/keyboards keyboardsdir = $(pkgdatadir)/keyboards
dist_keyboard_DATA = us-qwerty.xml
nobase_dist_keyboards_DATA = \
keyboards.xml \
geometry/compact.xml \
symbols/ar.xml \
symbols/be.xml \
symbols/fa.xml \
symbols/he.xml \
symbols/ja-kana.xml \
symbols/kk.xml \
symbols/ks.xml \
symbols/my.xml \
symbols/ru.xml \
symbols/th.xml \
symbols/ua.xml \
symbols/ug.xml \
symbols/us.xml \
symbols/zh-bopomofo.xml \
$(inscript_symbols) \
$(NULL)
inscript_symbols = \
symbols/as-inscript.xml \
symbols/bn-inscript.xml \
symbols/gu-inscript.xml \
symbols/hi-inscript.xml \
symbols/kn-inscript.xml \
symbols/ks-inscript.xml \
symbols/mai-inscript.xml \
symbols/ml-inscript.xml \
symbols/mr-inscript.xml \
symbols/or-inscript.xml \
symbols/pa-inscript.xml \
symbols/sd-inscript.xml \
symbols/ta-inscript.xml \
symbols/te-inscript.xml \
$(NULL)

View File

@ -0,0 +1,307 @@
<?xml version="1.0"?>
<geometry version="0.90">
<bounds x="0.000000" y="0.000000" width="640.0000" height="296.5853"/>
<section angle="0">
<bounds x="15.60975" y="15.60975" width="640.0000" height="39.02439"/>
<row columns="16" orientation="1"/>
<key keycode="9" name="ESC" column="0" row="0" oref="outline2">
<bounds x="3.121951" y="1.560976" width="37.46341" height="37.46341"/>
</key>
<key keycode="67" name="FK01" column="1" row="0" oref="outline2">
<bounds x="84.29268" y="1.560976" width="37.46341" height="37.46341"/>
</key>
<key keycode="68" name="FK02" column="2" row="0" oref="outline2">
<bounds x="124.8780" y="1.560976" width="37.46341" height="37.46341"/>
</key>
<key keycode="69" name="FK03" column="3" row="0" oref="outline2">
<bounds x="165.4634" y="1.560976" width="37.46341" height="37.46341"/>
</key>
<key keycode="70" name="FK04" column="4" row="0" oref="outline2">
<bounds x="206.0487" y="1.560976" width="37.46341" height="37.46341"/>
</key>
<key keycode="71" name="FK05" column="5" row="0" oref="outline2">
<bounds x="266.9268" y="1.560976" width="37.46341" height="37.46341"/>
</key>
<key keycode="72" name="FK06" column="6" row="0" oref="outline2">
<bounds x="307.5121" y="1.560976" width="37.46341" height="37.46341"/>
</key>
<key keycode="73" name="FK07" column="7" row="0" oref="outline2">
<bounds x="348.0975" y="1.560976" width="37.46341" height="37.46341"/>
</key>
<key keycode="74" name="FK08" column="8" row="0" oref="outline2">
<bounds x="388.6829" y="1.560976" width="37.46341" height="37.46341"/>
</key>
<key keycode="75" name="FK09" column="9" row="0" oref="outline2">
<bounds x="449.5609" y="1.560976" width="37.46341" height="37.46341"/>
</key>
<key keycode="76" name="FK10" column="10" row="0" oref="outline2">
<bounds x="490.1463" y="1.560976" width="37.46341" height="37.46341"/>
</key>
<key keycode="95" name="FK11" column="11" row="0" oref="outline2">
<bounds x="530.7317" y="1.560976" width="37.46341" height="37.46341"/>
</key>
<key keycode="96" name="FK12" column="12" row="0" oref="outline2">
<bounds x="571.3170" y="1.560976" width="37.46341" height="37.46341"/>
</key>
</section>
<section angle="0">
<bounds x="15.60975" y="78.04878" width="608.7804" height="201.3658"/>
<row columns="14" orientation="1"/>
<row columns="14" orientation="1"/>
<row columns="13" orientation="1"/>
<row columns="12" orientation="1"/>
<row columns="9" orientation="1"/>
<key keycode="49" name="TLDE" column="0" row="0" oref="outline2">
<bounds x="3.121951" y="1.560976" width="37.46341" height="37.46341"/>
</key>
<key keycode="10" name="AE01" column="1" row="0" oref="outline2">
<bounds x="43.70731" y="1.560976" width="37.46341" height="37.46341"/>
</key>
<key keycode="11" name="AE02" column="2" row="0" oref="outline2">
<bounds x="84.29268" y="1.560976" width="37.46341" height="37.46341"/>
</key>
<key keycode="12" name="AE03" column="3" row="0" oref="outline2">
<bounds x="124.8780" y="1.560976" width="37.46341" height="37.46341"/>
</key>
<key keycode="13" name="AE04" column="4" row="0" oref="outline2">
<bounds x="165.4634" y="1.560976" width="37.46341" height="37.46341"/>
</key>
<key keycode="14" name="AE05" column="5" row="0" oref="outline2">
<bounds x="206.0487" y="1.560976" width="37.46341" height="37.46341"/>
</key>
<key keycode="15" name="AE06" column="6" row="0" oref="outline2">
<bounds x="245.0731" y="1.560976" width="37.46341" height="37.46341"/>
</key>
<key keycode="16" name="AE07" column="7" row="0" oref="outline2">
<bounds x="285.6585" y="1.560976" width="37.46341" height="37.46341"/>
</key>
<key keycode="17" name="AE08" column="8" row="0" oref="outline2">
<bounds x="326.2439" y="1.560976" width="37.46341" height="37.46341"/>
</key>
<key keycode="18" name="AE09" column="9" row="0" oref="outline2">
<bounds x="366.8292" y="1.560976" width="37.46341" height="37.46341"/>
</key>
<key keycode="19" name="AE10" column="10" row="0" oref="outline2">
<bounds x="407.4146" y="1.560976" width="37.46341" height="37.46341"/>
</key>
<key keycode="20" name="AE11" column="11" row="0" oref="outline2">
<bounds x="448.0000" y="1.560976" width="37.46341" height="37.46341"/>
</key>
<key keycode="21" name="AE12" column="12" row="0" oref="outline2">
<bounds x="488.5853" y="1.560976" width="37.46341" height="37.46341"/>
</key>
<key keycode="22" name="BKSP" column="13" row="0" oref="outline13">
<bounds x="529.1707" y="1.560976" width="79.60975" height="37.46341"/>
</key>
<key keycode="23" name="TAB" column="0" row="1" oref="outline4">
<bounds x="3.121951" y="42.14634" width="59.31707" height="37.46341"/>
</key>
<key keycode="24" name="AD01" column="1" row="1" oref="outline2">
<bounds x="65.56097" y="42.14634" width="37.46341" height="37.46341"/>
</key>
<key keycode="25" name="AD02" column="2" row="1" oref="outline2">
<bounds x="106.1463" y="42.14634" width="37.46341" height="37.46341"/>
</key>
<key keycode="26" name="AD03" column="3" row="1" oref="outline2">
<bounds x="145.1707" y="42.14634" width="37.46341" height="37.46341"/>
</key>
<key keycode="27" name="AD04" column="4" row="1" oref="outline2">
<bounds x="185.7560" y="42.14634" width="37.46341" height="37.46341"/>
</key>
<key keycode="28" name="AD05" column="5" row="1" oref="outline2">
<bounds x="226.3414" y="42.14634" width="37.46341" height="37.46341"/>
</key>
<key keycode="29" name="AD06" column="6" row="1" oref="outline2">
<bounds x="266.9268" y="42.14634" width="37.46341" height="37.46341"/>
</key>
<key keycode="30" name="AD07" column="7" row="1" oref="outline2">
<bounds x="307.5121" y="42.14634" width="37.46341" height="37.46341"/>
</key>
<key keycode="31" name="AD08" column="8" row="1" oref="outline2">
<bounds x="348.0975" y="42.14634" width="37.46341" height="37.46341"/>
</key>
<key keycode="32" name="AD09" column="9" row="1" oref="outline2">
<bounds x="388.6829" y="42.14634" width="37.46341" height="37.46341"/>
</key>
<key keycode="33" name="AD10" column="10" row="1" oref="outline2">
<bounds x="429.2682" y="42.14634" width="37.46341" height="37.46341"/>
</key>
<key keycode="34" name="AD11" column="11" row="1" oref="outline2">
<bounds x="468.2926" y="42.14634" width="37.46341" height="37.46341"/>
</key>
<key keycode="35" name="AD12" column="12" row="1" oref="outline2">
<bounds x="508.8780" y="42.14634" width="37.46341" height="37.46341"/>
</key>
<key keycode="51" name="BKSL" column="13" row="1" oref="outline5">
<bounds x="549.4634" y="42.14634" width="59.31707" height="37.46341"/>
</key>
<key keycode="66" name="CAPS" column="0" row="2" oref="outline6">
<bounds x="3.121951" y="82.73170" width="68.68292" height="37.46341"/>
</key>
<key keycode="38" name="AC01" column="1" row="2" oref="outline2">
<bounds x="76.48780" y="82.73170" width="37.46341" height="37.46341"/>
</key>
<key keycode="39" name="AC02" column="2" row="2" oref="outline2">
<bounds x="115.5121" y="82.73170" width="37.46341" height="37.46341"/>
</key>
<key keycode="40" name="AC03" column="3" row="2" oref="outline2">
<bounds x="156.0975" y="82.73170" width="37.46341" height="37.46341"/>
</key>
<key keycode="41" name="AC04" column="4" row="2" oref="outline2">
<bounds x="196.6829" y="82.73170" width="37.46341" height="37.46341"/>
</key>
<key keycode="42" name="AC05" column="5" row="2" oref="outline2">
<bounds x="237.2682" y="82.73170" width="37.46341" height="37.46341"/>
</key>
<key keycode="43" name="AC06" column="6" row="2" oref="outline2">
<bounds x="277.8536" y="82.73170" width="37.46341" height="37.46341"/>
</key>
<key keycode="44" name="AC07" column="7" row="2" oref="outline2">
<bounds x="318.4390" y="82.73170" width="37.46341" height="37.46341"/>
</key>
<key keycode="45" name="AC08" column="8" row="2" oref="outline2">
<bounds x="359.0243" y="82.73170" width="37.46341" height="37.46341"/>
</key>
<key keycode="46" name="AC09" column="9" row="2" oref="outline2">
<bounds x="399.6097" y="82.73170" width="37.46341" height="37.46341"/>
</key>
<key keycode="47" name="AC10" column="10" row="2" oref="outline2">
<bounds x="438.6341" y="82.73170" width="37.46341" height="37.46341"/>
</key>
<key keycode="48" name="AC11" column="11" row="2" oref="outline2">
<bounds x="479.2195" y="82.73170" width="37.46341" height="37.46341"/>
</key>
<key keycode="36" name="RTRN" column="12" row="2" oref="outline7">
<bounds x="519.8048" y="82.73170" width="88.97561" height="37.46341"/>
</key>
<key keycode="50" name="LFSH" column="0" row="3" oref="outline8">
<bounds x="3.121951" y="121.7560" width="88.97561" height="37.46341"/>
</key>
<key keycode="52" name="AB01" column="1" row="3" oref="outline2">
<bounds x="95.21951" y="121.7560" width="37.46341" height="37.46341"/>
</key>
<key keycode="53" name="AB02" column="2" row="3" oref="outline2">
<bounds x="135.8048" y="121.7560" width="37.46341" height="37.46341"/>
</key>
<key keycode="54" name="AB03" column="3" row="3" oref="outline2">
<bounds x="176.3902" y="121.7560" width="37.46341" height="37.46341"/>
</key>
<key keycode="55" name="AB04" column="4" row="3" oref="outline2">
<bounds x="215.4146" y="121.7560" width="37.46341" height="37.46341"/>
</key>
<key keycode="56" name="AB05" column="5" row="3" oref="outline2">
<bounds x="256.0000" y="121.7560" width="37.46341" height="37.46341"/>
</key>
<key keycode="57" name="AB06" column="6" row="3" oref="outline2">
<bounds x="296.5853" y="121.7560" width="37.46341" height="37.46341"/>
</key>
<key keycode="58" name="AB07" column="7" row="3" oref="outline2">
<bounds x="337.1707" y="121.7560" width="37.46341" height="37.46341"/>
</key>
<key keycode="59" name="AB08" column="8" row="3" oref="outline2">
<bounds x="377.7560" y="121.7560" width="37.46341" height="37.46341"/>
</key>
<key keycode="60" name="AB09" column="9" row="3" oref="outline2">
<bounds x="418.3414" y="121.7560" width="37.46341" height="37.46341"/>
</key>
<key keycode="61" name="AB10" column="10" row="3" oref="outline2">
<bounds x="458.9268" y="121.7560" width="37.46341" height="37.46341"/>
</key>
<key keycode="62" name="RTSH" column="11" row="3" oref="outline9">
<bounds x="499.5121" y="121.7560" width="109.2682" height="37.46341"/>
</key>
<key keycode="149" name="I149" column="0" row="4" oref="outline10">
<bounds x="3.121951" y="162.3414" width="37.46341" height="37.46341"/>
</key>
<key keycode="37" name="LCTL" column="1" row="4" oref="outline1">
<bounds x="62.43902" y="162.3414" width="48.39024" height="37.46341"/>
</key>
<key keycode="64" name="LALT" column="2" row="4" oref="outline1">
<bounds x="113.9512" y="162.3414" width="48.39024" height="37.46341"/>
</key>
<key keycode="65" name="SPCE" column="3" row="4" oref="outline3">
<bounds x="165.4634" y="162.3414" width="217.5853" height="37.46341"/>
</key>
<key keycode="113" name="LEFT" column="4" row="4" oref="outline1">
<bounds x="368.0487" y="162.3414" width="48.39024" height="37.46341"/>
</key>
<key keycode="111" name="UP" column="5" row="4" oref="outline1">
<bounds x="419.43894" y="162.3414" width="48.39024" height="37.46341"/>
</key>
<key keycode="116" name="DOWN" column="6" row="4" oref="outline1">
<bounds x="470.82918" y="162.3414" width="48.39024" height="37.46341"/>
</key>
<key keycode="114" name="RGHT" column="7" row="4" oref="outline1">
<bounds x="522.21942" y="162.3414" width="48.39024" height="37.46341"/>
</key>
<key keycode="150" name="I150" column="8" row="4" oref="outline10">
<bounds x="573.60966" y="162.3414" width="37.46341" height="37.46341"/>
</key>
</section>
<outline id="outline2" corner-radius="1.000000">
<point x="0.000000" y="0.000000"/>
<point x="37.46341" y="0.000000"/>
<point x="37.46341" y="37.46341"/>
<point x="0.000000" y="37.46341"/>
</outline>
<outline id="outline1" corner-radius="1.000000">
<point x="0.000000" y="0.000000"/>
<point x="48.39024" y="0.000000"/>
<point x="48.39024" y="37.46341"/>
<point x="0.000000" y="37.46341"/>
</outline>
<outline id="outline4" corner-radius="1.000000">
<point x="0.000000" y="0.000000"/>
<point x="59.31707" y="0.000000"/>
<point x="59.31707" y="37.46341"/>
<point x="0.000000" y="37.46341"/>
</outline>
<outline id="outline5" corner-radius="1.000000">
<point x="0.000000" y="0.000000"/>
<point x="59.31707" y="0.000000"/>
<point x="59.31707" y="37.46341"/>
<point x="0.000000" y="37.46341"/>
</outline>
<outline id="outline6" corner-radius="1.000000">
<point x="0.000000" y="0.000000"/>
<point x="68.68292" y="0.000000"/>
<point x="68.68292" y="37.46341"/>
<point x="0.000000" y="37.46341"/>
</outline>
<outline id="outline7" corner-radius="1.000000">
<point x="0.000000" y="0.000000"/>
<point x="88.97561" y="0.000000"/>
<point x="88.97561" y="37.46341"/>
<point x="0.000000" y="37.46341"/>
</outline>
<outline id="outline8" corner-radius="1.000000">
<point x="0.000000" y="0.000000"/>
<point x="88.97561" y="0.000000"/>
<point x="88.97561" y="37.46341"/>
<point x="0.000000" y="37.46341"/>
</outline>
<outline id="outline9" corner-radius="1.000000">
<point x="0.000000" y="0.000000"/>
<point x="109.2682" y="0.000000"/>
<point x="109.2682" y="37.46341"/>
<point x="0.000000" y="37.46341"/>
</outline>
<outline id="outline10" corner-radius="1.000000">
<point x="0.000000" y="0.000000"/>
<point x="37.46341" y="0.000000"/>
<point x="37.46341" y="37.46341"/>
<point x="0.000000" y="37.46341"/>
</outline>
<outline id="outline13" corner-radius="1.000000">
<point x="0.000000" y="0.000000"/>
<point x="79.60975" y="0.000000"/>
<point x="79.60975" y="37.46341"/>
<point x="0.000000" y="37.46341"/>
</outline>
<outline id="outline3" corner-radius="1.000000">
<point x="0.000000" y="0.000000"/>
<point x="217.5853" y="0.000000"/>
<point x="217.5853" y="37.46341"/>
<point x="0.000000" y="37.46341"/>
</outline>
</geometry>

View File

@ -0,0 +1,88 @@
<?xml version="1.0"?>
<keyboards version="0.90">
<keyboard id="ar" name="ar"
geometry="compact" symbols="ar"
longname="Arabic" language="ar"/>
<keyboard id="be" name="be"
geometry="compact" symbols="be"
longname="Belarusian" language="be"/>
<keyboard id="fa" name="fa"
geometry="compact" symbols="fa"
longname="Farsi (ISIRI 2901-1994)" language="fa"/>
<keyboard id="he" name="he"
geometry="compact" symbols="he"
longname="Hebrew" language="he"/>
<keyboard id="ja" name="ja"
geometry="compact" symbols="ja-kana"
longname="Japanese (Kana)" language="ja"/>
<keyboard id="kk" name="kk"
geometry="compact" symbols="kk"
longname="Kazakh" language="kk"/>
<keyboard id="ks" name="ks"
geometry="compact" symbols="ks"
longname="Kashmiri" language="ks"/>
<keyboard id="my" name="my"
geometry="compact" symbols="my"
longname="Myanmar" language="my"/>
<keyboard id="ru" name="ru"
geometry="compact" symbols="us"
longname="Russian" language="ru"/>
<keyboard id="th" name="th"
geometry="compact" symbols="th"
longname="Thai" language="th"/>
<keyboard id="ua" name="ua"
geometry="compact" symbols="ua"
longname="Ukrainian" language="ua"/>
<keyboard id="ug" name="ug"
geometry="compact" symbols="ug"
longname="Uyghur" language="ug"/>
<keyboard id="us" name="us"
geometry="compact" symbols="us"
longname="US" language="en"/>
<keyboard id="zh-bopomofo" name="zh-bopomofo"
geometry="compact" symbols="zh-bopomofo"
longname="Chinese (Bopomofo)" language="zh"/>
<!-- Indic Inscript keyboards converted from m17n-lib -->
<keyboard id="as-inscript" name="as-inscript"
geometry="compact" symbols="as-inscript"
longname="Assamese (Inscript)" language="as"/>
<keyboard id="bn-inscript" name="bn-inscript"
geometry="compact" symbols="bn-inscript"
longname="Bengali (Inscript)" language="bn"/>
<keyboard id="gu-inscript" name="gu-inscript"
geometry="compact" symbols="gu-inscript"
longname="Gujarati (Inscript)" language="gu"/>
<keyboard id="hi-inscript" name="hi-inscript"
geometry="compact" symbols="hi-inscript"
longname="Hindi (Inscript)" language="hi"/>
<keyboard id="kn-inscript" name="kn-inscript"
geometry="compact" symbols="kn-inscript"
longname="Kannada (Inscript)" language="kn"/>
<keyboard id="ks-inscript" name="ks-inscript"
geometry="compact" symbols="ks-inscript"
longname="Kashmiri Devanagari (Inscript)" language="ks"/>
<keyboard id="mai-inscript" name="mai-inscript"
geometry="compact" symbols="mai-inscript"
longname="Maithili (Inscript)" language="mai"/>
<keyboard id="ml-inscript" name="ml-inscript"
geometry="compact" symbols="ml-inscript"
longname="Malayalam (Inscript)" language="ml-inscript"/>
<keyboard id="mr-inscript" name="mr-inscript"
geometry="compact" symbols="mr-inscript"
longname="Marathi (Inscript)" language="mr"/>
<keyboard id="or-inscript" name="or-inscript"
geometry="compact" symbols="or-inscript"
longname="Oriya (Inscript)" language="or"/>
<keyboard id="pa-inscript" name="pa-inscript"
geometry="compact" symbols="pa-inscript"
longname="Punjabi (Inscript)" language="pa"/>
<keyboard id="sd-inscript" name="sd-inscript"
geometry="compact" symbols="sd-inscript"
longname="Sindhi (Inscript)" language="sd"/>
<keyboard id="ta-inscript" name="ta-inscript"
geometry="compact" symbols="ta-inscript"
longname="Tamil (Inscript)" language="ta"/>
<keyboard id="te-inscript" name="te-inscript"
geometry="compact" symbols="te-inscript"
longname="Telugu (Inscript)" language="te"/>
</keyboards>

View File

@ -0,0 +1,181 @@
<?xml version="1.0"?>
<symbols version="0.90">
<include>us</include>
<key keycode="49" name="TLDE">
<keysym keyval="96">quoteleft</keysym>
<text category="letter">ّ</text>
</key>
<key keycode="10" name="AE01">
<text category="letter">١</text>
<keysym keyval="33">exclam</keysym>
</key>
<key keycode="11" name="AE02">
<text category="letter">٢</text>
<keysym keyval="64">at</keysym>
</key>
<key keycode="12" name="AE03">
<text category="letter">٣</text>
<keysym keyval="35">numbersign</keysym>
</key>
<key keycode="13" name="AE04">
<text category="letter">٤</text>
<keysym keyval="36">dollar</keysym>
</key>
<key keycode="14" name="AE05">
<text category="letter">٥</text>
<keysym keyval="37">percent</keysym>
<keysym keyval="8364">EuroSign</keysym>
</key>
<key keycode="15" name="AE06">
<text category="letter">٦</text>
<keysym keyval="94">asciicircum</keysym>
</key>
<key keycode="16" name="AE07">
<text category="letter">٧</text>
<keysym keyval="38">ampersand</keysym>
</key>
<key keycode="17" name="AE08">
<text category="letter">٨</text>
<keysym keyval="42">asterisk</keysym>
</key>
<key keycode="18" name="AE09">
<text category="letter">٩</text>
<text category="letter">)</text>
</key>
<key keycode="19" name="AE10">
<text category="letter">٠</text>
<text category="letter">(</text>
</key>
<key keycode="24" name="AD01">
<text category="letter">ض</text>
<text category="letter">َ</text>
</key>
<key keycode="25" name="AD02">
<text category="letter">ص</text>
<text category="letter">ً</text>
</key>
<key keycode="26" name="AD03">
<text category="letter">ث</text>
<text category="letter">ُ</text>
</key>
<key keycode="27" name="AD04">
<text category="letter">ق</text>
<text category="letter">ٌ</text>
</key>
<key keycode="28" name="AD05">
<text category="letter">ف</text>
<text category="letter">لإ</text>
</key>
<key keycode="29" name="AD06">
<text category="letter">غ</text>
<text category="letter">إ</text>
</key>
<key keycode="30" name="AD07">
<text category="letter">ع</text>
<text category="letter">`</text>
</key>
<key keycode="31" name="AD08">
<text category="letter">ه</text>
<text category="letter">÷</text>
</key>
<key keycode="32" name="AD09">
<text category="letter">خ</text>
<text category="letter">×</text>
</key>
<key keycode="33" name="AD10">
<text category="letter">ح</text>
<text category="letter">؛</text>
</key>
<key keycode="34" name="AD11">
<text category="letter">ج</text>
<text category="letter">&gt;</text>
</key>
<key keycode="35" name="AD12">
<text category="letter">د</text>
<text category="letter">&lt;</text>
</key>
<key keycode="38" name="AC01">
<text category="letter">ش</text>
<text category="letter">ِ</text>
</key>
<key keycode="39" name="AC02">
<text category="letter">س</text>
<text category="letter">ٍ</text>
</key>
<key keycode="40" name="AC03">
<text category="letter">ي</text>
<text category="letter">]</text>
</key>
<key keycode="41" name="AC04">
<text category="letter">ب</text>
<text category="letter">[</text>
</key>
<key keycode="42" name="AC05">
<text category="letter">ل</text>
<text category="letter">لأ</text>
</key>
<key keycode="43" name="AC06">
<text category="letter">ا</text>
<text category="letter">أ</text>
</key>
<key keycode="44" name="AC07">
<text category="letter">ت</text>
<text category="letter">ـ</text>
</key>
<key keycode="45" name="AC08">
<text category="letter">ن</text>
<text category="letter">،</text>
</key>
<key keycode="46" name="AC09">
<text category="letter">م</text>
<text category="letter">/</text>
</key>
<key keycode="47" name="AC10">
<text category="letter">ك</text>
<keysym keyval="58">colon</keysym>
</key>
<key keycode="48" name="AC11">
<keysym keyval="39">quoteright</keysym>
<keysym keyval="34">quotedbl</keysym>
</key>
<key keycode="52" name="AB01">
<text category="letter">ئ</text>
<text category="letter">~</text>
</key>
<key keycode="53" name="AB02">
<text category="letter">ء</text>
<text category="letter">ْ</text>
</key>
<key keycode="54" name="AB03">
<text category="letter">ؤ</text>
<text category="letter">}</text>
</key>
<key keycode="55" name="AB04">
<text category="letter">ر</text>
<text category="letter">{</text>
</key>
<key keycode="56" name="AB05">
<text category="letter">لا</text>
<text category="letter">لآ</text>
</key>
<key keycode="57" name="AB06">
<text category="letter">ى</text>
<text category="letter">آ</text>
</key>
<key keycode="58" name="AB07">
<text category="letter">ة</text>
<text category="letter">&apos;</text>
</key>
<key keycode="59" name="AB08">
<text category="letter">و</text>
<text category="letter">,</text>
</key>
<key keycode="60" name="AB09">
<text category="letter">ز</text>
<text category="letter">.</text>
</key>
<key keycode="61" name="AB10">
<text category="letter">ظ</text>
<text category="letter">؟</text>
</key>
</symbols>

View File

@ -0,0 +1,193 @@
<?xml version="1.0"?>
<symbols version="0.90">
<include>us</include>
<key keycode="49" name="TLDE">
<keysym keyval="96">quoteleft</keysym>
<text category="letter">~</text>
</key>
<key keycode="10" name="AE01">
<text category="letter"></text>
<text category="letter">!</text>
</key>
<key keycode="11" name="AE02">
<text category="letter"></text>
<text category="letter">@</text>
</key>
<key keycode="12" name="AE03">
<text category="letter"></text>
<text category="letter">্ৰ</text>
</key>
<key keycode="13" name="AE04">
<text category="letter"></text>
<text category="letter">ৰ্</text>
</key>
<key keycode="14" name="AE05">
<text category="letter"></text>
<text category="letter">জ্ঞ</text>
<keysym keyval="8364">EuroSign</keysym>
</key>
<key keycode="15" name="AE06">
<text category="letter"></text>
<text category="letter">ত্ৰ</text>
</key>
<key keycode="16" name="AE07">
<text category="letter"></text>
<text category="letter">ক্ষ</text>
</key>
<key keycode="17" name="AE08">
<text category="letter"></text>
<text category="letter">শ্ৰ</text>
</key>
<key keycode="18" name="AE09">
<text category="letter"></text>
<text category="letter">(</text>
</key>
<key keycode="19" name="AE10">
<text category="letter"></text>
<text category="letter">)</text>
</key>
<key keycode="20" name="AE11">
<text category="letter">-</text>
<text category="letter"></text>
</key>
<key keycode="21" name="AE12">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="24" name="AD01">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="25" name="AD02">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="26" name="AD03">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="27" name="AD04">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="28" name="AD05">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="29" name="AD06">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="30" name="AD07">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="31" name="AD08">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="32" name="AD09">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="33" name="AD10">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="34" name="AD11">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="35" name="AD12">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="51" name="BKSL">
<text category="letter"></text>
<text category="letter">|</text>
</key>
<key keycode="38" name="AC01">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="39" name="AC02">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="40" name="AC03">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="41" name="AC04">
<text category="letter">ি</text>
<text category="letter"></text>
</key>
<key keycode="42" name="AC05">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="43" name="AC06">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="44" name="AC07">
<text category="letter"></text>
<text category="letter">J</text>
</key>
<key keycode="45" name="AC08">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="46" name="AC09">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="47" name="AC10">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="48" name="AC11">
<keysym keyval="39">quoteright</keysym>
<text category="letter"></text>
</key>
<key keycode="52" name="AB01">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="53" name="AB02">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="54" name="AB03">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="55" name="AB04">
<text category="letter"></text>
<text category="letter">V</text>
</key>
<key keycode="56" name="AB05">
<text category="letter"></text>
<text category="letter">B</text>
</key>
<key keycode="57" name="AB06">
<text category="letter"></text>
<text category="letter">N</text>
</key>
<key keycode="58" name="AB07">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="59" name="AB08">
<text category="letter">,</text>
<text category="letter"></text>
</key>
<key keycode="60" name="AB09">
<text category="letter">.</text>
<text category="letter"></text>
</key>
<key keycode="61" name="AB10">
<text category="letter"></text>
<keysym keyval="63">question</keysym>
</key>
</symbols>

View File

@ -0,0 +1,193 @@
<?xml version="1.0"?>
<symbols version="0.90">
<include>us</include>
<key keycode="49" name="TLDE">
<keysym keyval="96">quoteleft</keysym>
<text category="letter">Ё</text>
</key>
<key keycode="10" name="AE01">
<keysym keyval="49">1</keysym>
<text category="letter">!</text>
</key>
<key keycode="11" name="AE02">
<keysym keyval="50">2</keysym>
<text category="letter">&quot;</text>
</key>
<key keycode="12" name="AE03">
<keysym keyval="51">3</keysym>
<text category="letter"></text>
</key>
<key keycode="13" name="AE04">
<keysym keyval="52">4</keysym>
<text category="letter">;</text>
</key>
<key keycode="14" name="AE05">
<keysym keyval="53">5</keysym>
<text category="letter">%</text>
<keysym keyval="8364">EuroSign</keysym>
</key>
<key keycode="15" name="AE06">
<keysym keyval="54">6</keysym>
<text category="letter">:</text>
</key>
<key keycode="16" name="AE07">
<keysym keyval="55">7</keysym>
<text category="letter">?</text>
</key>
<key keycode="17" name="AE08">
<keysym keyval="56">8</keysym>
<text category="letter">*</text>
</key>
<key keycode="18" name="AE09">
<keysym keyval="57">9</keysym>
<text category="letter">(</text>
</key>
<key keycode="19" name="AE10">
<keysym keyval="48">0</keysym>
<text category="letter">)</text>
</key>
<key keycode="20" name="AE11">
<keysym keyval="45">minus</keysym>
<text category="letter">_</text>
</key>
<key keycode="21" name="AE12">
<keysym keyval="61">equal</keysym>
<text category="letter">+</text>
</key>
<key keycode="24" name="AD01">
<text category="letter">й</text>
<text category="letter">Й</text>
</key>
<key keycode="25" name="AD02">
<text category="letter">ц</text>
<text category="letter">Ц</text>
</key>
<key keycode="26" name="AD03">
<text category="letter">у</text>
<text category="letter">У</text>
</key>
<key keycode="27" name="AD04">
<text category="letter">к</text>
<text category="letter">К</text>
</key>
<key keycode="28" name="AD05">
<text category="letter">е</text>
<text category="letter">Е</text>
</key>
<key keycode="29" name="AD06">
<text category="letter">н</text>
<text category="letter">Н</text>
</key>
<key keycode="30" name="AD07">
<text category="letter">г</text>
<text category="letter">Г</text>
</key>
<key keycode="31" name="AD08">
<text category="letter">ш</text>
<text category="letter">Ш</text>
</key>
<key keycode="32" name="AD09">
<text category="letter">ў</text>
<text category="letter">Ў</text>
</key>
<key keycode="33" name="AD10">
<text category="letter">з</text>
<text category="letter">З</text>
</key>
<key keycode="34" name="AD11">
<text category="letter">х</text>
<text category="letter">Х</text>
</key>
<key keycode="35" name="AD12">
<text category="letter">&apos;</text>
<text category="letter">&apos;</text>
</key>
<key keycode="51" name="BKSL">
<text category="letter">\</text>
<text category="letter">|</text>
</key>
<key keycode="38" name="AC01">
<text category="letter">ф</text>
<text category="letter">Ф</text>
</key>
<key keycode="39" name="AC02">
<text category="letter">ы</text>
<text category="letter">Ы</text>
</key>
<key keycode="40" name="AC03">
<text category="letter">в</text>
<text category="letter">В</text>
</key>
<key keycode="41" name="AC04">
<text category="letter">а</text>
<text category="letter">А</text>
</key>
<key keycode="42" name="AC05">
<text category="letter">п</text>
<text category="letter">П</text>
</key>
<key keycode="43" name="AC06">
<text category="letter">р</text>
<text category="letter">Р</text>
</key>
<key keycode="44" name="AC07">
<text category="letter">о</text>
<text category="letter">О</text>
</key>
<key keycode="45" name="AC08">
<text category="letter">л</text>
<text category="letter">Л</text>
</key>
<key keycode="46" name="AC09">
<text category="letter">д</text>
<text category="letter">Д</text>
</key>
<key keycode="47" name="AC10">
<text category="letter">ж</text>
<text category="letter">Ж</text>
</key>
<key keycode="48" name="AC11">
<keysym keyval="39">quoteright</keysym>
<text category="letter">Э</text>
</key>
<key keycode="52" name="AB01">
<text category="letter">я</text>
<text category="letter">Я</text>
</key>
<key keycode="53" name="AB02">
<text category="letter">ч</text>
<text category="letter">Ч</text>
</key>
<key keycode="54" name="AB03">
<text category="letter">с</text>
<text category="letter">С</text>
</key>
<key keycode="55" name="AB04">
<text category="letter">м</text>
<text category="letter">М</text>
</key>
<key keycode="56" name="AB05">
<text category="letter">і</text>
<text category="letter">І</text>
</key>
<key keycode="57" name="AB06">
<text category="letter">т</text>
<text category="letter">Т</text>
</key>
<key keycode="58" name="AB07">
<text category="letter">ь</text>
<text category="letter">Ь</text>
</key>
<key keycode="59" name="AB08">
<text category="letter">б</text>
<text category="letter">Б</text>
</key>
<key keycode="60" name="AB09">
<text category="letter">ю</text>
<text category="letter">Ю</text>
</key>
<key keycode="61" name="AB10">
<text category="letter">.</text>
<text category="letter">,</text>
</key>
</symbols>

View File

@ -0,0 +1,193 @@
<?xml version="1.0"?>
<symbols version="0.90">
<include>us</include>
<key keycode="49" name="TLDE">
<keysym keyval="96">quoteleft</keysym>
<text category="letter">~</text>
</key>
<key keycode="10" name="AE01">
<text category="letter"></text>
<text category="letter">!</text>
</key>
<key keycode="11" name="AE02">
<text category="letter"></text>
<text category="letter">@</text>
</key>
<key keycode="12" name="AE03">
<text category="letter"></text>
<text category="letter">#</text>
</key>
<key keycode="13" name="AE04">
<text category="letter"></text>
<text category="letter">$</text>
</key>
<key keycode="14" name="AE05">
<text category="letter"></text>
<text category="letter">%</text>
<keysym keyval="8364">EuroSign</keysym>
</key>
<key keycode="15" name="AE06">
<text category="letter"></text>
<text category="letter">^</text>
</key>
<key keycode="16" name="AE07">
<text category="letter"></text>
<text category="letter">&amp;</text>
</key>
<key keycode="17" name="AE08">
<text category="letter"></text>
<text category="letter">*</text>
</key>
<key keycode="18" name="AE09">
<text category="letter"></text>
<text category="letter">(</text>
</key>
<key keycode="19" name="AE10">
<text category="letter"></text>
<text category="letter">)</text>
</key>
<key keycode="20" name="AE11">
<text category="letter">-</text>
<text category="letter"></text>
</key>
<key keycode="21" name="AE12">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="24" name="AD01">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="25" name="AD02">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="26" name="AD03">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="27" name="AD04">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="28" name="AD05">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="29" name="AD06">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="30" name="AD07">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="31" name="AD08">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="32" name="AD09">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="33" name="AD10">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="34" name="AD11">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="35" name="AD12">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="51" name="BKSL">
<text category="letter">\</text>
<text category="letter">|</text>
</key>
<key keycode="38" name="AC01">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="39" name="AC02">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="40" name="AC03">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="41" name="AC04">
<text category="letter">ি</text>
<text category="letter"></text>
</key>
<key keycode="42" name="AC05">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="43" name="AC06">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="44" name="AC07">
<text category="letter"></text>
<text category="letter">J</text>
</key>
<key keycode="45" name="AC08">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="46" name="AC09">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="47" name="AC10">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="48" name="AC11">
<keysym keyval="39">quoteright</keysym>
<text category="letter"></text>
</key>
<key keycode="52" name="AB01">
<text category="letter">z</text>
<text category="letter">Z</text>
</key>
<key keycode="53" name="AB02">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="54" name="AB03">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="55" name="AB04">
<text category="letter"></text>
<text category="letter">V</text>
</key>
<key keycode="56" name="AB05">
<text category="letter"></text>
<text category="letter">B</text>
</key>
<key keycode="57" name="AB06">
<text category="letter"></text>
<text category="letter">N</text>
</key>
<key keycode="58" name="AB07">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="59" name="AB08">
<text category="letter">,</text>
<text category="letter"></text>
</key>
<key keycode="60" name="AB09">
<text category="letter">.</text>
<text category="letter"></text>
</key>
<key keycode="61" name="AB10">
<text category="letter"></text>
<text category="letter"></text>
</key>
</symbols>

View File

@ -0,0 +1,193 @@
<?xml version="1.0"?>
<symbols version="0.90">
<include>us</include>
<key keycode="49" name="TLDE">
<keysym keyval="96">quoteleft</keysym>
<keysym keyval="126">asciitilde</keysym>
</key>
<key keycode="10" name="AE01">
<text category="letter">۱</text>
<keysym keyval="33">exclam</keysym>
</key>
<key keycode="11" name="AE02">
<text category="letter">۲</text>
<text category="letter">٬</text>
</key>
<key keycode="12" name="AE03">
<text category="letter">۳</text>
<text category="letter">٫</text>
</key>
<key keycode="13" name="AE04">
<text category="letter">۴</text>
<keysym keyval="36">dollar</keysym>
</key>
<key keycode="14" name="AE05">
<text category="letter">۵</text>
<text category="letter">٪</text>
<keysym keyval="8364">EuroSign</keysym>
</key>
<key keycode="15" name="AE06">
<text category="letter">۶</text>
<text category="letter">×</text>
</key>
<key keycode="16" name="AE07">
<text category="letter">۷</text>
<text category="letter">،</text>
</key>
<key keycode="17" name="AE08">
<text category="letter">۸</text>
<keysym keyval="42">asterisk</keysym>
</key>
<key keycode="18" name="AE09">
<text category="letter">۹</text>
<text category="letter">)</text>
</key>
<key keycode="19" name="AE10">
<text category="letter">۰</text>
<text category="letter">(</text>
</key>
<key keycode="20" name="AE11">
<keysym keyval="45">minus</keysym>
<keysym keyval="95">underscore</keysym>
</key>
<key keycode="21" name="AE12">
<keysym keyval="61">equal</keysym>
<keysym keyval="43">plus</keysym>
</key>
<key keycode="24" name="AD01">
<text category="letter">ض</text>
<text category="letter">ْ</text>
</key>
<key keycode="25" name="AD02">
<text category="letter">ص</text>
<text category="letter">ٌ</text>
</key>
<key keycode="26" name="AD03">
<text category="letter">ث</text>
<text category="letter">ٍ</text>
</key>
<key keycode="27" name="AD04">
<text category="letter">ق</text>
<text category="letter">ً</text>
</key>
<key keycode="28" name="AD05">
<text category="letter">ف</text>
<text category="letter">ُ</text>
</key>
<key keycode="29" name="AD06">
<text category="letter">غ</text>
<text category="letter">ِ</text>
</key>
<key keycode="30" name="AD07">
<text category="letter">ع</text>
<text category="letter">َ</text>
</key>
<key keycode="31" name="AD08">
<text category="letter">ه</text>
<text category="letter">ّ</text>
</key>
<key keycode="32" name="AD09">
<text category="letter">خ</text>
<text category="letter">]</text>
</key>
<key keycode="33" name="AD10">
<text category="letter">ح</text>
<text category="letter">[</text>
</key>
<key keycode="34" name="AD11">
<text category="letter">ج</text>
<text category="letter">}</text>
</key>
<key keycode="35" name="AD12">
<text category="letter">چ</text>
<text category="letter">{</text>
</key>
<key keycode="51" name="BKSL">
<keysym keyval="92">backslash</keysym>
<keysym keyval="124">bar</keysym>
</key>
<key keycode="38" name="AC01">
<text category="letter">ش</text>
<text category="letter">ؤ</text>
</key>
<key keycode="39" name="AC02">
<text category="letter">س</text>
<text category="letter">ئ</text>
</key>
<key keycode="40" name="AC03">
<text category="letter">ی</text>
<text category="letter">ي</text>
</key>
<key keycode="41" name="AC04">
<text category="letter">ب</text>
<text category="letter">إ</text>
</key>
<key keycode="42" name="AC05">
<text category="letter">ل</text>
<text category="letter">أ</text>
</key>
<key keycode="43" name="AC06">
<text category="letter">ا</text>
<text category="letter">آ</text>
</key>
<key keycode="44" name="AC07">
<text category="letter">ت</text>
<text category="letter">ة</text>
</key>
<key keycode="45" name="AC08">
<text category="letter">ن</text>
<text category="letter">»</text>
</key>
<key keycode="46" name="AC09">
<text category="letter">م</text>
<text category="letter">«</text>
</key>
<key keycode="47" name="AC10">
<text category="letter">ک</text>
<keysym keyval="58">colon</keysym>
</key>
<key keycode="48" name="AC11">
<keysym keyval="39">quoteright</keysym>
<text category="letter">؛</text>
</key>
<key keycode="52" name="AB01">
<text category="letter">ظ</text>
<text category="letter">ك</text>
</key>
<key keycode="53" name="AB02">
<text category="letter">ط</text>
<keysym keyval="88">X</keysym>
</key>
<key keycode="54" name="AB03">
<text category="letter">ز</text>
<text category="letter">ژ</text>
</key>
<key keycode="55" name="AB04">
<text category="letter">ر</text>
<keysym keyval="86">V</keysym>
</key>
<key keycode="56" name="AB05">
<text category="letter">ذ</text>
<text category="letter"></text>
</key>
<key keycode="57" name="AB06">
<text category="letter">د</text>
<text name="N" category="letter"></text>
</key>
<key keycode="58" name="AB07">
<text category="letter">پ</text>
<text category="letter">ء</text>
</key>
<key keycode="59" name="AB08">
<text category="letter">و</text>
<text category="letter">&gt;</text>
</key>
<key keycode="60" name="AB09">
<keysym keyval="46">period</keysym>
<text category="letter">&lt;</text>
</key>
<key keycode="61" name="AB10">
<keysym keyval="47">slash</keysym>
<text category="letter">؟</text>
</key>
</symbols>

View File

@ -0,0 +1,193 @@
<?xml version="1.0"?>
<symbols version="0.90">
<include>us</include>
<key keycode="49" name="TLDE">
<keysym keyval="96">quoteleft</keysym>
<text category="letter">~</text>
</key>
<key keycode="10" name="AE01">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="11" name="AE02">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="12" name="AE03">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="13" name="AE04">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="14" name="AE05">
<text category="letter"></text>
<text category="letter">જ્ઞ</text>
<keysym keyval="8364">EuroSign</keysym>
</key>
<key keycode="15" name="AE06">
<text category="letter"></text>
<text category="letter">ત્ર</text>
</key>
<key keycode="16" name="AE07">
<text category="letter"></text>
<text category="letter">ક્ષ</text>
</key>
<key keycode="17" name="AE08">
<text category="letter"></text>
<text category="letter">શ્ર</text>
</key>
<key keycode="18" name="AE09">
<text category="letter"></text>
<text category="letter">(</text>
</key>
<key keycode="19" name="AE10">
<text category="letter"></text>
<text category="letter">)</text>
</key>
<key keycode="20" name="AE11">
<text category="letter">-</text>
<text category="letter"></text>
</key>
<key keycode="21" name="AE12">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="24" name="AD01">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="25" name="AD02">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="26" name="AD03">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="27" name="AD04">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="28" name="AD05">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="29" name="AD06">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="30" name="AD07">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="31" name="AD08">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="32" name="AD09">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="33" name="AD10">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="34" name="AD11">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="35" name="AD12">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="51" name="BKSL">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="38" name="AC01">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="39" name="AC02">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="40" name="AC03">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="41" name="AC04">
<text category="letter">િ</text>
<text category="letter"></text>
</key>
<key keycode="42" name="AC05">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="43" name="AC06">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="44" name="AC07">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="45" name="AC08">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="46" name="AC09">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="47" name="AC10">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="48" name="AC11">
<keysym keyval="39">quoteright</keysym>
<text category="letter"></text>
</key>
<key keycode="52" name="AB01">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="53" name="AB02">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="54" name="AB03">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="55" name="AB04">
<text category="letter"></text>
<text category="letter">&quot;</text>
</key>
<key keycode="56" name="AB05">
<text category="letter"></text>
<text category="letter">&apos;</text>
</key>
<key keycode="57" name="AB06">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="58" name="AB07">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="59" name="AB08">
<text category="letter">,</text>
<text category="letter"></text>
</key>
<key keycode="60" name="AB09">
<text category="letter">.</text>
<text category="letter"></text>
</key>
<key keycode="61" name="AB10">
<text category="letter"></text>
<text category="letter">?</text>
</key>
</symbols>

View File

@ -0,0 +1,193 @@
<?xml version="1.0"?>
<symbols version="0.90">
<include>us</include>
<key keycode="49" name="TLDE">
<keysym keyval="96">quoteleft</keysym>
<keysym keyval="126">asciitilde</keysym>
</key>
<key keycode="10" name="AE01">
<keysym keyval="49">1</keysym>
<keysym keyval="33">exclam</keysym>
</key>
<key keycode="11" name="AE02">
<keysym keyval="50">2</keysym>
<keysym keyval="64">at</keysym>
</key>
<key keycode="12" name="AE03">
<keysym keyval="51">3</keysym>
<keysym keyval="35">numbersign</keysym>
</key>
<key keycode="13" name="AE04">
<keysym keyval="52">4</keysym>
<keysym keyval="36">dollar</keysym>
</key>
<key keycode="14" name="AE05">
<keysym keyval="53">5</keysym>
<keysym keyval="37">percent</keysym>
<keysym keyval="8364">EuroSign</keysym>
</key>
<key keycode="15" name="AE06">
<keysym keyval="54">6</keysym>
<keysym keyval="94">asciicircum</keysym>
</key>
<key keycode="16" name="AE07">
<keysym keyval="55">7</keysym>
<keysym keyval="38">ampersand</keysym>
</key>
<key keycode="17" name="AE08">
<keysym keyval="56">8</keysym>
<keysym keyval="42">asterisk</keysym>
</key>
<key keycode="18" name="AE09">
<keysym keyval="57">9</keysym>
<text category="letter">)</text>
</key>
<key keycode="19" name="AE10">
<keysym keyval="48">0</keysym>
<text category="letter">(</text>
</key>
<key keycode="20" name="AE11">
<keysym keyval="45">minus</keysym>
<keysym keyval="95">underscore</keysym>
</key>
<key keycode="21" name="AE12">
<keysym keyval="61">equal</keysym>
<keysym keyval="43">plus</keysym>
</key>
<key keycode="24" name="AD01">
<text category="letter">/</text>
<keysym keyval="81">Q</keysym>
</key>
<key keycode="25" name="AD02">
<text category="letter">&apos;</text>
<keysym keyval="87">W</keysym>
</key>
<key keycode="26" name="AD03">
<text category="letter">ק</text>
<keysym keyval="69">E</keysym>
</key>
<key keycode="27" name="AD04">
<text category="letter">ר</text>
<keysym keyval="82">R</keysym>
</key>
<key keycode="28" name="AD05">
<text category="letter">א</text>
<keysym keyval="84">T</keysym>
</key>
<key keycode="29" name="AD06">
<text category="letter">ט</text>
<keysym keyval="89">Y</keysym>
</key>
<key keycode="30" name="AD07">
<text category="letter">ו</text>
<keysym keyval="85">U</keysym>
</key>
<key keycode="31" name="AD08">
<text category="letter">ן</text>
<keysym keyval="73">I</keysym>
</key>
<key keycode="32" name="AD09">
<text category="letter">ם</text>
<keysym keyval="79">O</keysym>
</key>
<key keycode="33" name="AD10">
<text category="letter">פ</text>
<keysym keyval="80">P</keysym>
</key>
<key keycode="34" name="AD11">
<text category="letter">]</text>
<text category="letter">}</text>
</key>
<key keycode="35" name="AD12">
<text category="letter">[</text>
<text category="letter">{</text>
</key>
<key keycode="51" name="BKSL">
<keysym keyval="92">backslash</keysym>
<keysym keyval="124">bar</keysym>
</key>
<key keycode="38" name="AC01">
<text category="letter">ש</text>
<keysym keyval="65">A</keysym>
</key>
<key keycode="39" name="AC02">
<text category="letter">ד</text>
<keysym keyval="83">S</keysym>
</key>
<key keycode="40" name="AC03">
<text category="letter">ג</text>
<keysym keyval="68">D</keysym>
</key>
<key keycode="41" name="AC04">
<text category="letter">כ</text>
<keysym keyval="70">F</keysym>
</key>
<key keycode="42" name="AC05">
<text category="letter">ע</text>
<keysym keyval="71">G</keysym>
</key>
<key keycode="43" name="AC06">
<text category="letter">י</text>
<keysym keyval="72">H</keysym>
</key>
<key keycode="44" name="AC07">
<text category="letter">ח</text>
<keysym keyval="74">J</keysym>
</key>
<key keycode="45" name="AC08">
<text category="letter">ל</text>
<keysym keyval="75">K</keysym>
</key>
<key keycode="46" name="AC09">
<text category="letter">ך</text>
<keysym keyval="76">L</keysym>
</key>
<key keycode="47" name="AC10">
<text category="letter">ף</text>
<keysym keyval="58">colon</keysym>
</key>
<key keycode="48" name="AC11">
<keysym keyval="39">quoteright</keysym>
<keysym keyval="34">quotedbl</keysym>
</key>
<key keycode="52" name="AB01">
<text category="letter">ז</text>
<keysym keyval="90">Z</keysym>
</key>
<key keycode="53" name="AB02">
<text category="letter">ס</text>
<keysym keyval="88">X</keysym>
</key>
<key keycode="54" name="AB03">
<text category="letter">ב</text>
<keysym keyval="67">C</keysym>
</key>
<key keycode="55" name="AB04">
<text category="letter">ה</text>
<keysym keyval="86">V</keysym>
</key>
<key keycode="56" name="AB05">
<text category="letter">נ</text>
<keysym keyval="66">B</keysym>
</key>
<key keycode="57" name="AB06">
<text category="letter">מ</text>
<keysym keyval="78">N</keysym>
</key>
<key keycode="58" name="AB07">
<text category="letter">צ</text>
<keysym keyval="77">M</keysym>
</key>
<key keycode="59" name="AB08">
<text category="letter">ת</text>
<text category="letter">&gt;</text>
</key>
<key keycode="60" name="AB09">
<text category="letter">ץ</text>
<text category="letter">&lt;</text>
</key>
<key keycode="61" name="AB10">
<text category="letter">.</text>
<keysym keyval="63">question</keysym>
</key>
</symbols>

View File

@ -0,0 +1,193 @@
<?xml version="1.0"?>
<symbols version="0.90">
<include>us</include>
<key keycode="49" name="TLDE">
<keysym keyval="96">quoteleft</keysym>
<text category="letter"></text>
</key>
<key keycode="10" name="AE01">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="11" name="AE02">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="12" name="AE03">
<text category="letter"></text>
<text category="letter">#</text>
</key>
<key keycode="13" name="AE04">
<text category="letter"></text>
<text category="letter">$</text>
</key>
<key keycode="14" name="AE05">
<text category="letter"></text>
<text category="letter">ज्ञ</text>
<keysym keyval="8364">EuroSign</keysym>
</key>
<key keycode="15" name="AE06">
<text category="letter"></text>
<text category="letter">त्र</text>
</key>
<key keycode="16" name="AE07">
<text category="letter"></text>
<text category="letter">क्ष</text>
</key>
<key keycode="17" name="AE08">
<text category="letter"></text>
<text category="letter">श्र</text>
</key>
<key keycode="18" name="AE09">
<text category="letter"></text>
<text category="letter">(</text>
</key>
<key keycode="19" name="AE10">
<text category="letter"></text>
<text category="letter">)</text>
</key>
<key keycode="20" name="AE11">
<text category="letter">-</text>
<text category="letter"></text>
</key>
<key keycode="21" name="AE12">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="24" name="AD01">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="25" name="AD02">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="26" name="AD03">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="27" name="AD04">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="28" name="AD05">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="29" name="AD06">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="30" name="AD07">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="31" name="AD08">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="32" name="AD09">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="33" name="AD10">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="34" name="AD11">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="35" name="AD12">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="51" name="BKSL">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="38" name="AC01">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="39" name="AC02">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="40" name="AC03">
<text category="letter">्‌</text>
<text category="letter"></text>
</key>
<key keycode="41" name="AC04">
<text category="letter">ि</text>
<text category="letter"></text>
</key>
<key keycode="42" name="AC05">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="43" name="AC06">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="44" name="AC07">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="45" name="AC08">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="46" name="AC09">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="47" name="AC10">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="48" name="AC11">
<keysym keyval="39">quoteright</keysym>
<text category="letter"></text>
</key>
<key keycode="52" name="AB01">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="53" name="AB02">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="54" name="AB03">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="55" name="AB04">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="56" name="AB05">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="57" name="AB06">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="58" name="AB07">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="59" name="AB08">
<text category="letter">,</text>
<text category="letter"></text>
</key>
<key keycode="60" name="AB09">
<text category="letter">.</text>
<text category="letter"></text>
</key>
<key keycode="61" name="AB10">
<text category="letter"></text>
<text category="letter"></text>
</key>
</symbols>

View File

@ -0,0 +1,250 @@
<?xml version="1.0"?>
<symbols version="0.90">
<include>us</include>
<key keycode="1" name="AE03" groups="2">
<keysym keyval="51" label="あ">3</keysym>
<keysym keyval="35" label="ぁ">numbersign</keysym>
<keysym keyval="51" label="ア">3</keysym>
<keysym keyval="35" label="ァ">numbersign</keysym>
</key>
<key keycode="2" name="AD03" groups="2">
<keysym keyval="101" label="い">e</keysym>
<keysym keyval="69" label="ぃ">E</keysym>
<keysym keyval="101" label="イ">e</keysym>
<keysym keyval="69" label="ィ">E</keysym>
</key>
<key keycode="3" name="AE04" groups="2">
<keysym keyval="52" label="う">4</keysym>
<keysym keyval="36" label="ぅ">dollar</keysym>
<keysym keyval="52" label="ウ">4</keysym>
<keysym keyval="36" label="ゥ">dollar</keysym>
</key>
<key keycode="4" name="AE05" groups="2">
<keysym keyval="53" label="え">5</keysym>
<keysym keyval="37" label="ぇ">percent</keysym>
<keysym keyval="53" label="エ">5</keysym>
<keysym keyval="37" label="ェ">percent</keysym>
</key>
<key keycode="5" name="AE06" groups="2">
<keysym keyval="54" label="お">6</keysym>
<keysym keyval="38" label="ぉ">ampersand</keysym>
<keysym keyval="54" label="オ">6</keysym>
<keysym keyval="38" label="ォ">ampersand</keysym>
</key>
<key keycode="6" name="AE03" groups="2">
<keysym keyval="116" label="か">t</keysym>
<keysym keyval="116" label="カ">t</keysym>
</key>
<key keycode="7" name="AD03" groups="2">
<keysym keyval="103" label="き">g</keysym>
<keysym keyval="103" label="キ">g</keysym>
</key>
<key keycode="8" name="AE04" groups="2">
<keysym keyval="104" label="く">h</keysym>
<keysym keyval="104" label="ク">h</keysym>
</key>
<key keycode="9" name="AE05" groups="2">
<keysym keyval="58" label="け">colon</keysym>
<keysym keyval="58" label="ケ">colon</keysym>
</key>
<key keycode="10" name="AE06" groups="2">
<keysym keyval="98" label="こ">b</keysym>
<keysym keyval="98" label="コ">b</keysym>
</key>
<key keycode="11" name="AE03" groups="2">
<keysym keyval="120" label="さ">x</keysym>
<keysym keyval="120" label="サ">x</keysym>
</key>
<key keycode="12" name="AD03" groups="2">
<keysym keyval="100" label="し">d</keysym>
<keysym keyval="100" label="シ">d</keysym>
</key>
<key keycode="13" name="AE04" groups="2">
<keysym keyval="114" label="す">r</keysym>
<keysym keyval="114" label="ス">r</keysym>
</key>
<key keycode="14" name="AE05" groups="2">
<keysym keyval="112" label="せ">p</keysym>
<keysym keyval="112" label="セ">p</keysym>
</key>
<key keycode="15" name="AE06" groups="2">
<keysym keyval="99" label="そ">c</keysym>
<keysym keyval="99" label="ソ">c</keysym>
</key>
<key keycode="16" name="AE03" groups="2">
<keysym keyval="113" label="た">q</keysym>
<keysym keyval="113" label="タ">q</keysym>
</key>
<key keycode="17" name="AD03" groups="2">
<keysym keyval="97" label="ち">a</keysym>
<keysym keyval="97" label="チ">a</keysym>
</key>
<key keycode="18" name="AE04" groups="2">
<keysym keyval="122" label="つ">z</keysym>
<keysym keyval="90" label="っ">Z</keysym>
<keysym keyval="122" label="ツ">z</keysym>
<keysym keyval="90" label="ッ">Z</keysym>
</key>
<key keycode="19" name="AE05" groups="2">
<keysym keyval="119" label="て">w</keysym>
<keysym keyval="119" label="テ">w</keysym>
</key>
<key keycode="20" name="AE06" groups="2">
<keysym keyval="115" label="と">s</keysym>
<keysym keyval="115" label="ト">s</keysym>
</key>
<key keycode="21" name="AE03" groups="2">
<keysym keyval="117" label="な">u</keysym>
<keysym keyval="117" label="ナ">u</keysym>
</key>
<key keycode="22" name="AD03" groups="2">
<keysym keyval="105" label="に">i</keysym>
<keysym keyval="105" label="ニ">i</keysym>
</key>
<key keycode="23" name="AE04" groups="2">
<keysym keyval="33" label="ぬ">exclam</keysym>
<keysym keyval="33" label="ヌ">exclam</keysym>
</key>
<key keycode="24" name="AE05" groups="2">
<keysym keyval="44" label="ね">comma</keysym>
<keysym keyval="44" label="ネ">comma</keysym>
</key>
<key keycode="25" name="AE06" groups="2">
<keysym keyval="107" label="の">k</keysym>
<keysym keyval="107" label="">k</keysym>
</key>
<key keycode="26" name="AE03" groups="2">
<keysym keyval="102" label="は">f</keysym>
<keysym keyval="102" label="ハ">f</keysym>
</key>
<key keycode="27" name="AD03" groups="2">
<keysym keyval="118" label="ひ">v</keysym>
<keysym keyval="118" label="ヒ">v</keysym>
</key>
<key keycode="28" name="AE04" groups="2">
<keysym keyval="34" label="ふ">quotedbl</keysym>
<keysym keyval="34" label="フ">quotedbl</keysym>
</key>
<key keycode="29" name="AE05" groups="2">
<keysym keyval="94" label="へ">asciicircum</keysym>
<keysym keyval="94" label="ヘ">asciicircum</keysym>
</key>
<key keycode="30" name="AE06" groups="2">
<keysym keyval="61" label="ほ">equal</keysym>
<keysym keyval="61" label="ホ">equal</keysym>
</key>
<key keycode="31" name="AE03" groups="2">
<keysym keyval="106" label="ま">j</keysym>
<keysym keyval="106" label="マ">j</keysym>
</key>
<key keycode="32" name="AD03" groups="2">
<keysym keyval="110" label="み">n</keysym>
<keysym keyval="110" label="ミ">n</keysym>
</key>
<key keycode="33" name="AE04" groups="2">
<keysym keyval="93" label="む">bracketright</keysym>
<keysym keyval="93" label="ム">bracketright</keysym>
</key>
<key keycode="34" name="AE05" groups="2">
<keysym keyval="47" label="め">slash</keysym>
<keysym keyval="47" label="メ">slash</keysym>
</key>
<key keycode="35" name="AE06" groups="2">
<keysym keyval="109" label="も">m</keysym>
<keysym keyval="109" label="モ">m</keysym>
</key>
<key keycode="36" name="AE03" groups="2">
<keysym keyval="55" label="や">7</keysym>
<keysym keyval="39" label="ゃ">quoteright</keysym>
<keysym keyval="55" label="ヤ">7</keysym>
<keysym keyval="39" label="ャ">quoteright</keysym>
</key>
<key keycode="37" name="AD03" groups="2">
<keysym keyval="56" label="ゆ">8</keysym>
<keysym keyval="40" label="ゅ">parenleft</keysym>
<keysym keyval="56" label="ユ">8</keysym>
<keysym keyval="40" label="ュ">parenleft</keysym>
</key>
<key keycode="38" name="AE04" groups="2">
<keysym keyval="57" label="よ">9</keysym>
<keysym keyval="41" label="ょ">parenright</keysym>
<keysym keyval="57" label="ヨ">9</keysym>
<keysym keyval="41" label="ョ">parenright</keysym>
</key>
<key keycode="41" name="AE03" groups="2">
<keysym keyval="111" label="ら">o</keysym>
<keysym keyval="111" label="ラ">o</keysym>
</key>
<key keycode="42" name="AD03" groups="2">
<keysym keyval="108" label="り">l</keysym>
<keysym keyval="108" label="リ">l</keysym>
</key>
<key keycode="43" name="AE04" groups="2">
<keysym keyval="46" label="る">period</keysym>
<keysym keyval="46" label="ル">period</keysym>
</key>
<key keycode="44" name="AE05" groups="2">
<keysym keyval="59" label="れ">semicolon</keysym>
<keysym keyval="59" label="レ">semicolon</keysym>
</key>
<key keycode="45" name="AE06" groups="2">
<keysym keyval="92" label="ろ">backslash</keysym>
<keysym keyval="92" label="ロ">backslash</keysym>
</key>
<key keycode="46" name="AE03" groups="2">
<keysym keyval="48" label="わ">0</keysym>
<keysym keyval="48" label="ワ">0</keysym>
</key>
<key keycode="47" name="AD03" groups="2">
<keysym keyval="126" label="を">asciitilde</keysym>
<keysym keyval="126" label="ヲ">asciitilde</keysym>
</key>
<key keycode="48" name="AE04" groups="2">
<keysym keyval="121" label="ん">y</keysym>
<keysym keyval="121" label="ン">y</keysym>
</key>
<key keycode="49" name="AE05" groups="2">
<keysym keyval="123" label="「">braceleft</keysym>
<keysym keyval="48" label="ゐ">0</keysym>
<keysym keyval="123" label="「">braceleft</keysym>
<keysym keyval="48" label="ヰ">0</keysym>
</key>
<key keycode="50" name="AE06" groups="2">
<keysym keyval="125" label="」">braceright</keysym>
<keysym keyval="48" label="ゑ">0</keysym>
<keysym keyval="125" label="」">braceright</keysym>
<keysym keyval="48" label="ヱ">0</keysym>
</key>
<key keycode="51" name="AE03" groups="2">
<keysym keyval="64" label="゛">at</keysym>
<keysym keyval="64" label="゛">at</keysym>
</key>
<key keycode="52" name="AD03" groups="2">
<keysym keyval="91" label="゜">bracketleft</keysym>
<keysym keyval="91" label="゜">bracketleft</keysym>
</key>
<key keycode="53" name="AE04" groups="2">
<keysym keyval="124" label="ー">bar</keysym>
<keysym keyval="124" label="ー">bar</keysym>
</key>
<key keycode="54" name="AE05" groups="2">
<keysym keyval="60" label="、">less</keysym>
<keysym keyval="60" label="、">less</keysym>
</key>
<key keycode="55" name="AE06" groups="2">
<keysym keyval="62" label="。">greater</keysym>
<keysym keyval="63" label="・">question</keysym>
<keysym keyval="62" label="。">greater</keysym>
<keysym keyval="63" label="・">question</keysym>
</key>
</symbols>

View File

@ -0,0 +1,193 @@
<?xml version="1.0"?>
<symbols version="0.90">
<include>us</include>
<key keycode="49" name="TLDE">
<keysym keyval="96">quoteleft</keysym>
<text category="letter">)</text>
</key>
<key keycode="10" name="AE01">
<text category="letter">&quot;</text>
<keysym keyval="33">exclam</keysym>
</key>
<key keycode="11" name="AE02">
<text category="letter">ә</text>
<text category="letter">Ә</text>
</key>
<key keycode="12" name="AE03">
<text category="letter">і</text>
<text category="letter">І</text>
</key>
<key keycode="13" name="AE04">
<text category="letter">ӊ</text>
<text category="letter">Ӊ</text>
</key>
<key keycode="14" name="AE05">
<text category="letter">ғ</text>
<text category="letter">Ғ</text>
<keysym keyval="8364">EuroSign</keysym>
</key>
<key keycode="15" name="AE06">
<text category="letter">,</text>
<text category="letter">;</text>
</key>
<key keycode="16" name="AE07">
<text category="letter">.</text>
<text category="letter">:</text>
</key>
<key keycode="17" name="AE08">
<text category="letter">ү</text>
<text category="letter">Ү</text>
</key>
<key keycode="18" name="AE09">
<text category="letter">ұ</text>
<text category="letter">Ұ</text>
</key>
<key keycode="19" name="AE10">
<text category="letter">қ</text>
<text category="letter">Қ</text>
</key>
<key keycode="20" name="AE11">
<text category="letter">ө</text>
<text category="letter">Ө</text>
</key>
<key keycode="21" name="AE12">
<text category="letter">һ</text>
<text category="letter">Һ</text>
</key>
<key keycode="24" name="AD01">
<text category="letter">й</text>
<text category="letter">Й</text>
</key>
<key keycode="25" name="AD02">
<text category="letter">ц</text>
<text category="letter">Ц</text>
</key>
<key keycode="26" name="AD03">
<text category="letter">у</text>
<text category="letter">У</text>
</key>
<key keycode="27" name="AD04">
<text category="letter">к</text>
<text category="letter">К</text>
</key>
<key keycode="28" name="AD05">
<text category="letter">е</text>
<text category="letter">Е</text>
</key>
<key keycode="29" name="AD06">
<text category="letter">н</text>
<text category="letter">Н</text>
</key>
<key keycode="30" name="AD07">
<text category="letter">г</text>
<text category="letter">Г</text>
</key>
<key keycode="31" name="AD08">
<text category="letter">ш</text>
<text category="letter">Ш</text>
</key>
<key keycode="32" name="AD09">
<text category="letter">щ</text>
<text category="letter">Щ</text>
</key>
<key keycode="33" name="AD10">
<text category="letter">з</text>
<text category="letter">З</text>
</key>
<key keycode="34" name="AD11">
<text category="letter">х</text>
<text category="letter">Х</text>
</key>
<key keycode="35" name="AD12">
<text category="letter">ъ</text>
<text category="letter">Ъ</text>
</key>
<key keycode="51" name="BKSL">
<keysym keyval="92">backslash</keysym>
<keysym keyval="124">bar</keysym>
</key>
<key keycode="38" name="AC01">
<text category="letter">ф</text>
<text category="letter">Ф</text>
</key>
<key keycode="39" name="AC02">
<text category="letter">ы</text>
<text category="letter">Ы</text>
</key>
<key keycode="40" name="AC03">
<text category="letter">в</text>
<text category="letter">В</text>
</key>
<key keycode="41" name="AC04">
<text category="letter">а</text>
<text category="letter">А</text>
</key>
<key keycode="42" name="AC05">
<text category="letter">п</text>
<text category="letter">П</text>
</key>
<key keycode="43" name="AC06">
<text category="letter">р</text>
<text category="letter">Р</text>
</key>
<key keycode="44" name="AC07">
<text category="letter">о</text>
<text category="letter">О</text>
</key>
<key keycode="45" name="AC08">
<text category="letter">л</text>
<text category="letter">Л</text>
</key>
<key keycode="46" name="AC09">
<text category="letter">д</text>
<text category="letter">Д</text>
</key>
<key keycode="47" name="AC10">
<text category="letter">ж</text>
<text category="letter">Ж</text>
</key>
<key keycode="48" name="AC11">
<keysym keyval="39">quoteright</keysym>
<text category="letter">Э</text>
</key>
<key keycode="52" name="AB01">
<text category="letter">я</text>
<text category="letter">Я</text>
</key>
<key keycode="53" name="AB02">
<text category="letter">ч</text>
<text category="letter">Ч</text>
</key>
<key keycode="54" name="AB03">
<text category="letter">с</text>
<text category="letter">С</text>
</key>
<key keycode="55" name="AB04">
<text category="letter">м</text>
<text category="letter">М</text>
</key>
<key keycode="56" name="AB05">
<text category="letter">и</text>
<text category="letter">И</text>
</key>
<key keycode="57" name="AB06">
<text category="letter">т</text>
<text category="letter">Т</text>
</key>
<key keycode="58" name="AB07">
<text category="letter">ь</text>
<text category="letter">Ь</text>
</key>
<key keycode="59" name="AB08">
<text category="letter">б</text>
<text category="letter">Б</text>
</key>
<key keycode="60" name="AB09">
<text category="letter">ю</text>
<text category="letter">Ю</text>
</key>
<key keycode="61" name="AB10">
<text category="letter"></text>
<keysym keyval="63">question</keysym>
</key>
</symbols>

View File

@ -0,0 +1,193 @@
<?xml version="1.0"?>
<symbols version="0.90">
<include>us</include>
<key keycode="49" name="TLDE">
<keysym keyval="96">quoteleft</keysym>
<text category="letter"></text>
</key>
<key keycode="10" name="AE01">
<text category="letter"></text>
<text category="letter">!</text>
</key>
<key keycode="11" name="AE02">
<text category="letter"></text>
<text category="letter">@</text>
</key>
<key keycode="12" name="AE03">
<text category="letter"></text>
<text category="letter">#</text>
</key>
<key keycode="13" name="AE04">
<text category="letter"></text>
<text category="letter">$</text>
</key>
<key keycode="14" name="AE05">
<text category="letter"></text>
<text category="letter">ಜ್ಞ</text>
<keysym keyval="8364">EuroSign</keysym>
</key>
<key keycode="15" name="AE06">
<text category="letter"></text>
<text category="letter">ತ್ರ</text>
</key>
<key keycode="16" name="AE07">
<text category="letter"></text>
<text category="letter">ಕ್ಷ</text>
</key>
<key keycode="17" name="AE08">
<text category="letter"></text>
<text category="letter">ಶ್ರ</text>
</key>
<key keycode="18" name="AE09">
<text category="letter"></text>
<text category="letter">(</text>
</key>
<key keycode="19" name="AE10">
<text category="letter"></text>
<text category="letter">)</text>
</key>
<key keycode="20" name="AE11">
<text category="letter">-</text>
<text category="letter"></text>
</key>
<key keycode="21" name="AE12">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="24" name="AD01">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="25" name="AD02">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="26" name="AD03">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="27" name="AD04">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="28" name="AD05">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="29" name="AD06">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="30" name="AD07">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="31" name="AD08">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="32" name="AD09">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="33" name="AD10">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="34" name="AD11">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="35" name="AD12">
<text category="letter">]</text>
<text category="letter"></text>
</key>
<key keycode="51" name="BKSL">
<text category="letter"></text>
<text category="letter">|</text>
</key>
<key keycode="38" name="AC01">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="39" name="AC02">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="40" name="AC03">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="41" name="AC04">
<text category="letter">ಿ</text>
<text category="letter"></text>
</key>
<key keycode="42" name="AC05">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="43" name="AC06">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="44" name="AC07">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="45" name="AC08">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="46" name="AC09">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="47" name="AC10">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="48" name="AC11">
<keysym keyval="39">quoteright</keysym>
<text category="letter"></text>
</key>
<key keycode="52" name="AB01">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="53" name="AB02">
<text category="letter"></text>
<text name="X" category="letter"></text>
</key>
<key keycode="54" name="AB03">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="55" name="AB04">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="56" name="AB05">
<text category="letter"></text>
<keysym keyval="66">B</keysym>
</key>
<key keycode="57" name="AB06">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="58" name="AB07">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="59" name="AB08">
<text category="letter">,</text>
<text category="letter"></text>
</key>
<key keycode="60" name="AB09">
<text category="letter">.</text>
<text category="letter"></text>
</key>
<key keycode="61" name="AB10">
<text category="letter"></text>
<keysym keyval="63">question</keysym>
</key>
</symbols>

View File

@ -0,0 +1,193 @@
<?xml version="1.0"?>
<symbols version="0.90">
<include>us</include>
<key keycode="49" name="TLDE">
<keysym keyval="96">quoteleft</keysym>
<text category="letter"></text>
</key>
<key keycode="10" name="AE01">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="11" name="AE02">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="12" name="AE03">
<text category="letter"></text>
<text category="letter">#</text>
</key>
<key keycode="13" name="AE04">
<text category="letter"></text>
<text category="letter">$</text>
</key>
<key keycode="14" name="AE05">
<text category="letter"></text>
<text category="letter">ज्ञ</text>
<keysym keyval="8364">EuroSign</keysym>
</key>
<key keycode="15" name="AE06">
<text category="letter"></text>
<text category="letter">त्र</text>
</key>
<key keycode="16" name="AE07">
<text category="letter"></text>
<text category="letter">क्ष</text>
</key>
<key keycode="17" name="AE08">
<text category="letter"></text>
<text category="letter">श्र</text>
</key>
<key keycode="18" name="AE09">
<text category="letter"></text>
<text category="letter">(</text>
</key>
<key keycode="19" name="AE10">
<text category="letter"></text>
<text category="letter">)</text>
</key>
<key keycode="20" name="AE11">
<text category="letter">-</text>
<text category="letter"></text>
</key>
<key keycode="21" name="AE12">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="24" name="AD01">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="25" name="AD02">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="26" name="AD03">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="27" name="AD04">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="28" name="AD05">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="29" name="AD06">
<text category="letter">ॿ</text>
<text category="letter"></text>
</key>
<key keycode="30" name="AD07">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="31" name="AD08">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="32" name="AD09">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="33" name="AD10">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="34" name="AD11">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="35" name="AD12">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="51" name="BKSL">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="38" name="AC01">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="39" name="AC02">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="40" name="AC03">
<text category="letter">्‌</text>
<text category="letter"></text>
</key>
<key keycode="41" name="AC04">
<text category="letter">ि</text>
<text category="letter"></text>
</key>
<key keycode="42" name="AC05">
<keysym keyval="103">g</keysym>
<keysym keyval="71">G</keysym>
</key>
<key keycode="43" name="AC06">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="44" name="AC07">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="45" name="AC08">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="46" name="AC09">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="47" name="AC10">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="48" name="AC11">
<keysym keyval="39">quoteright</keysym>
<text category="letter"></text>
</key>
<key keycode="52" name="AB01">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="53" name="AB02">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="54" name="AB03">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="55" name="AB04">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="56" name="AB05">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="57" name="AB06">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="58" name="AB07">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="59" name="AB08">
<text category="letter">,</text>
<text category="letter"></text>
</key>
<key keycode="60" name="AB09">
<text category="letter">.</text>
<text category="letter"></text>
</key>
<key keycode="61" name="AB10">
<text category="letter"></text>
<text category="letter"></text>
</key>
</symbols>

View File

@ -0,0 +1,193 @@
<?xml version="1.0"?>
<symbols version="0.90">
<include>us</include>
<key keycode="49" name="TLDE">
<keysym keyval="96">quoteleft</keysym>
<text category="letter">ً</text>
</key>
<key keycode="10" name="AE01">
<text category="letter">۱</text>
<text category="letter">!</text>
</key>
<key keycode="11" name="AE02">
<text category="letter">۲</text>
<text category="letter">@</text>
</key>
<key keycode="12" name="AE03">
<text category="letter">۳</text>
<text category="letter">#</text>
</key>
<key keycode="13" name="AE04">
<text category="letter">۴</text>
<text category="letter">$</text>
</key>
<key keycode="14" name="AE05">
<text category="letter">۵</text>
<text category="letter">%</text>
<keysym keyval="8364">EuroSign</keysym>
</key>
<key keycode="15" name="AE06">
<text category="letter">۶</text>
<text category="letter">^</text>
</key>
<key keycode="16" name="AE07">
<text category="letter">۷</text>
<text category="letter">&amp;</text>
</key>
<key keycode="17" name="AE08">
<text category="letter">۸</text>
<text category="letter">*</text>
</key>
<key keycode="18" name="AE09">
<text category="letter">۹</text>
<text category="letter">)</text>
</key>
<key keycode="19" name="AE10">
<text category="letter">۰</text>
<text category="letter">(</text>
</key>
<key keycode="20" name="AE11">
<text category="letter">-</text>
<text category="letter">ّ</text>
</key>
<key keycode="21" name="AE12">
<text category="letter">=</text>
<text category="letter">+</text>
</key>
<key keycode="24" name="AD01">
<text category="letter">ق</text>
<text category="letter"></text>
</key>
<key keycode="25" name="AD02">
<text category="letter">و</text>
<text category="letter">ؤ</text>
</key>
<key keycode="26" name="AD03">
<text category="letter">ع</text>
<text category="letter">ئ</text>
</key>
<key keycode="27" name="AD04">
<text category="letter">ر</text>
<text category="letter">ڑ</text>
</key>
<key keycode="28" name="AD05">
<text category="letter">ت</text>
<text category="letter">ٹ</text>
</key>
<key keycode="29" name="AD06">
<text category="letter">ے</text>
<text category="letter">؁</text>
</key>
<key keycode="30" name="AD07">
<text category="letter">ء</text>
<text category="letter">،</text>
</key>
<key keycode="31" name="AD08">
<text category="letter">ی</text>
<text category="letter">ۆ</text>
</key>
<key keycode="32" name="AD09">
<text category="letter">ہ</text>
<text category="letter">ۃ</text>
</key>
<key keycode="33" name="AD10">
<text category="letter">پ</text>
<text category="letter">إ</text>
</key>
<key keycode="34" name="AD11">
<text category="letter">]</text>
<text category="letter">ٰ</text>
</key>
<key keycode="35" name="AD12">
<text category="letter">[</text>
<text category="letter">ٰ</text>
</key>
<key keycode="51" name="BKSL">
<text category="letter">؎</text>
<text category="letter">أ</text>
</key>
<key keycode="38" name="AC01">
<text category="letter">ا</text>
<text category="letter">آ</text>
</key>
<key keycode="39" name="AC02">
<text category="letter">س</text>
<text category="letter">ش</text>
</key>
<key keycode="40" name="AC03">
<text category="letter">د</text>
<text category="letter">ڈ</text>
</key>
<key keycode="41" name="AC04">
<text category="letter">ف</text>
<text category="letter">ُ</text>
</key>
<key keycode="42" name="AC05">
<text category="letter">گ</text>
<text category="letter">غ</text>
</key>
<key keycode="43" name="AC06">
<text category="letter">ھ</text>
<text category="letter">ح</text>
</key>
<key keycode="44" name="AC07">
<text category="letter">ج</text>
<text category="letter">ژ</text>
</key>
<key keycode="45" name="AC08">
<text category="letter">ک</text>
<text category="letter">خ</text>
</key>
<key keycode="46" name="AC09">
<text category="letter">ل</text>
<text category="letter">ؓ</text>
</key>
<key keycode="47" name="AC10">
<text category="letter">؛</text>
<text category="letter">:</text>
</key>
<key keycode="48" name="AC11">
<keysym keyval="39">quoteright</keysym>
<text category="letter">&quot;</text>
</key>
<key keycode="52" name="AB01">
<text category="letter">ز</text>
<text category="letter">ذ</text>
</key>
<key keycode="53" name="AB02">
<text category="letter">ص</text>
<text category="letter">ض</text>
</key>
<key keycode="54" name="AB03">
<text category="letter">چ</text>
<text category="letter">ث</text>
</key>
<key keycode="55" name="AB04">
<text category="letter">ط</text>
<text category="letter">ظ</text>
</key>
<key keycode="56" name="AB05">
<text category="letter">ب</text>
<text category="letter">أ</text>
</key>
<key keycode="57" name="AB06">
<text category="letter">ن</text>
<text category="letter">ں</text>
</key>
<key keycode="58" name="AB07">
<text category="letter">م</text>
<text category="letter">ٔ</text>
</key>
<key keycode="59" name="AB08">
<text category="letter">،</text>
<text category="letter">ِ</text>
</key>
<key keycode="60" name="AB09">
<text category="letter">۔</text>
<text category="letter">َ</text>
</key>
<key keycode="61" name="AB10">
<text category="letter">/</text>
<text category="letter">؟</text>
</key>
</symbols>

View File

@ -0,0 +1,193 @@
<?xml version="1.0"?>
<symbols version="0.90">
<include>us</include>
<key keycode="49" name="TLDE">
<keysym keyval="96">quoteleft</keysym>
<text category="letter"></text>
</key>
<key keycode="10" name="AE01">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="11" name="AE02">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="12" name="AE03">
<text category="letter"></text>
<text category="letter">#</text>
</key>
<key keycode="13" name="AE04">
<text category="letter"></text>
<text category="letter">$</text>
</key>
<key keycode="14" name="AE05">
<text category="letter"></text>
<text category="letter">ज्ञ</text>
<keysym keyval="8364">EuroSign</keysym>
</key>
<key keycode="15" name="AE06">
<text category="letter"></text>
<text category="letter">त्र</text>
</key>
<key keycode="16" name="AE07">
<text category="letter"></text>
<text category="letter">क्ष</text>
</key>
<key keycode="17" name="AE08">
<text category="letter"></text>
<text category="letter">श्र</text>
</key>
<key keycode="18" name="AE09">
<text category="letter"></text>
<text category="letter">(</text>
</key>
<key keycode="19" name="AE10">
<text category="letter"></text>
<text category="letter">)</text>
</key>
<key keycode="20" name="AE11">
<text category="letter">-</text>
<text category="letter"></text>
</key>
<key keycode="21" name="AE12">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="24" name="AD01">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="25" name="AD02">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="26" name="AD03">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="27" name="AD04">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="28" name="AD05">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="29" name="AD06">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="30" name="AD07">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="31" name="AD08">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="32" name="AD09">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="33" name="AD10">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="34" name="AD11">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="35" name="AD12">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="51" name="BKSL">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="38" name="AC01">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="39" name="AC02">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="40" name="AC03">
<text category="letter">्‌</text>
<text category="letter"></text>
</key>
<key keycode="41" name="AC04">
<text category="letter">ि</text>
<text category="letter"></text>
</key>
<key keycode="42" name="AC05">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="43" name="AC06">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="44" name="AC07">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="45" name="AC08">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="46" name="AC09">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="47" name="AC10">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="48" name="AC11">
<keysym keyval="39">quoteright</keysym>
<text category="letter"></text>
</key>
<key keycode="52" name="AB01">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="53" name="AB02">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="54" name="AB03">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="55" name="AB04">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="56" name="AB05">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="57" name="AB06">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="58" name="AB07">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="59" name="AB08">
<text category="letter">,</text>
<text category="letter"></text>
</key>
<key keycode="60" name="AB09">
<text category="letter">.</text>
<text category="letter"></text>
</key>
<key keycode="61" name="AB10">
<text category="letter"></text>
<text category="letter"></text>
</key>
</symbols>

View File

@ -0,0 +1,193 @@
<?xml version="1.0"?>
<symbols version="0.90">
<include>us</include>
<key keycode="49" name="TLDE">
<keysym keyval="96">quoteleft</keysym>
<text category="letter"></text>
</key>
<key keycode="10" name="AE01">
<text category="letter"></text>
<text category="letter">!</text>
</key>
<key keycode="11" name="AE02">
<text category="letter"></text>
<text category="letter">@</text>
</key>
<key keycode="12" name="AE03">
<text category="letter"></text>
<text category="letter">്ര</text>
</key>
<key keycode="13" name="AE04">
<text category="letter"></text>
<text category="letter">$</text>
</key>
<key keycode="14" name="AE05">
<text category="letter"></text>
<text category="letter">%</text>
<keysym keyval="8364">EuroSign</keysym>
</key>
<key keycode="15" name="AE06">
<text category="letter"></text>
<text category="letter">^</text>
</key>
<key keycode="16" name="AE07">
<text category="letter"></text>
<text category="letter">ക്ഷ</text>
</key>
<key keycode="17" name="AE08">
<text category="letter"></text>
<text category="letter">*</text>
</key>
<key keycode="18" name="AE09">
<text category="letter"></text>
<text category="letter">(</text>
</key>
<key keycode="19" name="AE10">
<text category="letter"></text>
<text category="letter">)</text>
</key>
<key keycode="20" name="AE11">
<text category="letter">-</text>
<text category="letter"></text>
</key>
<key keycode="21" name="AE12">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="24" name="AD01">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="25" name="AD02">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="26" name="AD03">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="27" name="AD04">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="28" name="AD05">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="29" name="AD06">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="30" name="AD07">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="31" name="AD08">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="32" name="AD09">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="33" name="AD10">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="34" name="AD11">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="35" name="AD12">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="51" name="BKSL">
<text category="letter"></text>
<text category="letter">|</text>
</key>
<key keycode="38" name="AC01">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="39" name="AC02">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="40" name="AC03">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="41" name="AC04">
<text category="letter">ി</text>
<text category="letter"></text>
</key>
<key keycode="42" name="AC05">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="43" name="AC06">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="44" name="AC07">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="45" name="AC08">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="46" name="AC09">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="47" name="AC10">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="48" name="AC11">
<keysym keyval="39">quoteright</keysym>
<text category="letter"></text>
</key>
<key keycode="52" name="AB01">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="53" name="AB02">
<text category="letter"></text>
<text category="letter">X</text>
</key>
<key keycode="54" name="AB03">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="55" name="AB04">
<text category="letter"></text>
<text category="letter">V</text>
</key>
<key keycode="56" name="AB05">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="57" name="AB06">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="58" name="AB07">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="59" name="AB08">
<text category="letter">,</text>
<text category="letter"></text>
</key>
<key keycode="60" name="AB09">
<text category="letter">.</text>
<text category="letter">&gt;</text>
</key>
<key keycode="61" name="AB10">
<text category="letter"></text>
<keysym keyval="63">question</keysym>
</key>
</symbols>

View File

@ -0,0 +1,193 @@
<?xml version="1.0"?>
<symbols version="0.90">
<include>us</include>
<key keycode="49" name="TLDE">
<keysym keyval="96">quoteleft</keysym>
<text category="letter"></text>
</key>
<key keycode="10" name="AE01">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="11" name="AE02">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="12" name="AE03">
<text category="letter"></text>
<text category="letter">#</text>
</key>
<key keycode="13" name="AE04">
<text category="letter"></text>
<text category="letter">$</text>
</key>
<key keycode="14" name="AE05">
<text category="letter"></text>
<text category="letter">ज्ञ</text>
<keysym keyval="8364">EuroSign</keysym>
</key>
<key keycode="15" name="AE06">
<text category="letter"></text>
<text category="letter">त्र</text>
</key>
<key keycode="16" name="AE07">
<text category="letter"></text>
<text category="letter">क्ष</text>
</key>
<key keycode="17" name="AE08">
<text category="letter"></text>
<text category="letter">श्र</text>
</key>
<key keycode="18" name="AE09">
<text category="letter"></text>
<text category="letter">(</text>
</key>
<key keycode="19" name="AE10">
<text category="letter"></text>
<text category="letter">)</text>
</key>
<key keycode="20" name="AE11">
<text category="letter">-</text>
<text category="letter"></text>
</key>
<key keycode="21" name="AE12">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="24" name="AD01">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="25" name="AD02">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="26" name="AD03">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="27" name="AD04">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="28" name="AD05">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="29" name="AD06">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="30" name="AD07">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="31" name="AD08">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="32" name="AD09">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="33" name="AD10">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="34" name="AD11">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="35" name="AD12">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="51" name="BKSL">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="38" name="AC01">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="39" name="AC02">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="40" name="AC03">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="41" name="AC04">
<text category="letter">ि</text>
<text category="letter"></text>
</key>
<key keycode="42" name="AC05">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="43" name="AC06">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="44" name="AC07">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="45" name="AC08">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="46" name="AC09">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="47" name="AC10">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="48" name="AC11">
<keysym keyval="39">quoteright</keysym>
<text category="letter"></text>
</key>
<key keycode="52" name="AB01">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="53" name="AB02">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="54" name="AB03">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="55" name="AB04">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="56" name="AB05">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="57" name="AB06">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="58" name="AB07">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="59" name="AB08">
<text category="letter">,</text>
<text category="letter"></text>
</key>
<key keycode="60" name="AB09">
<text category="letter">.</text>
<text category="letter"></text>
</key>
<key keycode="61" name="AB10">
<text category="letter"></text>
<text category="letter"></text>
</key>
</symbols>

View File

@ -0,0 +1,193 @@
<?xml version="1.0"?>
<symbols version="0.90">
<include>us</include>
<key keycode="49" name="TLDE">
<keysym keyval="96">quoteleft</keysym>
<keysym keyval="126">asciitilde</keysym>
</key>
<key keycode="10" name="AE01">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="11" name="AE02">
<text category="letter"></text>
<keysym keyval="64">at</keysym>
</key>
<key keycode="12" name="AE03">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="13" name="AE04">
<text category="letter"></text>
<keysym keyval="36">dollar</keysym>
</key>
<key keycode="14" name="AE05">
<text category="letter"></text>
<keysym keyval="37">percent</keysym>
<keysym keyval="8364">EuroSign</keysym>
</key>
<key keycode="15" name="AE06">
<text category="letter"></text>
<keysym keyval="94">asciicircum</keysym>
</key>
<key keycode="16" name="AE07">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="17" name="AE08">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="18" name="AE09">
<text category="letter"></text>
<keysym keyval="40">parenleft</keysym>
</key>
<key keycode="19" name="AE10">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="20" name="AE11">
<keysym keyval="45">minus</keysym>
<keysym keyval="95">underscore</keysym>
</key>
<key keycode="21" name="AE12">
<keysym keyval="61">equal</keysym>
<keysym keyval="43">plus</keysym>
</key>
<key keycode="24" name="AD01">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="25" name="AD02">
<text category="letter"></text>
<keysym keyval="87">W</keysym>
</key>
<key keycode="26" name="AD03">
<text category="letter"></text>
<keysym keyval="69">E</keysym>
</key>
<key keycode="27" name="AD04">
<text category="letter"></text>
<keysym keyval="82">R</keysym>
</key>
<key keycode="28" name="AD05">
<text category="letter"></text>
<keysym keyval="84">T</keysym>
</key>
<key keycode="29" name="AD06">
<text category="letter"></text>
<keysym keyval="89">Y</keysym>
</key>
<key keycode="30" name="AD07">
<text category="letter">က</text>
<keysym keyval="85">U</keysym>
</key>
<key keycode="31" name="AD08">
<text category="letter"></text>
<keysym keyval="73">I</keysym>
</key>
<key keycode="32" name="AD09">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="33" name="AD10">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="34" name="AD11">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="35" name="AD12">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="51" name="BKSL">
<text category="letter"></text>
<keysym keyval="124">bar</keysym>
</key>
<key keycode="38" name="AC01">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="39" name="AC02">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="40" name="AC03">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="41" name="AC04">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="42" name="AC05">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="43" name="AC06">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="44" name="AC07">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="45" name="AC08">
<text category="letter"></text>
<keysym keyval="75">K</keysym>
</key>
<key keycode="46" name="AC09">
<text category="letter"></text>
<keysym keyval="76">L</keysym>
</key>
<key keycode="47" name="AC10">
<text category="letter"></text>
<keysym keyval="58">colon</keysym>
</key>
<key keycode="48" name="AC11">
<keysym keyval="39">quoteright</keysym>
<text category="letter"></text>
</key>
<key keycode="52" name="AB01">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="53" name="AB02">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="54" name="AB03">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="55" name="AB04">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="56" name="AB05">
<text category="letter"></text>
<keysym keyval="66">B</keysym>
</key>
<key keycode="57" name="AB06">
<text category="letter"></text>
<keysym keyval="78">N</keysym>
</key>
<key keycode="58" name="AB07">
<text category="letter"></text>
<keysym keyval="77">M</keysym>
</key>
<key keycode="59" name="AB08">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="60" name="AB09">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="61" name="AB10">
<text category="letter"></text>
<keysym keyval="63">question</keysym>
</key>
</symbols>

View File

@ -0,0 +1,193 @@
<?xml version="1.0"?>
<symbols version="0.90">
<include>us</include>
<key keycode="49" name="TLDE">
<keysym keyval="96">quoteleft</keysym>
<text category="letter"></text>
</key>
<key keycode="10" name="AE01">
<text category="letter"></text>
<text category="letter">!</text>
</key>
<key keycode="11" name="AE02">
<text category="letter"></text>
<text category="letter">@</text>
</key>
<key keycode="12" name="AE03">
<text category="letter"></text>
<text category="letter">୍ର</text>
</key>
<key keycode="13" name="AE04">
<text category="letter"></text>
<text category="letter">ର୍</text>
</key>
<key keycode="14" name="AE05">
<text category="letter"></text>
<text category="letter">ଜ୍ଞ</text>
<keysym keyval="8364">EuroSign</keysym>
</key>
<key keycode="15" name="AE06">
<text category="letter"></text>
<text category="letter">ତ୍ର</text>
</key>
<key keycode="16" name="AE07">
<text category="letter"></text>
<text category="letter">କ୍ଷ</text>
</key>
<key keycode="17" name="AE08">
<text category="letter"></text>
<text category="letter">ଶ୍ର</text>
</key>
<key keycode="18" name="AE09">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="19" name="AE10">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="20" name="AE11">
<text category="letter">-</text>
<text category="letter"></text>
</key>
<key keycode="21" name="AE12">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="24" name="AD01">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="25" name="AD02">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="26" name="AD03">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="27" name="AD04">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="28" name="AD05">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="29" name="AD06">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="30" name="AD07">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="31" name="AD08">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="32" name="AD09">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="33" name="AD10">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="34" name="AD11">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="35" name="AD12">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="51" name="BKSL">
<text category="letter">\</text>
<text category="letter">|</text>
</key>
<key keycode="38" name="AC01">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="39" name="AC02">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="40" name="AC03">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="41" name="AC04">
<text category="letter">ି</text>
<text category="letter"></text>
</key>
<key keycode="42" name="AC05">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="43" name="AC06">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="44" name="AC07">
<text category="letter"></text>
<text category="letter">J</text>
</key>
<key keycode="45" name="AC08">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="46" name="AC09">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="47" name="AC10">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="48" name="AC11">
<keysym keyval="39">quoteright</keysym>
<text category="letter"></text>
</key>
<key keycode="52" name="AB01">
<text category="letter">z</text>
<text category="letter">Z</text>
</key>
<key keycode="53" name="AB02">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="54" name="AB03">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="55" name="AB04">
<text category="letter"></text>
<text category="letter">V</text>
</key>
<key keycode="56" name="AB05">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="57" name="AB06">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="58" name="AB07">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="59" name="AB08">
<text category="letter">,</text>
<text category="letter"></text>
</key>
<key keycode="60" name="AB09">
<text category="letter">.</text>
<text category="letter"></text>
</key>
<key keycode="61" name="AB10">
<text category="letter"></text>
<text category="letter"></text>
</key>
</symbols>

View File

@ -0,0 +1,193 @@
<?xml version="1.0"?>
<symbols version="0.90">
<include>us</include>
<key keycode="49" name="TLDE">
<keysym keyval="96">quoteleft</keysym>
<keysym keyval="126">asciitilde</keysym>
</key>
<key keycode="10" name="AE01">
<text category="letter"></text>
<keysym keyval="33">exclam</keysym>
</key>
<key keycode="11" name="AE02">
<text category="letter"></text>
<keysym keyval="64">at</keysym>
</key>
<key keycode="12" name="AE03">
<text category="letter"></text>
<keysym keyval="35">numbersign</keysym>
</key>
<key keycode="13" name="AE04">
<text category="letter"></text>
<keysym keyval="36">dollar</keysym>
</key>
<key keycode="14" name="AE05">
<text category="letter"></text>
<keysym keyval="37">percent</keysym>
<keysym keyval="8364">EuroSign</keysym>
</key>
<key keycode="15" name="AE06">
<text category="letter"></text>
<keysym keyval="94">asciicircum</keysym>
</key>
<key keycode="16" name="AE07">
<text category="letter"></text>
<keysym keyval="38">ampersand</keysym>
</key>
<key keycode="17" name="AE08">
<text category="letter"></text>
<keysym keyval="42">asterisk</keysym>
</key>
<key keycode="18" name="AE09">
<text category="letter"></text>
<keysym keyval="40">parenleft</keysym>
</key>
<key keycode="19" name="AE10">
<text category="letter"></text>
<keysym keyval="41">parenright</keysym>
</key>
<key keycode="20" name="AE11">
<text category="letter">-</text>
<text category="letter">_</text>
</key>
<key keycode="21" name="AE12">
<text category="letter">=</text>
<text category="letter">+</text>
</key>
<key keycode="24" name="AD01">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="25" name="AD02">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="26" name="AD03">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="27" name="AD04">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="28" name="AD05">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="29" name="AD06">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="30" name="AD07">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="31" name="AD08">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="32" name="AD09">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="33" name="AD10">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="34" name="AD11">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="35" name="AD12">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="51" name="BKSL">
<text category="letter">\</text>
<text category="letter"></text>
</key>
<key keycode="38" name="AC01">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="39" name="AC02">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="40" name="AC03">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="41" name="AC04">
<text category="letter">ਿ</text>
<text category="letter"></text>
</key>
<key keycode="42" name="AC05">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="43" name="AC06">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="44" name="AC07">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="45" name="AC08">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="46" name="AC09">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="47" name="AC10">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="48" name="AC11">
<keysym keyval="39">quoteright</keysym>
<text category="letter"></text>
</key>
<key keycode="52" name="AB01">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="53" name="AB02">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="54" name="AB03">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="55" name="AB04">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="56" name="AB05">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="57" name="AB06">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="58" name="AB07">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="59" name="AB08">
<text category="letter">,</text>
<text category="letter"></text>
</key>
<key keycode="60" name="AB09">
<text category="letter">.</text>
<text category="letter"></text>
</key>
<key keycode="61" name="AB10">
<text category="letter"></text>
<text category="letter">?</text>
</key>
</symbols>

View File

@ -0,0 +1,193 @@
<?xml version="1.0"?>
<symbols version="0.90">
<include>us</include>
<key keycode="49" name="TLDE">
<keysym keyval="96">quoteleft</keysym>
<text category="letter">Ё</text>
</key>
<key keycode="10" name="AE01">
<keysym keyval="49">1</keysym>
<text category="letter">!</text>
</key>
<key keycode="11" name="AE02">
<keysym keyval="50">2</keysym>
<text category="letter">&quot;</text>
</key>
<key keycode="12" name="AE03">
<keysym keyval="51">3</keysym>
<text category="letter"></text>
</key>
<key keycode="13" name="AE04">
<keysym keyval="52">4</keysym>
<text category="letter">;</text>
</key>
<key keycode="14" name="AE05">
<keysym keyval="53">5</keysym>
<text category="letter">%</text>
<keysym keyval="8364">EuroSign</keysym>
</key>
<key keycode="15" name="AE06">
<keysym keyval="54">6</keysym>
<text category="letter">:</text>
</key>
<key keycode="16" name="AE07">
<keysym keyval="55">7</keysym>
<text category="letter">?</text>
</key>
<key keycode="17" name="AE08">
<keysym keyval="56">8</keysym>
<text category="letter">*</text>
</key>
<key keycode="18" name="AE09">
<keysym keyval="57">9</keysym>
<text category="letter">(</text>
</key>
<key keycode="19" name="AE10">
<keysym keyval="48">0</keysym>
<text category="letter">)</text>
</key>
<key keycode="20" name="AE11">
<keysym keyval="45">minus</keysym>
<text category="letter">_</text>
</key>
<key keycode="21" name="AE12">
<keysym keyval="61">equal</keysym>
<text category="letter">+</text>
</key>
<key keycode="24" name="AD01">
<text category="letter">й</text>
<text category="letter">Й</text>
</key>
<key keycode="25" name="AD02">
<text category="letter">ц</text>
<text category="letter">Ц</text>
</key>
<key keycode="26" name="AD03">
<text category="letter">у</text>
<text category="letter">У</text>
</key>
<key keycode="27" name="AD04">
<text category="letter">к</text>
<text category="letter">К</text>
</key>
<key keycode="28" name="AD05">
<text category="letter">е</text>
<text category="letter">Е</text>
</key>
<key keycode="29" name="AD06">
<text category="letter">н</text>
<text category="letter">Н</text>
</key>
<key keycode="30" name="AD07">
<text category="letter">г</text>
<text category="letter">Г</text>
</key>
<key keycode="31" name="AD08">
<text category="letter">ш</text>
<text category="letter">Ш</text>
</key>
<key keycode="32" name="AD09">
<text category="letter">щ</text>
<text category="letter">Щ</text>
</key>
<key keycode="33" name="AD10">
<text category="letter">з</text>
<text category="letter">З</text>
</key>
<key keycode="34" name="AD11">
<text category="letter">х</text>
<text category="letter">Х</text>
</key>
<key keycode="35" name="AD12">
<text category="letter">ъ</text>
<text category="letter">Ъ</text>
</key>
<key keycode="51" name="BKSL">
<text category="letter">\</text>
<text category="letter">|</text>
</key>
<key keycode="38" name="AC01">
<text category="letter">ф</text>
<text category="letter">Ф</text>
</key>
<key keycode="39" name="AC02">
<text category="letter">ы</text>
<text category="letter">Ы</text>
</key>
<key keycode="40" name="AC03">
<text category="letter">в</text>
<text category="letter">В</text>
</key>
<key keycode="41" name="AC04">
<text category="letter">а</text>
<text category="letter">А</text>
</key>
<key keycode="42" name="AC05">
<text category="letter">п</text>
<text category="letter">П</text>
</key>
<key keycode="43" name="AC06">
<text category="letter">р</text>
<text category="letter">Р</text>
</key>
<key keycode="44" name="AC07">
<text category="letter">о</text>
<text category="letter">О</text>
</key>
<key keycode="45" name="AC08">
<text category="letter">л</text>
<text category="letter">Л</text>
</key>
<key keycode="46" name="AC09">
<text category="letter">д</text>
<text category="letter">Д</text>
</key>
<key keycode="47" name="AC10">
<text category="letter">ж</text>
<text category="letter">Ж</text>
</key>
<key keycode="48" name="AC11">
<keysym keyval="39">quoteright</keysym>
<text category="letter">Э</text>
</key>
<key keycode="52" name="AB01">
<text category="letter">я</text>
<text category="letter">Я</text>
</key>
<key keycode="53" name="AB02">
<text category="letter">ч</text>
<text category="letter">Ч</text>
</key>
<key keycode="54" name="AB03">
<text category="letter">с</text>
<text category="letter">С</text>
</key>
<key keycode="55" name="AB04">
<text category="letter">м</text>
<text category="letter">М</text>
</key>
<key keycode="56" name="AB05">
<text category="letter">и</text>
<text category="letter">И</text>
</key>
<key keycode="57" name="AB06">
<text category="letter">т</text>
<text category="letter">Т</text>
</key>
<key keycode="58" name="AB07">
<text category="letter">ь</text>
<text category="letter">Ь</text>
</key>
<key keycode="59" name="AB08">
<text category="letter">б</text>
<text category="letter">Б</text>
</key>
<key keycode="60" name="AB09">
<text category="letter">ю</text>
<text category="letter">Ю</text>
</key>
<key keycode="61" name="AB10">
<text category="letter">.</text>
<text category="letter">,</text>
</key>
</symbols>

View File

@ -0,0 +1,193 @@
<?xml version="1.0"?>
<symbols version="0.90">
<include>us</include>
<key keycode="49" name="TLDE">
<keysym keyval="96">quoteleft</keysym>
<text category="letter"></text>
</key>
<key keycode="10" name="AE01">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="11" name="AE02">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="12" name="AE03">
<text category="letter"></text>
<text category="letter">#</text>
</key>
<key keycode="13" name="AE04">
<text category="letter"></text>
<text category="letter">$</text>
</key>
<key keycode="14" name="AE05">
<text category="letter"></text>
<text category="letter">ज्ञ</text>
<keysym keyval="8364">EuroSign</keysym>
</key>
<key keycode="15" name="AE06">
<text category="letter"></text>
<text category="letter">त्र</text>
</key>
<key keycode="16" name="AE07">
<text category="letter"></text>
<text category="letter">क्ष</text>
</key>
<key keycode="17" name="AE08">
<text category="letter"></text>
<text category="letter">श्र</text>
</key>
<key keycode="18" name="AE09">
<text category="letter"></text>
<text category="letter">(</text>
</key>
<key keycode="19" name="AE10">
<text category="letter"></text>
<text category="letter">)</text>
</key>
<key keycode="20" name="AE11">
<text category="letter">-</text>
<text category="letter"></text>
</key>
<key keycode="21" name="AE12">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="24" name="AD01">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="25" name="AD02">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="26" name="AD03">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="27" name="AD04">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="28" name="AD05">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="29" name="AD06">
<text category="letter">ॿ</text>
<text category="letter"></text>
</key>
<key keycode="30" name="AD07">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="31" name="AD08">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="32" name="AD09">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="33" name="AD10">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="34" name="AD11">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="35" name="AD12">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="51" name="BKSL">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="38" name="AC01">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="39" name="AC02">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="40" name="AC03">
<text category="letter">्‌</text>
<text category="letter"></text>
</key>
<key keycode="41" name="AC04">
<text category="letter">ि</text>
<text category="letter"></text>
</key>
<key keycode="42" name="AC05">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="43" name="AC06">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="44" name="AC07">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="45" name="AC08">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="46" name="AC09">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="47" name="AC10">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="48" name="AC11">
<keysym keyval="39">quoteright</keysym>
<text category="letter"></text>
</key>
<key keycode="52" name="AB01">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="53" name="AB02">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="54" name="AB03">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="55" name="AB04">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="56" name="AB05">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="57" name="AB06">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="58" name="AB07">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="59" name="AB08">
<text category="letter">,</text>
<text category="letter"></text>
</key>
<key keycode="60" name="AB09">
<text category="letter">.</text>
<text category="letter"></text>
</key>
<key keycode="61" name="AB10">
<text category="letter"></text>
<text category="letter"></text>
</key>
</symbols>

View File

@ -0,0 +1,193 @@
<?xml version="1.0"?>
<symbols version="0.90">
<include>us</include>
<key keycode="49" name="TLDE">
<keysym keyval="96">quoteleft</keysym>
<text category="letter"></text>
</key>
<key keycode="10" name="AE01">
<text category="letter">1</text>
<text category="letter">!</text>
</key>
<key keycode="11" name="AE02">
<text category="letter">2</text>
<text category="letter">@</text>
</key>
<key keycode="12" name="AE03">
<text category="letter">3</text>
<text category="letter">#</text>
</key>
<key keycode="13" name="AE04">
<text category="letter">4</text>
<text category="letter">$</text>
</key>
<key keycode="14" name="AE05">
<text category="letter">5</text>
<text category="letter">%</text>
<keysym keyval="8364">EuroSign</keysym>
</key>
<key keycode="15" name="AE06">
<text category="letter">6</text>
<text category="letter">^</text>
</key>
<key keycode="16" name="AE07">
<text category="letter">7</text>
<text category="letter">க்ஷ</text>
</key>
<key keycode="17" name="AE08">
<text category="letter">8</text>
<text category="letter">ஷ்ர</text>
</key>
<key keycode="18" name="AE09">
<text category="letter">9</text>
<text category="letter">(</text>
</key>
<key keycode="19" name="AE10">
<text category="letter">0</text>
<text category="letter">)</text>
</key>
<key keycode="20" name="AE11">
<text category="letter">-</text>
<text category="letter"></text>
</key>
<key keycode="21" name="AE12">
<text category="letter">=</text>
<text category="letter">+</text>
</key>
<key keycode="24" name="AD01">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="25" name="AD02">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="26" name="AD03">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="27" name="AD04">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="28" name="AD05">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="29" name="AD06">
<text category="letter">y</text>
<text category="letter">Y</text>
</key>
<key keycode="30" name="AD07">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="31" name="AD08">
<text category="letter">i</text>
<text category="letter">I</text>
</key>
<key keycode="32" name="AD09">
<text category="letter">o</text>
<text category="letter">O</text>
</key>
<key keycode="33" name="AD10">
<text category="letter"></text>
<text category="letter">P</text>
</key>
<key keycode="34" name="AD11">
<text category="letter">[</text>
<text category="letter">{</text>
</key>
<key keycode="35" name="AD12">
<text category="letter">]</text>
<text category="letter"></text>
</key>
<key keycode="51" name="BKSL">
<text category="letter">\</text>
<text category="letter">|</text>
</key>
<key keycode="38" name="AC01">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="39" name="AC02">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="40" name="AC03">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="41" name="AC04">
<text category="letter">ி</text>
<text category="letter"></text>
</key>
<key keycode="42" name="AC05">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="43" name="AC06">
<text category="letter"></text>
<text category="letter">H</text>
</key>
<key keycode="44" name="AC07">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="45" name="AC08">
<text category="letter"></text>
<text category="letter">K</text>
</key>
<key keycode="46" name="AC09">
<text category="letter"></text>
<text category="letter">L</text>
</key>
<key keycode="47" name="AC10">
<text category="letter"></text>
<text category="letter">:</text>
</key>
<key keycode="48" name="AC11">
<keysym keyval="39">quoteright</keysym>
<text category="letter">&quot;</text>
</key>
<key keycode="52" name="AB01">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="53" name="AB02">
<text category="letter">x</text>
<text category="letter">X</text>
</key>
<key keycode="54" name="AB03">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="55" name="AB04">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="56" name="AB05">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="57" name="AB06">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="58" name="AB07">
<text category="letter"></text>
<text category="letter">M</text>
</key>
<key keycode="59" name="AB08">
<text category="letter">,</text>
<text category="letter"></text>
</key>
<key keycode="60" name="AB09">
<text category="letter">.</text>
<text category="letter">&gt;</text>
</key>
<key keycode="61" name="AB10">
<text category="letter"></text>
<keysym keyval="63">question</keysym>
</key>
</symbols>

View File

@ -0,0 +1,194 @@
<?xml version="1.0"?>
<symbols version="0.90">
<include>us</include>
<key keycode="49" name="TLDE">
<keysym keyval="96">quoteleft</keysym>
<text category="letter"></text>
</key>
<key keycode="10" name="AE01">
<text category="letter"></text>
<text category="letter">!</text>
</key>
<key keycode="11" name="AE02">
<text category="letter"></text>
<text category="letter">@</text>
</key>
<key keycode="12" name="AE03">
<text category="letter"></text>
<text category="letter">#</text>
</key>
<key keycode="13" name="AE04">
<text category="letter"></text>
<text category="letter">$</text>
</key>
<key keycode="14" name="AE05">
<text category="letter"></text>
<text category="letter">జ్ఞ</text>
<keysym keyval="8364">EuroSign</keysym>
</key>
<key keycode="15" name="AE06">
<text category="letter"></text>
<text category="letter">త్ర</text>
</key>
<key keycode="16" name="AE07">
<text category="letter"></text>
<text category="letter">క్ష</text>
</key>
<key keycode="17" name="AE08">
<text category="letter"></text>
<text category="letter">శ్ర</text>
</key>
<key keycode="18" name="AE09">
<text category="letter"></text>
<text category="letter">(</text>
</key>
<key keycode="19" name="AE10">
<text category="letter"></text>
<text category="letter">)</text>
</key>
<key keycode="20" name="AE11">
<text category="letter">-</text>
<text category="letter">_</text>
</key>
<key keycode="21" name="AE12">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="24" name="AD01">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="25" name="AD02">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="26" name="AD03">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="27" name="AD04">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="28" name="AD05">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="29" name="AD06">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="30" name="AD07">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="31" name="AD08">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="32" name="AD09">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="33" name="AD10">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="34" name="AD11">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="35" name="AD12">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="51" name="BKSL">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="38" name="AC01">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="39" name="AC02">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="40" name="AC03">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="41" name="AC04">
<text category="letter">ి</text>
<text category="letter"></text>
</key>
<key keycode="42" name="AC05">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="43" name="AC06">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="44" name="AC07">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="45" name="AC08">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="46" name="AC09">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="47" name="AC10">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="48" name="AC11">
<keysym keyval="39">quoteright</keysym>
<text category="letter"></text>
</key>
<key keycode="52" name="AB01">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="53" name="AB02">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="54" name="AB03">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="55" name="AB04">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="56" name="AB05">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="57" name="AB06">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="58" name="AB07">
<text category="letter"></text>
<text category="letter"></text>
</key>
<key keycode="59" name="AB08">
<text category="letter">,</text>
<text category="letter"></text>
</key>
<key keycode="60" name="AB09">
<text category="letter">.</text>
<text category="letter">&gt;</text>
</key>
<key keycode="61" name="AB10">
<text category="letter"></text>
<text category="letter">?</text>
</key>
</symbols>

View File

@ -0,0 +1,192 @@
<?xml version="1.0"?>
<symbols version="0.90">
<include>us</include>
<key keycode="49" name="TLDE">
<keysym keyval="95">underscore</keysym>
<keysym keyval="37">percent</keysym>
</key>
<key keycode="10" name="AE01">
<keysym keyval="3557">Thai_lakkhangyao</keysym>
<keysym keyval="43">plus</keysym>
</key>
<key keycode="11" name="AE02">
<keysym keyval="47">slash</keysym>
<keysym keyval="3569">Thai_leknung</keysym>
</key>
<key keycode="12" name="AE03">
<keysym keyval="45">minus</keysym>
<keysym keyval="3570">Thai_leksong</keysym>
</key>
<key keycode="13" name="AE04">
<keysym keyval="3520">Thai_phosamphao</keysym>
<keysym keyval="3571">Thai_leksam</keysym>
</key>
<key keycode="14" name="AE05">
<keysym keyval="3510">Thai_thothung</keysym>
<keysym keyval="3572">Thai_leksi</keysym>
</key>
<key keycode="15" name="AE06">
<keysym keyval="3544">Thai_sarau</keysym>
<keysym keyval="3545">Thai_sarauu</keysym>
</key>
<key keycode="16" name="AE07">
<keysym keyval="3542">Thai_saraue</keysym>
<keysym keyval="3551">Thai_baht</keysym>
</key>
<key keycode="17" name="AE08">
<keysym keyval="3492">Thai_khokhwai</keysym>
<keysym keyval="3573">Thai_lekha</keysym>
</key>
<key keycode="18" name="AE09">
<keysym keyval="3509">Thai_totao</keysym>
<keysym keyval="3574">Thai_lekhok</keysym>
</key>
<key keycode="19" name="AE10">
<keysym keyval="3496">Thai_chochan</keysym>
<keysym keyval="3575">Thai_lekchet</keysym>
</key>
<key keycode="20" name="AE11">
<keysym keyval="3490">Thai_khokhai</keysym>
<keysym keyval="3576">Thai_lekpaet</keysym>
</key>
<key keycode="21" name="AE12">
<keysym keyval="3498">Thai_chochang</keysym>
<keysym keyval="3577">Thai_lekkao</keysym>
</key>
<key keycode="24" name="AD01">
<keysym keyval="3558">Thai_maiyamok</keysym>
<keysym keyval="3568">Thai_leksun</keysym>
</key>
<key keycode="25" name="AD02">
<keysym keyval="3556">Thai_saraaimaimalai</keysym>
<keysym keyval="34">quotedbl</keysym>
</key>
<key keycode="26" name="AD03">
<keysym keyval="3539">Thai_saraam</keysym>
<keysym keyval="3502">Thai_dochada</keysym>
</key>
<key keycode="27" name="AD04">
<keysym keyval="3518">Thai_phophan</keysym>
<keysym keyval="3505">Thai_thonangmontho</keysym>
</key>
<key keycode="28" name="AD05">
<keysym keyval="3536">Thai_saraa</keysym>
<keysym keyval="3512">Thai_thothong</keysym>
</key>
<key keycode="29" name="AD06">
<keysym keyval="3537">Thai_maihanakat</keysym>
<keysym keyval="3565">Thai_nikhahit</keysym>
</key>
<key keycode="30" name="AD07">
<keysym keyval="3541">Thai_saraii</keysym>
<keysym keyval="3562">Thai_maitri</keysym>
</key>
<key keycode="31" name="AD08">
<keysym keyval="3523">Thai_rorua</keysym>
<keysym keyval="3507">Thai_nonen</keysym>
</key>
<key keycode="32" name="AD09">
<keysym keyval="3513">Thai_nonu</keysym>
<keysym keyval="3535">Thai_paiyannoi</keysym>
</key>
<key keycode="33" name="AD10">
<keysym keyval="3522">Thai_yoyak</keysym>
<keysym keyval="3501">Thai_yoying</keysym>
</key>
<key keycode="34" name="AD11">
<keysym keyval="3514">Thai_bobaimai</keysym>
<keysym keyval="3504">Thai_thothan</keysym>
</key>
<key keycode="35" name="AD12">
<keysym keyval="3525">Thai_loling</keysym>
<keysym keyval="44">comma</keysym>
</key>
<key keycode="51" name="BKSL">
<keysym keyval="3491">Thai_khokhuat</keysym>
<keysym keyval="3493">Thai_khokhon</keysym>
</key>
<key keycode="38" name="AC01">
<keysym keyval="3519">Thai_fofan</keysym>
<keysym keyval="3524">Thai_ru</keysym>
</key>
<key keycode="39" name="AC02">
<keysym keyval="3531">Thai_hohip</keysym>
<keysym keyval="3494">Thai_khorakhang</keysym>
</key>
<key keycode="40" name="AC03">
<keysym keyval="3489">Thai_kokai</keysym>
<keysym keyval="3503">Thai_topatak</keysym>
</key>
<key keycode="41" name="AC04">
<keysym keyval="3508">Thai_dodek</keysym>
<keysym keyval="3554">Thai_sarao</keysym>
</key>
<key keycode="42" name="AC05">
<keysym keyval="3552">Thai_sarae</keysym>
<keysym keyval="3500">Thai_chochoe</keysym>
</key>
<key keycode="43" name="AC06">
<keysym keyval="3561">Thai_maitho</keysym>
<keysym keyval="3559">Thai_maitaikhu</keysym>
</key>
<key keycode="44" name="AC07">
<keysym keyval="3560">Thai_maiek</keysym>
<keysym keyval="3563">Thai_maichattawa</keysym>
</key>
<key keycode="45" name="AC08">
<keysym keyval="3538">Thai_saraaa</keysym>
<keysym keyval="3529">Thai_sorusi</keysym>
</key>
<key keycode="46" name="AC09">
<keysym keyval="3530">Thai_sosua</keysym>
<keysym keyval="3528">Thai_sosala</keysym>
</key>
<key keycode="47" name="AC10">
<keysym keyval="3527">Thai_wowaen</keysym>
<keysym keyval="3499">Thai_soso</keysym>
</key>
<key keycode="48" name="AC11">
<keysym keyval="3495">Thai_ngongu</keysym>
<keysym keyval="46">period</keysym>
</key>
<key keycode="52" name="AB01">
<keysym keyval="3516">Thai_phophung</keysym>
<keysym keyval="40">parenleft</keysym>
</key>
<key keycode="53" name="AB02">
<keysym keyval="3515">Thai_popla</keysym>
<keysym keyval="41">parenright</keysym>
</key>
<key keycode="54" name="AB03">
<keysym keyval="3553">Thai_saraae</keysym>
<keysym keyval="3497">Thai_choching</keysym>
</key>
<key keycode="55" name="AB04">
<keysym keyval="3533">Thai_oang</keysym>
<keysym keyval="3534">Thai_honokhuk</keysym>
</key>
<key keycode="56" name="AB05">
<keysym keyval="3540">Thai_sarai</keysym>
<keysym keyval="3546">Thai_phinthu</keysym>
</key>
<key keycode="57" name="AB06">
<keysym keyval="3543">Thai_sarauee</keysym>
<keysym keyval="3564">Thai_thanthakhat</keysym>
</key>
<key keycode="58" name="AB07">
<keysym keyval="3511">Thai_thothahan</keysym>
<keysym keyval="63">question</keysym>
</key>
<key keycode="59" name="AB08">
<keysym keyval="3521">Thai_moma</keysym>
<keysym keyval="3506">Thai_thophuthao</keysym>
</key>
<key keycode="60" name="AB09">
<keysym keyval="3555">Thai_saraaimaimuan</keysym>
<keysym keyval="3532">Thai_lochula</keysym>
</key>
<key keycode="61" name="AB10">
<keysym keyval="3517">Thai_fofa</keysym>
<keysym keyval="3526">Thai_lu</keysym>
</key>
</symbols>

View File

@ -0,0 +1,193 @@
<?xml version="1.0"?>
<symbols version="0.90">
<include>us</include>
<key keycode="49" name="TLDE">
<keysym keyval="96">quoteleft</keysym>
<text category="letter">Ґ</text>
</key>
<key keycode="10" name="AE01">
<keysym keyval="49">1</keysym>
<text category="letter">!</text>
</key>
<key keycode="11" name="AE02">
<keysym keyval="50">2</keysym>
<text category="letter">&quot;</text>
</key>
<key keycode="12" name="AE03">
<keysym keyval="51">3</keysym>
<text category="letter"></text>
</key>
<key keycode="13" name="AE04">
<keysym keyval="52">4</keysym>
<text category="letter">;</text>
</key>
<key keycode="14" name="AE05">
<keysym keyval="53">5</keysym>
<text category="letter">%</text>
<keysym keyval="8364">EuroSign</keysym>
</key>
<key keycode="15" name="AE06">
<keysym keyval="54">6</keysym>
<text category="letter">:</text>
</key>
<key keycode="16" name="AE07">
<keysym keyval="55">7</keysym>
<text category="letter">?</text>
</key>
<key keycode="17" name="AE08">
<keysym keyval="56">8</keysym>
<text category="letter">*</text>
</key>
<key keycode="18" name="AE09">
<keysym keyval="57">9</keysym>
<text category="letter">(</text>
</key>
<key keycode="19" name="AE10">
<keysym keyval="48">0</keysym>
<text category="letter">)</text>
</key>
<key keycode="20" name="AE11">
<keysym keyval="45">minus</keysym>
<text category="letter">_</text>
</key>
<key keycode="21" name="AE12">
<keysym keyval="61">equal</keysym>
<text category="letter">+</text>
</key>
<key keycode="24" name="AD01">
<text category="letter">й</text>
<text category="letter">Й</text>
</key>
<key keycode="25" name="AD02">
<text category="letter">ц</text>
<text category="letter">Ц</text>
</key>
<key keycode="26" name="AD03">
<text category="letter">у</text>
<text category="letter">У</text>
</key>
<key keycode="27" name="AD04">
<text category="letter">к</text>
<text category="letter">К</text>
</key>
<key keycode="28" name="AD05">
<text category="letter">е</text>
<text category="letter">Е</text>
</key>
<key keycode="29" name="AD06">
<text category="letter">н</text>
<text category="letter">Н</text>
</key>
<key keycode="30" name="AD07">
<text category="letter">г</text>
<text category="letter">Г</text>
</key>
<key keycode="31" name="AD08">
<text category="letter">ш</text>
<text category="letter">Ш</text>
</key>
<key keycode="32" name="AD09">
<text category="letter">щ</text>
<text category="letter">Щ</text>
</key>
<key keycode="33" name="AD10">
<text category="letter">з</text>
<text category="letter">З</text>
</key>
<key keycode="34" name="AD11">
<text category="letter">х</text>
<text category="letter">Х</text>
</key>
<key keycode="35" name="AD12">
<text category="letter">ї</text>
<text category="letter">Ї</text>
</key>
<key keycode="51" name="BKSL">
<text category="letter">\</text>
<text category="letter">|</text>
</key>
<key keycode="38" name="AC01">
<text category="letter">ф</text>
<text category="letter">Ф</text>
</key>
<key keycode="39" name="AC02">
<text category="letter">і</text>
<text category="letter">І</text>
</key>
<key keycode="40" name="AC03">
<text category="letter">в</text>
<text category="letter">В</text>
</key>
<key keycode="41" name="AC04">
<text category="letter">а</text>
<text category="letter">А</text>
</key>
<key keycode="42" name="AC05">
<text category="letter">п</text>
<text category="letter">П</text>
</key>
<key keycode="43" name="AC06">
<text category="letter">р</text>
<text category="letter">Р</text>
</key>
<key keycode="44" name="AC07">
<text category="letter">о</text>
<text category="letter">О</text>
</key>
<key keycode="45" name="AC08">
<text category="letter">л</text>
<text category="letter">Л</text>
</key>
<key keycode="46" name="AC09">
<text category="letter">д</text>
<text category="letter">Д</text>
</key>
<key keycode="47" name="AC10">
<text category="letter">ж</text>
<text category="letter">Ж</text>
</key>
<key keycode="48" name="AC11">
<keysym keyval="39">quoteright</keysym>
<text category="letter">Є</text>
</key>
<key keycode="52" name="AB01">
<text category="letter">я</text>
<text category="letter">Я</text>
</key>
<key keycode="53" name="AB02">
<text category="letter">ч</text>
<text category="letter">Ч</text>
</key>
<key keycode="54" name="AB03">
<text category="letter">с</text>
<text category="letter">С</text>
</key>
<key keycode="55" name="AB04">
<text category="letter">м</text>
<text category="letter">М</text>
</key>
<key keycode="56" name="AB05">
<text category="letter">и</text>
<text category="letter">И</text>
</key>
<key keycode="57" name="AB06">
<text category="letter">т</text>
<text category="letter">Т</text>
</key>
<key keycode="58" name="AB07">
<text category="letter">ь</text>
<text category="letter">Ь</text>
</key>
<key keycode="59" name="AB08">
<text category="letter">б</text>
<text category="letter">Б</text>
</key>
<key keycode="60" name="AB09">
<text category="letter">ю</text>
<text category="letter">Ю</text>
</key>
<key keycode="61" name="AB10">
<text category="letter">.</text>
<text category="letter">,</text>
</key>
</symbols>

View File

@ -0,0 +1,193 @@
<?xml version="1.0"?>
<symbols version="0.90">
<include>us</include>
<key keycode="49" name="TLDE">
<keysym keyval="96">quoteleft</keysym>
<keysym keyval="126">asciitilde</keysym>
</key>
<key keycode="10" name="AE01">
<keysym keyval="49">1</keysym>
<keysym keyval="33">exclam</keysym>
</key>
<key keycode="11" name="AE02">
<keysym keyval="50">2</keysym>
<keysym keyval="64">at</keysym>
</key>
<key keycode="12" name="AE03">
<keysym keyval="51">3</keysym>
<keysym keyval="35">numbersign</keysym>
</key>
<key keycode="13" name="AE04">
<keysym keyval="52">4</keysym>
<keysym keyval="36">dollar</keysym>
</key>
<key keycode="14" name="AE05">
<keysym keyval="53">5</keysym>
<keysym keyval="37">percent</keysym>
<keysym keyval="8364">EuroSign</keysym>
</key>
<key keycode="15" name="AE06">
<keysym keyval="54">6</keysym>
<keysym keyval="94">asciicircum</keysym>
</key>
<key keycode="16" name="AE07">
<keysym keyval="55">7</keysym>
<keysym keyval="38">ampersand</keysym>
</key>
<key keycode="17" name="AE08">
<keysym keyval="56">8</keysym>
<keysym keyval="42">asterisk</keysym>
</key>
<key keycode="18" name="AE09">
<keysym keyval="57">9</keysym>
<keysym keyval="40">parenleft</keysym>
</key>
<key keycode="19" name="AE10">
<keysym keyval="48">0</keysym>
<keysym keyval="41">parenright</keysym>
</key>
<key keycode="20" name="AE11">
<keysym keyval="45">minus</keysym>
<text category="letter"></text>
</key>
<key keycode="21" name="AE12">
<keysym keyval="61">equal</keysym>
<keysym keyval="43">plus</keysym>
</key>
<key keycode="24" name="AD01">
<text category="letter">چ</text>
<text category="letter">چ</text>
</key>
<key keycode="25" name="AD02">
<text category="letter">ۋ</text>
<text category="letter">ۋ</text>
</key>
<key keycode="26" name="AD03">
<text category="letter">ې</text>
<text category="letter">ې</text>
</key>
<key keycode="27" name="AD04">
<text category="letter">ر</text>
<text category="letter">ر</text>
</key>
<key keycode="28" name="AD05">
<text category="letter">ت</text>
<text category="letter">ت</text>
</key>
<key keycode="29" name="AD06">
<text category="letter">ي</text>
<text category="letter">ي</text>
</key>
<key keycode="30" name="AD07">
<text category="letter">ۇ</text>
<text category="letter">ۇ</text>
</key>
<key keycode="31" name="AD08">
<text category="letter">ڭ</text>
<text category="letter">ڭ</text>
</key>
<key keycode="32" name="AD09">
<text category="letter">و</text>
<text category="letter">و</text>
</key>
<key keycode="33" name="AD10">
<text category="letter">پ</text>
<text category="letter">پ</text>
</key>
<key keycode="34" name="AD11">
<keysym keyval="91">bracketleft</keysym>
<text category="letter">«</text>
</key>
<key keycode="35" name="AD12">
<keysym keyval="93">bracketright</keysym>
<text category="letter">»</text>
</key>
<key keycode="51" name="BKSL">
<keysym keyval="92">backslash</keysym>
<keysym keyval="124">bar</keysym>
</key>
<key keycode="38" name="AC01">
<text category="letter">ھ</text>
<text category="letter">ھ</text>
</key>
<key keycode="39" name="AC02">
<text category="letter">س</text>
<text category="letter">س</text>
</key>
<key keycode="40" name="AC03">
<text category="letter">د</text>
<text category="letter">ژ</text>
</key>
<key keycode="41" name="AC04">
<text category="letter">ا</text>
<text category="letter">ف</text>
</key>
<key keycode="42" name="AC05">
<text category="letter">ە</text>
<text category="letter">گ</text>
</key>
<key keycode="43" name="AC06">
<text category="letter">ى</text>
<text category="letter">خ</text>
</key>
<key keycode="44" name="AC07">
<text category="letter">ق</text>
<text category="letter">ج</text>
</key>
<key keycode="45" name="AC08">
<text category="letter">ك</text>
<text category="letter">ۆ</text>
</key>
<key keycode="46" name="AC09">
<text category="letter">ل</text>
<text category="letter">ل</text>
</key>
<key keycode="47" name="AC10">
<text category="letter">؛</text>
<keysym keyval="58">colon</keysym>
</key>
<key keycode="48" name="AC11">
<keysym keyval="39">quoteright</keysym>
<keysym keyval="34">quotedbl</keysym>
</key>
<key keycode="52" name="AB01">
<text category="letter">ز</text>
<text category="letter">ز</text>
</key>
<key keycode="53" name="AB02">
<text category="letter">ش</text>
<text category="letter">ش</text>
</key>
<key keycode="54" name="AB03">
<text category="letter">غ</text>
<text category="letter">غ</text>
</key>
<key keycode="55" name="AB04">
<text category="letter">ۈ</text>
<text category="letter">ۈ</text>
</key>
<key keycode="56" name="AB05">
<text category="letter">ب</text>
<text category="letter">ب</text>
</key>
<key keycode="57" name="AB06">
<text category="letter">ن</text>
<text category="letter">ن</text>
</key>
<key keycode="58" name="AB07">
<text category="letter">م</text>
<text category="letter">م</text>
</key>
<key keycode="59" name="AB08">
<text category="letter">،</text>
<text category="letter"></text>
</key>
<key keycode="60" name="AB09">
<keysym keyval="46">period</keysym>
<text category="letter"></text>
</key>
<key keycode="61" name="AB10">
<text category="letter">ئ</text>
<text category="letter">؟</text>
</key>
</symbols>

View File

@ -0,0 +1,278 @@
<?xml version="1.0"?>
<symbols version="0.90">
<key keycode="9" name="ESC">
<keysym keyval="65307">Escape</keysym>
</key>
<key keycode="67" name="FK01">
<keysym keyval="65470">F1</keysym>
</key>
<key keycode="68" name="FK02">
<keysym keyval="65471">F2</keysym>
</key>
<key keycode="69" name="FK03">
<keysym keyval="65472">F3</keysym>
</key>
<key keycode="70" name="FK04">
<keysym keyval="65473">F4</keysym>
</key>
<key keycode="71" name="FK05">
<keysym keyval="65474">F5</keysym>
</key>
<key keycode="72" name="FK06">
<keysym keyval="65475">F6</keysym>
</key>
<key keycode="73" name="FK07">
<keysym keyval="65476">F7</keysym>
</key>
<key keycode="74" name="FK08">
<keysym keyval="65477">F8</keysym>
</key>
<key keycode="75" name="FK09">
<keysym keyval="65478">F9</keysym>
</key>
<key keycode="76" name="FK10">
<keysym keyval="65479">F10</keysym>
</key>
<key keycode="95" name="FK11">
<keysym keyval="65480">F11</keysym>
</key>
<key keycode="96" name="FK12">
<keysym keyval="65481">F12</keysym>
</key>
<key keycode="49" name="TLDE">
<keysym keyval="96">quoteleft</keysym>
<keysym keyval="126">asciitilde</keysym>
</key>
<key keycode="10" name="AE01">
<keysym keyval="49">1</keysym>
<keysym keyval="33">exclam</keysym>
</key>
<key keycode="11" name="AE02">
<keysym keyval="50">2</keysym>
<keysym keyval="64">at</keysym>
</key>
<key keycode="12" name="AE03">
<keysym keyval="51">3</keysym>
<keysym keyval="35">numbersign</keysym>
</key>
<key keycode="13" name="AE04">
<keysym keyval="52">4</keysym>
<keysym keyval="36">dollar</keysym>
</key>
<key keycode="14" name="AE05">
<keysym keyval="53">5</keysym>
<keysym keyval="37">percent</keysym>
<keysym keyval="8364">EuroSign</keysym>
</key>
<key keycode="15" name="AE06">
<keysym keyval="54">6</keysym>
<keysym keyval="94">asciicircum</keysym>
</key>
<key keycode="16" name="AE07">
<keysym keyval="55">7</keysym>
<keysym keyval="38">ampersand</keysym>
</key>
<key keycode="17" name="AE08">
<keysym keyval="56">8</keysym>
<keysym keyval="42">asterisk</keysym>
</key>
<key keycode="18" name="AE09">
<keysym keyval="57">9</keysym>
<keysym keyval="40">parenleft</keysym>
</key>
<key keycode="19" name="AE10">
<keysym keyval="48">0</keysym>
<keysym keyval="41">parenright</keysym>
</key>
<key keycode="20" name="AE11">
<keysym keyval="45">minus</keysym>
<keysym keyval="95">underscore</keysym>
</key>
<key keycode="21" name="AE12">
<keysym keyval="61">equal</keysym>
<keysym keyval="43">plus</keysym>
</key>
<key keycode="22" name="BKSP">
<keysym keyval="65288">BackSpace</keysym>
</key>
<key keycode="23" name="TAB">
<keysym keyval="65289">Tab</keysym>
<keysym keyval="65056">ISO_Left_Tab</keysym>
</key>
<key keycode="24" name="AD01">
<keysym keyval="113">q</keysym>
<keysym keyval="81">Q</keysym>
</key>
<key keycode="25" name="AD02">
<keysym keyval="119">w</keysym>
<keysym keyval="87">W</keysym>
</key>
<key keycode="26" name="AD03">
<keysym keyval="101">e</keysym>
<keysym keyval="69">E</keysym>
</key>
<key keycode="27" name="AD04">
<keysym keyval="114">r</keysym>
<keysym keyval="82">R</keysym>
</key>
<key keycode="28" name="AD05">
<keysym keyval="116">t</keysym>
<keysym keyval="84">T</keysym>
</key>
<key keycode="29" name="AD06">
<keysym keyval="121">y</keysym>
<keysym keyval="89">Y</keysym>
</key>
<key keycode="30" name="AD07">
<keysym keyval="117">u</keysym>
<keysym keyval="85">U</keysym>
</key>
<key keycode="31" name="AD08">
<keysym keyval="105">i</keysym>
<keysym keyval="73">I</keysym>
</key>
<key keycode="32" name="AD09">
<keysym keyval="111">o</keysym>
<keysym keyval="79">O</keysym>
</key>
<key keycode="33" name="AD10">
<keysym keyval="112">p</keysym>
<keysym keyval="80">P</keysym>
</key>
<key keycode="34" name="AD11">
<keysym keyval="91">bracketleft</keysym>
<keysym keyval="123">braceleft</keysym>
</key>
<key keycode="35" name="AD12">
<keysym keyval="93">bracketright</keysym>
<keysym keyval="125">braceright</keysym>
</key>
<key keycode="51" name="BKSL">
<keysym keyval="92">backslash</keysym>
<keysym keyval="124">bar</keysym>
</key>
<key keycode="66" name="CAPS">
<keysym keyval="65027">ISO_Level3_Shift</keysym>
</key>
<key keycode="38" name="AC01">
<keysym keyval="97">a</keysym>
<keysym keyval="65">A</keysym>
</key>
<key keycode="39" name="AC02">
<keysym keyval="115">s</keysym>
<keysym keyval="83">S</keysym>
</key>
<key keycode="40" name="AC03">
<keysym keyval="100">d</keysym>
<keysym keyval="68">D</keysym>
</key>
<key keycode="41" name="AC04">
<keysym keyval="102">f</keysym>
<keysym keyval="70">F</keysym>
</key>
<key keycode="42" name="AC05">
<keysym keyval="103">g</keysym>
<keysym keyval="71">G</keysym>
</key>
<key keycode="43" name="AC06">
<keysym keyval="104">h</keysym>
<keysym keyval="72">H</keysym>
</key>
<key keycode="44" name="AC07">
<keysym keyval="106">j</keysym>
<keysym keyval="74">J</keysym>
</key>
<key keycode="45" name="AC08">
<keysym keyval="107">k</keysym>
<keysym keyval="75">K</keysym>
</key>
<key keycode="46" name="AC09">
<keysym keyval="108">l</keysym>
<keysym keyval="76">L</keysym>
</key>
<key keycode="47" name="AC10">
<keysym keyval="59">semicolon</keysym>
<keysym keyval="58">colon</keysym>
</key>
<key keycode="48" name="AC11">
<keysym keyval="39">quoteright</keysym>
<keysym keyval="34">quotedbl</keysym>
</key>
<key keycode="36" name="RTRN">
<keysym keyval="65293">Return</keysym>
</key>
<key keycode="50" name="LFSH">
<keysym keyval="65505">Shift_L</keysym>
</key>
<key keycode="52" name="AB01">
<keysym keyval="122">z</keysym>
<keysym keyval="90">Z</keysym>
</key>
<key keycode="53" name="AB02">
<keysym keyval="120">x</keysym>
<keysym keyval="88">X</keysym>
</key>
<key keycode="54" name="AB03">
<keysym keyval="99">c</keysym>
<keysym keyval="67">C</keysym>
</key>
<key keycode="55" name="AB04">
<keysym keyval="118">v</keysym>
<keysym keyval="86">V</keysym>
</key>
<key keycode="56" name="AB05">
<keysym keyval="98">b</keysym>
<keysym keyval="66">B</keysym>
</key>
<key keycode="57" name="AB06">
<keysym keyval="110">n</keysym>
<keysym keyval="78">N</keysym>
</key>
<key keycode="58" name="AB07">
<keysym keyval="109">m</keysym>
<keysym keyval="77">M</keysym>
</key>
<key keycode="59" name="AB08">
<keysym keyval="44">comma</keysym>
<keysym keyval="60">less</keysym>
</key>
<key keycode="60" name="AB09">
<keysym keyval="46">period</keysym>
<keysym keyval="62">greater</keysym>
</key>
<key keycode="61" name="AB10">
<keysym keyval="47">slash</keysym>
<keysym keyval="63">question</keysym>
</key>
<key keycode="62" name="RTSH">
<keysym keyval="65506">Shift_R</keysym>
</key>
<key keycode="149" name="I149">
<symbol label="⌨" icon="input-keyboard-symbolic">cycle-keyboard</symbol>
</key>
<key keycode="150" name="I150">
<symbol label="☺" icon="preferences-system-symbolic">preferences</symbol>
</key>
<key keycode="37" name="LCTL">
<keysym keyval="65507">Control_L</keysym>
</key>
<key keycode="64" name="LALT">
<keysym keyval="65513">Alt_L</keysym>
<keysym keyval="65511">Meta_L</keysym>
</key>
<key keycode="65" name="SPCE">
<keysym keyval="32">space</keysym>
</key>
<key keycode="113" name="LEFT">
<keysym keyval="65361">Left</keysym>
</key>
<key keycode="111" name="UP">
<keysym keyval="65362">Up</keysym>
</key>
<key keycode="116" name="DOWN">
<keysym keyval="65364">Down</keysym>
</key>
<key keycode="114" name="RGHT">
<keysym keyval="65363">Right</keysym>
</key>
</symbols>

View File

@ -0,0 +1,193 @@
<?xml version="1.0"?>
<symbols version="0.90">
<include>us</include>
<key keycode="49" name="TLDE">
<keysym keyval="96">quoteleft</keysym>
<keysym keyval="126">asciitilde</keysym>
</key>
<key keycode="10" name="AE01">
<text category="letter"></text>
<keysym keyval="33">exclam</keysym>
</key>
<key keycode="11" name="AE02">
<text category="letter"></text>
<keysym keyval="64">at</keysym>
</key>
<key keycode="12" name="AE03">
<text category="letter">ˇ</text>
<keysym keyval="35">numbersign</keysym>
</key>
<key keycode="13" name="AE04">
<text category="letter">ˋ</text>
<keysym keyval="36">dollar</keysym>
</key>
<key keycode="14" name="AE05">
<text category="letter"></text>
<keysym keyval="37">percent</keysym>
<keysym keyval="8364">EuroSign</keysym>
</key>
<key keycode="15" name="AE06">
<text category="letter">ˊ</text>
<keysym keyval="94">asciicircum</keysym>
</key>
<key keycode="16" name="AE07">
<text category="letter">˙</text>
<keysym keyval="38">ampersand</keysym>
</key>
<key keycode="17" name="AE08">
<text category="letter"></text>
<keysym keyval="42">asterisk</keysym>
</key>
<key keycode="18" name="AE09">
<text category="letter"></text>
<keysym keyval="40">parenleft</keysym>
</key>
<key keycode="19" name="AE10">
<text category="letter"></text>
<keysym keyval="41">parenright</keysym>
</key>
<key keycode="20" name="AE11">
<text category="letter"></text>
<keysym keyval="95">underscore</keysym>
</key>
<key keycode="21" name="AE12">
<keysym keyval="61">equal</keysym>
<keysym keyval="43">plus</keysym>
</key>
<key keycode="24" name="AD01">
<text category="letter"></text>
<keysym keyval="81">Q</keysym>
</key>
<key keycode="25" name="AD02">
<text category="letter"></text>
<keysym keyval="87">W</keysym>
</key>
<key keycode="26" name="AD03">
<text category="letter"></text>
<keysym keyval="69">E</keysym>
</key>
<key keycode="27" name="AD04">
<text category="letter"></text>
<keysym keyval="82">R</keysym>
</key>
<key keycode="28" name="AD05">
<text category="letter"></text>
<keysym keyval="84">T</keysym>
</key>
<key keycode="29" name="AD06">
<text category="letter"></text>
<keysym keyval="89">Y</keysym>
</key>
<key keycode="30" name="AD07">
<text category="letter"></text>
<keysym keyval="85">U</keysym>
</key>
<key keycode="31" name="AD08">
<text category="letter"></text>
<keysym keyval="73">I</keysym>
</key>
<key keycode="32" name="AD09">
<text category="letter"></text>
<keysym keyval="79">O</keysym>
</key>
<key keycode="33" name="AD10">
<text category="letter"></text>
<keysym keyval="80">P</keysym>
</key>
<key keycode="34" name="AD11">
<keysym keyval="91">bracketleft</keysym>
<keysym keyval="123">braceleft</keysym>
</key>
<key keycode="35" name="AD12">
<keysym keyval="93">bracketright</keysym>
<keysym keyval="125">braceright</keysym>
</key>
<key keycode="51" name="BKSL">
<keysym keyval="92">backslash</keysym>
<keysym keyval="124">bar</keysym>
</key>
<key keycode="38" name="AC01">
<text category="letter"></text>
<keysym keyval="65">A</keysym>
</key>
<key keycode="39" name="AC02">
<text category="letter"></text>
<keysym keyval="83">S</keysym>
</key>
<key keycode="40" name="AC03">
<text category="letter"></text>
<keysym keyval="68">D</keysym>
</key>
<key keycode="41" name="AC04">
<text category="letter"></text>
<keysym keyval="70">F</keysym>
</key>
<key keycode="42" name="AC05">
<text category="letter"></text>
<keysym keyval="71">G</keysym>
</key>
<key keycode="43" name="AC06">
<text category="letter"></text>
<keysym keyval="72">H</keysym>
</key>
<key keycode="44" name="AC07">
<text category="letter"></text>
<keysym keyval="74">J</keysym>
</key>
<key keycode="45" name="AC08">
<text category="letter"></text>
<keysym keyval="75">K</keysym>
</key>
<key keycode="46" name="AC09">
<text category="letter"></text>
<keysym keyval="76">L</keysym>
</key>
<key keycode="47" name="AC10">
<text category="letter"></text>
<keysym keyval="58">colon</keysym>
</key>
<key keycode="48" name="AC11">
<keysym keyval="39">quoteright</keysym>
<keysym keyval="34">quotedbl</keysym>
</key>
<key keycode="52" name="AB01">
<text category="letter"></text>
<keysym keyval="90">Z</keysym>
</key>
<key keycode="53" name="AB02">
<text category="letter"></text>
<keysym keyval="88">X</keysym>
</key>
<key keycode="54" name="AB03">
<text category="letter"></text>
<keysym keyval="67">C</keysym>
</key>
<key keycode="55" name="AB04">
<text category="letter"></text>
<keysym keyval="86">V</keysym>
</key>
<key keycode="56" name="AB05">
<text category="letter"></text>
<keysym keyval="66">B</keysym>
</key>
<key keycode="57" name="AB06">
<text category="letter"></text>
<keysym keyval="78">N</keysym>
</key>
<key keycode="58" name="AB07">
<text category="letter"></text>
<keysym keyval="77">M</keysym>
</key>
<key keycode="59" name="AB08">
<text category="letter"></text>
<keysym keyval="60">less</keysym>
</key>
<key keycode="60" name="AB09">
<text category="letter"></text>
<keysym keyval="62">greater</keysym>
</key>
<key keycode="61" name="AB10">
<text category="letter"></text>
<keysym keyval="63">question</keysym>
</key>
</symbols>

View File

@ -1,707 +0,0 @@
<?xml version="1.0"?>
<keyboard version="0.90">
<bounds>0.000000,0.000000,410.000000,190.000000</bounds>
<section name="Alpha">
<bounds>10.000000,50.000000,390.000000,129.000000</bounds>
<angle>0</angle>
<row>
<columns>14</columns>
<orientation>1</orientation>
</row>
<row>
<columns>14</columns>
<orientation>1</orientation>
</row>
<row>
<columns>13</columns>
<orientation>1</orientation>
</row>
<row>
<columns>12</columns>
<orientation>1</orientation>
</row>
<row>
<columns>8</columns>
<orientation>1</orientation>
</row>
<key id="keycode105" name="RCTL" column="7" row="4">
<bounds>359.000000,104.000000,31.000000,24.000000</bounds>
<oref>outline10</oref>
<symbols groups="1" levels="1">
<keysym keyval="65508">Control_R</keysym>
</symbols>
</key>
<key id="keycode135" name="MENU" column="6" row="4">
<bounds>326.000000,104.000000,31.000000,24.000000</bounds>
<oref>outline10</oref>
<symbols groups="1" levels="1">
<keysym keyval="65383">Menu</keysym>
</symbols>
</key>
<key id="keycode134" name="RWIN" column="5" row="4">
<bounds>294.000000,104.000000,31.000000,24.000000</bounds>
<oref>outline10</oref>
<symbols groups="1" levels="1">
<keysym keyval="65516">Super_R</keysym>
</symbols>
</key>
<key id="keycode108" name="RALT" column="4" row="4">
<bounds>261.000000,104.000000,31.000000,24.000000</bounds>
<oref>outline10</oref>
<symbols groups="1" levels="1">
<keysym keyval="65027">ISO_Level3_Shift</keysym>
</symbols>
</key>
<key id="keycode65" name="SPCE" column="3" row="4">
<bounds>106.000000,104.000000,153.000000,24.000000</bounds>
<oref>outline11</oref>
<symbols groups="1" levels="1">
<keysym keyval="32">space</keysym>
</symbols>
</key>
<key id="keycode64" name="LALT" column="2" row="4">
<bounds>73.000000,104.000000,31.000000,24.000000</bounds>
<oref>outline10</oref>
<symbols groups="1" levels="2">
<keysym keyval="65513">Alt_L</keysym>
<keysym keyval="65511">Meta_L</keysym>
</symbols>
</key>
<key id="keycode133" name="LWIN" column="1" row="4">
<bounds>40.000000,104.000000,31.000000,24.000000</bounds>
<oref>outline10</oref>
<symbols groups="1" levels="1">
<keysym keyval="65515">Super_L</keysym>
</symbols>
</key>
<key id="keycode37" name="LCTL" column="0" row="4">
<bounds>2.000000,104.000000,36.000000,24.000000</bounds>
<oref>outline9</oref>
<symbols groups="1" levels="1">
<keysym keyval="65507">Control_L</keysym>
</symbols>
</key>
<key id="keycode62" name="RTSH" column="11" row="3">
<bounds>320.000000,78.000000,70.000000,24.000000</bounds>
<oref>outline8</oref>
<symbols groups="1" levels="1">
<keysym keyval="65506">Shift_R</keysym>
</symbols>
</key>
<key id="keycode61" name="AB10" column="10" row="3">
<bounds>294.000000,78.000000,24.000000,24.000000</bounds>
<oref>outline1</oref>
<symbols groups="1" levels="2">
<keysym keyval="47">slash</keysym>
<keysym keyval="63">question</keysym>
</symbols>
</key>
<key id="keycode60" name="AB09" column="9" row="3">
<bounds>268.000000,78.000000,24.000000,24.000000</bounds>
<oref>outline1</oref>
<symbols groups="1" levels="2">
<keysym keyval="46">period</keysym>
<keysym keyval="62">greater</keysym>
</symbols>
</key>
<key id="keycode59" name="AB08" column="8" row="3">
<bounds>242.000000,78.000000,24.000000,24.000000</bounds>
<oref>outline1</oref>
<symbols groups="1" levels="2">
<keysym keyval="44">comma</keysym>
<keysym keyval="60">less</keysym>
</symbols>
</key>
<key id="keycode58" name="AB07" column="7" row="3">
<bounds>216.000000,78.000000,24.000000,24.000000</bounds>
<oref>outline1</oref>
<symbols groups="1" levels="2">
<keysym keyval="109">m</keysym>
<keysym keyval="77">M</keysym>
</symbols>
</key>
<key id="keycode57" name="AB06" column="6" row="3">
<bounds>190.000000,78.000000,24.000000,24.000000</bounds>
<oref>outline1</oref>
<symbols groups="1" levels="2">
<keysym keyval="110">n</keysym>
<keysym keyval="78">N</keysym>
</symbols>
</key>
<key id="keycode56" name="AB05" column="5" row="3">
<bounds>164.000000,78.000000,24.000000,24.000000</bounds>
<oref>outline1</oref>
<symbols groups="1" levels="2">
<keysym keyval="98">b</keysym>
<keysym keyval="66">B</keysym>
</symbols>
</key>
<key id="keycode55" name="AB04" column="4" row="3">
<bounds>138.000000,78.000000,24.000000,24.000000</bounds>
<oref>outline1</oref>
<symbols groups="1" levels="2">
<keysym keyval="118">v</keysym>
<keysym keyval="86">V</keysym>
</symbols>
</key>
<key id="keycode54" name="AB03" column="3" row="3">
<bounds>113.000000,78.000000,24.000000,24.000000</bounds>
<oref>outline1</oref>
<symbols groups="1" levels="2">
<keysym keyval="99">c</keysym>
<keysym keyval="67">C</keysym>
</symbols>
</key>
<key id="keycode53" name="AB02" column="2" row="3">
<bounds>87.000000,78.000000,24.000000,24.000000</bounds>
<oref>outline1</oref>
<symbols groups="1" levels="2">
<keysym keyval="120">x</keysym>
<keysym keyval="88">X</keysym>
</symbols>
</key>
<key id="keycode52" name="AB01" column="1" row="3">
<bounds>61.000000,78.000000,24.000000,24.000000</bounds>
<oref>outline1</oref>
<symbols groups="1" levels="2">
<keysym keyval="122">z</keysym>
<keysym keyval="90">Z</keysym>
</symbols>
</key>
<key id="keycode50" name="LFSH" column="0" row="3">
<bounds>2.000000,78.000000,57.000000,24.000000</bounds>
<oref>outline7</oref>
<symbols groups="1" levels="1">
<keysym keyval="65505">Shift_L</keysym>
</symbols>
</key>
<key id="keycode36" name="RTRN" column="12" row="2">
<bounds>333.000000,53.000000,57.000000,24.000000</bounds>
<oref>outline6</oref>
<symbols groups="1" levels="1">
<keysym keyval="65293">Return</keysym>
</symbols>
</key>
<key id="keycode48" name="AC11" column="11" row="2">
<bounds>307.000000,53.000000,24.000000,24.000000</bounds>
<oref>outline1</oref>
<symbols groups="1" levels="2">
<keysym keyval="39">quoteright</keysym>
<keysym keyval="34">quotedbl</keysym>
</symbols>
</key>
<key id="keycode47" name="AC10" column="10" row="2">
<bounds>281.000000,53.000000,24.000000,24.000000</bounds>
<oref>outline1</oref>
<symbols groups="1" levels="2">
<keysym keyval="59">semicolon</keysym>
<keysym keyval="58">colon</keysym>
</symbols>
</key>
<key id="keycode46" name="AC09" column="9" row="2">
<bounds>256.000000,53.000000,24.000000,24.000000</bounds>
<oref>outline1</oref>
<symbols groups="1" levels="2">
<keysym keyval="108">l</keysym>
<keysym keyval="76">L</keysym>
</symbols>
</key>
<key id="keycode45" name="AC08" column="8" row="2">
<bounds>230.000000,53.000000,24.000000,24.000000</bounds>
<oref>outline1</oref>
<symbols groups="1" levels="2">
<keysym keyval="107">k</keysym>
<keysym keyval="75">K</keysym>
</symbols>
</key>
<key id="keycode44" name="AC07" column="7" row="2">
<bounds>204.000000,53.000000,24.000000,24.000000</bounds>
<oref>outline1</oref>
<symbols groups="1" levels="2">
<keysym keyval="106">j</keysym>
<keysym keyval="74">J</keysym>
</symbols>
</key>
<key id="keycode43" name="AC06" column="6" row="2">
<bounds>178.000000,53.000000,24.000000,24.000000</bounds>
<oref>outline1</oref>
<symbols groups="1" levels="2">
<keysym keyval="104">h</keysym>
<keysym keyval="72">H</keysym>
</symbols>
</key>
<key id="keycode42" name="AC05" column="5" row="2">
<bounds>152.000000,53.000000,24.000000,24.000000</bounds>
<oref>outline1</oref>
<symbols groups="1" levels="2">
<keysym keyval="103">g</keysym>
<keysym keyval="71">G</keysym>
</symbols>
</key>
<key id="keycode41" name="AC04" column="4" row="2">
<bounds>126.000000,53.000000,24.000000,24.000000</bounds>
<oref>outline1</oref>
<symbols groups="1" levels="2">
<keysym keyval="102">f</keysym>
<keysym keyval="70">F</keysym>
</symbols>
</key>
<key id="keycode40" name="AC03" column="3" row="2">
<bounds>100.000000,53.000000,24.000000,24.000000</bounds>
<oref>outline1</oref>
<symbols groups="1" levels="2">
<keysym keyval="100">d</keysym>
<keysym keyval="68">D</keysym>
</symbols>
</key>
<key id="keycode39" name="AC02" column="2" row="2">
<bounds>74.000000,53.000000,24.000000,24.000000</bounds>
<oref>outline1</oref>
<symbols groups="1" levels="2">
<keysym keyval="115">s</keysym>
<keysym keyval="83">S</keysym>
</symbols>
</key>
<key id="keycode38" name="AC01" column="1" row="2">
<bounds>49.000000,53.000000,24.000000,24.000000</bounds>
<oref>outline1</oref>
<symbols groups="1" levels="2">
<keysym keyval="97">a</keysym>
<keysym keyval="65">A</keysym>
</symbols>
</key>
<key id="keycode66" name="CAPS" column="0" row="2">
<bounds>2.000000,53.000000,44.000000,24.000000</bounds>
<oref>outline5</oref>
<symbols groups="1" levels="2">
<keysym keyval="65507">Control_L</keysym>
<keysym keyval="65507">Control_L</keysym>
</symbols>
</key>
<key id="keycode51" name="BKSL" column="13" row="1">
<bounds>352.000000,27.000000,38.000000,24.000000</bounds>
<oref>outline4</oref>
<symbols groups="1" levels="2">
<keysym keyval="92">backslash</keysym>
<keysym keyval="124">bar</keysym>
</symbols>
</key>
<key id="keycode35" name="AD12" column="12" row="1">
<bounds>326.000000,27.000000,24.000000,24.000000</bounds>
<oref>outline1</oref>
<symbols groups="1" levels="2">
<keysym keyval="93">bracketright</keysym>
<keysym keyval="125">braceright</keysym>
</symbols>
</key>
<key id="keycode34" name="AD11" column="11" row="1">
<bounds>300.000000,27.000000,24.000000,24.000000</bounds>
<oref>outline1</oref>
<symbols groups="1" levels="2">
<keysym keyval="91">bracketleft</keysym>
<keysym keyval="123">braceleft</keysym>
</symbols>
</key>
<key id="keycode33" name="AD10" column="10" row="1">
<bounds>275.000000,27.000000,24.000000,24.000000</bounds>
<oref>outline1</oref>
<symbols groups="1" levels="2">
<keysym keyval="112">p</keysym>
<keysym keyval="80">P</keysym>
</symbols>
</key>
<key id="keycode32" name="AD09" column="9" row="1">
<bounds>249.000000,27.000000,24.000000,24.000000</bounds>
<oref>outline1</oref>
<symbols groups="1" levels="2">
<keysym keyval="111">o</keysym>
<keysym keyval="79">O</keysym>
</symbols>
</key>
<key id="keycode31" name="AD08" column="8" row="1">
<bounds>223.000000,27.000000,24.000000,24.000000</bounds>
<oref>outline1</oref>
<symbols groups="1" levels="2">
<keysym keyval="105">i</keysym>
<keysym keyval="73">I</keysym>
</symbols>
</key>
<key id="keycode30" name="AD07" column="7" row="1">
<bounds>197.000000,27.000000,24.000000,24.000000</bounds>
<oref>outline1</oref>
<symbols groups="1" levels="2">
<keysym keyval="117">u</keysym>
<keysym keyval="85">U</keysym>
</symbols>
</key>
<key id="keycode29" name="AD06" column="6" row="1">
<bounds>171.000000,27.000000,24.000000,24.000000</bounds>
<oref>outline1</oref>
<symbols groups="1" levels="2">
<keysym keyval="121">y</keysym>
<keysym keyval="89">Y</keysym>
</symbols>
</key>
<key id="keycode28" name="AD05" column="5" row="1">
<bounds>145.000000,27.000000,24.000000,24.000000</bounds>
<oref>outline1</oref>
<symbols groups="1" levels="2">
<keysym keyval="116">t</keysym>
<keysym keyval="84">T</keysym>
</symbols>
</key>
<key id="keycode27" name="AD04" column="4" row="1">
<bounds>119.000000,27.000000,24.000000,24.000000</bounds>
<oref>outline1</oref>
<symbols groups="1" levels="2">
<keysym keyval="114">r</keysym>
<keysym keyval="82">R</keysym>
</symbols>
</key>
<key id="keycode26" name="AD03" column="3" row="1">
<bounds>93.000000,27.000000,24.000000,24.000000</bounds>
<oref>outline1</oref>
<symbols groups="1" levels="2">
<keysym keyval="101">e</keysym>
<keysym keyval="69">E</keysym>
</symbols>
</key>
<key id="keycode25" name="AD02" column="2" row="1">
<bounds>68.000000,27.000000,24.000000,24.000000</bounds>
<oref>outline1</oref>
<symbols groups="1" levels="2">
<keysym keyval="119">w</keysym>
<keysym keyval="87">W</keysym>
</symbols>
</key>
<key id="keycode24" name="AD01" column="1" row="1">
<bounds>42.000000,27.000000,24.000000,24.000000</bounds>
<oref>outline1</oref>
<symbols groups="1" levels="2">
<keysym keyval="113">q</keysym>
<keysym keyval="81">Q</keysym>
</symbols>
</key>
<key id="keycode23" name="TAB" column="0" row="1">
<bounds>2.000000,27.000000,38.000000,24.000000</bounds>
<oref>outline3</oref>
<symbols groups="1" levels="2">
<keysym keyval="65289">Tab</keysym>
<keysym keyval="65056">ISO_Left_Tab</keysym>
</symbols>
</key>
<key id="keycode22" name="BKSP" column="13" row="0">
<bounds>339.000000,1.000000,51.000000,24.000000</bounds>
<oref>outline2</oref>
<symbols groups="1" levels="1">
<keysym keyval="65288">BackSpace</keysym>
</symbols>
</key>
<key id="keycode21" name="AE12" column="12" row="0">
<bounds>313.000000,1.000000,24.000000,24.000000</bounds>
<oref>outline1</oref>
<symbols groups="1" levels="2">
<keysym keyval="61">equal</keysym>
<keysym keyval="43">plus</keysym>
</symbols>
</key>
<key id="keycode20" name="AE11" column="11" row="0">
<bounds>287.000000,1.000000,24.000000,24.000000</bounds>
<oref>outline1</oref>
<symbols groups="1" levels="2">
<keysym keyval="45">minus</keysym>
<keysym keyval="95">underscore</keysym>
</symbols>
</key>
<key id="keycode19" name="AE10" column="10" row="0">
<bounds>261.000000,1.000000,24.000000,24.000000</bounds>
<oref>outline1</oref>
<symbols groups="1" levels="2">
<keysym keyval="48">0</keysym>
<keysym keyval="41">parenright</keysym>
</symbols>
</key>
<key id="keycode18" name="AE09" column="9" row="0">
<bounds>235.000000,1.000000,24.000000,24.000000</bounds>
<oref>outline1</oref>
<symbols groups="1" levels="2">
<keysym keyval="57">9</keysym>
<keysym keyval="40">parenleft</keysym>
</symbols>
</key>
<key id="keycode17" name="AE08" column="8" row="0">
<bounds>209.000000,1.000000,24.000000,24.000000</bounds>
<oref>outline1</oref>
<symbols groups="1" levels="2">
<keysym keyval="56">8</keysym>
<keysym keyval="42">asterisk</keysym>
</symbols>
</key>
<key id="keycode16" name="AE07" column="7" row="0">
<bounds>183.000000,1.000000,24.000000,24.000000</bounds>
<oref>outline1</oref>
<symbols groups="1" levels="2">
<keysym keyval="55">7</keysym>
<keysym keyval="38">ampersand</keysym>
</symbols>
</key>
<key id="keycode15" name="AE06" column="6" row="0">
<bounds>157.000000,1.000000,24.000000,24.000000</bounds>
<oref>outline1</oref>
<symbols groups="1" levels="2">
<keysym keyval="54">6</keysym>
<keysym keyval="94">asciicircum</keysym>
</symbols>
</key>
<key id="keycode14" name="AE05" column="5" row="0">
<bounds>132.000000,1.000000,24.000000,24.000000</bounds>
<oref>outline1</oref>
<symbols groups="1" levels="2">
<keysym keyval="53">5</keysym>
<keysym keyval="37">percent</keysym>
</symbols>
</key>
<key id="keycode13" name="AE04" column="4" row="0">
<bounds>106.000000,1.000000,24.000000,24.000000</bounds>
<oref>outline1</oref>
<symbols groups="1" levels="2">
<keysym keyval="52">4</keysym>
<keysym keyval="36">dollar</keysym>
</symbols>
</key>
<key id="keycode12" name="AE03" column="3" row="0">
<bounds>80.000000,1.000000,24.000000,24.000000</bounds>
<oref>outline1</oref>
<symbols groups="1" levels="2">
<keysym keyval="51">3</keysym>
<keysym keyval="35">numbersign</keysym>
</symbols>
</key>
<key id="keycode11" name="AE02" column="2" row="0">
<bounds>54.000000,1.000000,24.000000,24.000000</bounds>
<oref>outline1</oref>
<symbols groups="1" levels="2">
<keysym keyval="50">2</keysym>
<keysym keyval="64">at</keysym>
</symbols>
</key>
<key id="keycode10" name="AE01" column="1" row="0">
<bounds>28.000000,1.000000,24.000000,24.000000</bounds>
<oref>outline1</oref>
<symbols groups="1" levels="2">
<keysym keyval="49">1</keysym>
<keysym keyval="33">exclam</keysym>
</symbols>
</key>
<key id="keycode49" name="TLDE" column="0" row="0">
<bounds>2.000000,1.000000,24.000000,24.000000</bounds>
<oref>outline1</oref>
<symbols groups="1" levels="2">
<keysym keyval="96">quoteleft</keysym>
<keysym keyval="126">asciitilde</keysym>
</symbols>
</key>
</section>
<section name="Function">
<bounds>10.000000,10.000000,410.000000,25.000000</bounds>
<angle>0</angle>
<row>
<columns>16</columns>
<orientation>1</orientation>
</row>
<key id="keycode96" name="FK12" column="12" row="0">
<bounds>366.000000,1.000000,24.000000,24.000000</bounds>
<oref>outline1</oref>
<symbols groups="1" levels="2">
<keysym keyval="65481">F12</keysym>
<keysym keyval="269024780">(null)</keysym>
</symbols>
</key>
<key id="keycode95" name="FK11" column="11" row="0">
<bounds>340.000000,1.000000,24.000000,24.000000</bounds>
<oref>outline1</oref>
<symbols groups="1" levels="2">
<keysym keyval="65480">F11</keysym>
<keysym keyval="269024779">(null)</keysym>
</symbols>
</key>
<key id="keycode76" name="FK10" column="10" row="0">
<bounds>314.000000,1.000000,24.000000,24.000000</bounds>
<oref>outline1</oref>
<symbols groups="1" levels="2">
<keysym keyval="65479">F10</keysym>
<keysym keyval="269024778">(null)</keysym>
</symbols>
</key>
<key id="keycode75" name="FK09" column="9" row="0">
<bounds>288.000000,1.000000,24.000000,24.000000</bounds>
<oref>outline1</oref>
<symbols groups="1" levels="2">
<keysym keyval="65478">F9</keysym>
<keysym keyval="269024777">(null)</keysym>
</symbols>
</key>
<key id="keycode74" name="FK08" column="8" row="0">
<bounds>249.000000,1.000000,24.000000,24.000000</bounds>
<oref>outline1</oref>
<symbols groups="1" levels="2">
<keysym keyval="65477">F8</keysym>
<keysym keyval="269024776">(null)</keysym>
</symbols>
</key>
<key id="keycode73" name="FK07" column="7" row="0">
<bounds>223.000000,1.000000,24.000000,24.000000</bounds>
<oref>outline1</oref>
<symbols groups="1" levels="2">
<keysym keyval="65476">F7</keysym>
<keysym keyval="269024775">(null)</keysym>
</symbols>
</key>
<key id="keycode72" name="FK06" column="6" row="0">
<bounds>197.000000,1.000000,24.000000,24.000000</bounds>
<oref>outline1</oref>
<symbols groups="1" levels="2">
<keysym keyval="65475">F6</keysym>
<keysym keyval="269024774">(null)</keysym>
</symbols>
</key>
<key id="keycode71" name="FK05" column="5" row="0">
<bounds>171.000000,1.000000,24.000000,24.000000</bounds>
<oref>outline1</oref>
<symbols groups="1" levels="2">
<keysym keyval="65474">F5</keysym>
<keysym keyval="269024773">(null)</keysym>
</symbols>
</key>
<key id="keycode70" name="FK04" column="4" row="0">
<bounds>132.000000,1.000000,24.000000,24.000000</bounds>
<oref>outline1</oref>
<symbols groups="1" levels="2">
<keysym keyval="65473">F4</keysym>
<keysym keyval="269024772">(null)</keysym>
</symbols>
</key>
<key id="keycode69" name="FK03" column="3" row="0">
<bounds>106.000000,1.000000,24.000000,24.000000</bounds>
<oref>outline1</oref>
<symbols groups="1" levels="2">
<keysym keyval="65472">F3</keysym>
<keysym keyval="269024771">(null)</keysym>
</symbols>
</key>
<key id="keycode68" name="FK02" column="2" row="0">
<bounds>80.000000,1.000000,24.000000,24.000000</bounds>
<oref>outline1</oref>
<symbols groups="1" levels="2">
<keysym keyval="65471">F2</keysym>
<keysym keyval="269024770">(null)</keysym>
</symbols>
</key>
<key id="keycode67" name="FK01" column="1" row="0">
<bounds>54.000000,1.000000,24.000000,24.000000</bounds>
<oref>outline1</oref>
<symbols groups="1" levels="2">
<keysym keyval="65470">F1</keysym>
<keysym keyval="269024769">(null)</keysym>
</symbols>
</key>
<key id="keycode9" name="ESC" column="0" row="0">
<bounds>2.000000,1.000000,24.000000,24.000000</bounds>
<oref>outline1</oref>
<symbols groups="1" levels="1">
<keysym keyval="65307">Escape</keysym>
</symbols>
</key>
</section>
<outline id="outline1">
<corner-radius>1.000000</corner-radius>
<point>0.000000,0.000000</point>
<point>24.000000,0.000000</point>
<point>24.000000,24.000000</point>
<point>0.000000,24.000000</point>
</outline>
<outline id="outline3">
<corner-radius>1.000000</corner-radius>
<point>0.000000,0.000000</point>
<point>38.000000,0.000000</point>
<point>38.000000,24.000000</point>
<point>0.000000,24.000000</point>
</outline>
<outline id="outline4">
<corner-radius>1.000000</corner-radius>
<point>0.000000,0.000000</point>
<point>38.000000,0.000000</point>
<point>38.000000,24.000000</point>
<point>0.000000,24.000000</point>
</outline>
<outline id="outline5">
<corner-radius>1.000000</corner-radius>
<point>0.000000,0.000000</point>
<point>44.000000,0.000000</point>
<point>44.000000,24.000000</point>
<point>0.000000,24.000000</point>
</outline>
<outline id="outline6">
<corner-radius>1.000000</corner-radius>
<point>0.000000,0.000000</point>
<point>57.000000,0.000000</point>
<point>57.000000,24.000000</point>
<point>0.000000,24.000000</point>
</outline>
<outline id="outline7">
<corner-radius>1.000000</corner-radius>
<point>0.000000,0.000000</point>
<point>57.000000,0.000000</point>
<point>57.000000,24.000000</point>
<point>0.000000,24.000000</point>
</outline>
<outline id="outline8">
<corner-radius>1.000000</corner-radius>
<point>0.000000,0.000000</point>
<point>70.000000,0.000000</point>
<point>70.000000,24.000000</point>
<point>0.000000,24.000000</point>
</outline>
<outline id="outline9">
<corner-radius>1.000000</corner-radius>
<point>0.000000,0.000000</point>
<point>36.000000,0.000000</point>
<point>36.000000,24.000000</point>
<point>0.000000,24.000000</point>
</outline>
<outline id="outline10">
<corner-radius>1.000000</corner-radius>
<point>0.000000,0.000000</point>
<point>31.000000,0.000000</point>
<point>31.000000,24.000000</point>
<point>0.000000,24.000000</point>
</outline>
<outline id="outline11">
<corner-radius>1.000000</corner-radius>
<point>0.000000,0.000000</point>
<point>153.000000,0.000000</point>
<point>153.000000,24.000000</point>
<point>0.000000,24.000000</point>
</outline>
<outline id="outline12">
<corner-radius>1.000000</corner-radius>
<point>0.000000,0.000000</point>
<point>24.000000,0.000000</point>
<point>24.000000,50.000000</point>
<point>0.000000,50.000000</point>
</outline>
<outline id="outline13">
<corner-radius>1.000000</corner-radius>
<point>0.000000,0.000000</point>
<point>50.000000,0.000000</point>
<point>50.000000,24.000000</point>
<point>0.000000,24.000000</point>
</outline>
<outline id="outline2">
<corner-radius>1.000000</corner-radius>
<point>0.000000,0.000000</point>
<point>51.000000,0.000000</point>
<point>51.000000,24.000000</point>
<point>0.000000,24.000000</point>
</outline>
</keyboard>

View File

@ -1,10 +1,10 @@
<?xml version="1.0"?> <?xml version="1.0"?>
<schemalist> <schemalist>
<schema id="org.fedorahosted.eekboard" path="/org/fedorahosted/eekboard/"> <schema id="org.fedorahosted.eekboard" path="/org/fedorahosted/eekboard/">
<key name="ui-toolkit" type="s"> <key name="keyboards" type="as">
<default>'gtk'</default> <default>['us']</default>
<summary>GUI toolkit used to render keyboard</summary> <summary>Keyboard types</summary>
<description>The name of GUI toolkit (either 'gtk' or 'clutter') used to render keyboard on screen.</description> <description>keyboard types.</description>
</key> </key>
<key name="focus-listener" type="s"> <key name="focus-listener" type="s">
<default>'atspi'</default> <default>'atspi'</default>
@ -16,15 +16,45 @@
<summary>Hide keyboard automatically when focus is out</summary> <summary>Hide keyboard automatically when focus is out</summary>
<description>If true, hide keyboard automatically when focus is out.</description> <description>If true, hide keyboard automatically when focus is out.</description>
</key> </key>
<key name="auto-hide-delay" type="d"> <key name="auto-hide-delay" type="u">
<default>0.5</default> <default>500</default>
<summary>Delay seconds before hiding keyboard</summary> <summary>Delay before hiding keyboard</summary>
<description>Delay seconds before hiding keyboard. This is useful when focus listener is enabled.</description> <description>Delay before hiding keyboard in milliseconds. This is useful when focus listener is enabled.</description>
</key>
<key type="b" name="repeat">
<default>true</default>
<summary>Key repeat</summary>
<description>Generate key-press/release event repeatedly while a key is held down</description>
</key>
<key type="u" name="repeat-interval">
<default>100</default>
<summary>Key repeat interval</summary>
<description>Delay between repeats in milliseconds.</description>
</key>
<key type="u" name="repeat-delay">
<default>1000</default>
<summary>Initial key repeat delay</summary>
<description>Initial key repeat delay in milliseconds.</description>
</key> </key>
<key name="start-fullscreen" type="b"> <key name="start-fullscreen" type="b">
<default>false</default> <default>false</default>
<summary>Switch to fullscreen mode when startup</summary> <summary>Switch to fullscreen mode when startup</summary>
<description>If true, switch to fullscreen mode when startup.</description> <description>If true, switch to fullscreen mode when startup.</description>
</key> </key>
<key name="size-constraint-landscape" type="(dd)">
<default>(1.0, 0.3)</default>
<summary>Constraint of the maximum window size on landscape screen</summary>
<description>Constraint of maximum window size on landscape screen</description>
</key>
<key name="size-constraint-portrait" type="(dd)">
<default>(1.0, 0.5)</default>
<summary>Constraint of the maximum window size on portrait screen</summary>
<description>Constraint of maximum window size on portrait screen</description>
</key>
<key name="theme" type="s">
<default>'default'</default>
<summary>Theme</summary>
<description>Base name of the theme to apply.</description>
</key>
</schema> </schema>
</schemalist> </schemalist>

View File

@ -79,14 +79,10 @@ EXTRA_HFILES=
IGNORE_HFILES = \ IGNORE_HFILES = \
config.h \ config.h \
eek-renderer.h \ eek-renderer.h \
eek-clutter-renderer.h \
eek-clutter-section.h \
eek-clutter-key.h \
eek-gtk-renderer.h \ eek-gtk-renderer.h \
eek-theme.h \
eek-theme-node.h \
eek-enumtypes.h eek-enumtypes.h
if !ENABLE_CLUTTER
IGNORE_HFILES += eek-clutter-keyboard.h eek-clutter.h
endif
# Images to copy into HTML directory. # Images to copy into HTML directory.
# e.g. HTML_IMAGES=$(top_srcdir)/gtk/stock-icons/stock_about_24.png # e.g. HTML_IMAGES=$(top_srcdir)/gtk/stock-icons/stock_about_24.png
@ -109,17 +105,10 @@ expand_content_files=eek-overview.xml
GTKDOC_CFLAGS = $(GIO2_CFLAGS) GTKDOC_CFLAGS = $(GIO2_CFLAGS)
GTKDOC_LIBS = $(top_builddir)/eek/libeek.la \ GTKDOC_LIBS = $(top_builddir)/eek/libeek.la \
$(top_builddir)/eek/libeek-gtk.la \ $(top_builddir)/eek/libeek-gtk.la \
$(top_builddir)/eek/libeek-xkb.la \
$(top_builddir)/eek/libeek-xkl.la \ $(top_builddir)/eek/libeek-xkl.la \
$(GIO2_LIBS) \ $(GIO2_LIBS) \
$(GTK_LIBS) \ $(GTK_LIBS) \
$(XKB_LIBS) $(LIBXKLAVIER_LIBS)
if ENABLE_CLUTTER
GTKDOC_LIBS += \
$(top_builddir)/eek/libeek-clutter.la \
$(CLUTTER_LIBS)
endif
# This includes the standard gtk-doc make rules, copied by gtkdocize. # This includes the standard gtk-doc make rules, copied by gtkdocize.
include $(top_srcdir)/gtk-doc.make include $(top_srcdir)/gtk-doc.make

View File

@ -37,6 +37,7 @@
<title>API Manual</title> <title>API Manual</title>
<chapter> <chapter>
<title>Base Classes, Interfaces, and Utilities</title> <title>Base Classes, Interfaces, and Utilities</title>
<xi:include href="xml/eek.xml"/>
<xi:include href="xml/eek-serializable.xml"/> <xi:include href="xml/eek-serializable.xml"/>
<xi:include href="xml/eek-element.xml"/> <xi:include href="xml/eek-element.xml"/>
<xi:include href="xml/eek-container.xml"/> <xi:include href="xml/eek-container.xml"/>
@ -45,16 +46,17 @@
<xi:include href="xml/eek-key.xml"/> <xi:include href="xml/eek-key.xml"/>
<xi:include href="xml/eek-symbol.xml"/> <xi:include href="xml/eek-symbol.xml"/>
<xi:include href="xml/eek-keysym.xml"/> <xi:include href="xml/eek-keysym.xml"/>
<xi:include href="xml/eek-text.xml"/>
<xi:include href="xml/eek-layout.xml"/> <xi:include href="xml/eek-layout.xml"/>
<xi:include href="xml/eek-types.xml"/> <xi:include href="xml/eek-types.xml"/>
</chapter> </chapter>
<chapter> <chapter>
<title>Clutter Keyboard</title> <title>GTK Adapter</title>
<xi:include href="xml/eek-clutter-keyboard.xml"/> <xi:include href="xml/eek-gtk-keyboard.xml"/>
</chapter> </chapter>
<chapter> <chapter>
<title>GTK Keyboard</title> <title>Clutter Adapter</title>
<xi:include href="xml/eek-gtk-keyboard.xml"/> <xi:include href="xml/eek-clutter-keyboard.xml"/>
</chapter> </chapter>
<chapter> <chapter>
<title>Libxklavier Layout Engine</title> <title>Libxklavier Layout Engine</title>

View File

@ -1,168 +1,28 @@
<SECTION> <SECTION>
<FILE>eek-keyboard</FILE> <FILE>eek</FILE>
<TITLE>EekKeyboard</TITLE> eek_init
EekKeyboard
EekKeyboardClass
eek_keyboard_new
eek_keyboard_get_layout
eek_keyboard_get_size
eek_keyboard_set_size
eek_keyboard_set_symbol_index
eek_keyboard_get_symbol_index
eek_keyboard_set_group
eek_keyboard_set_level
eek_keyboard_get_group
eek_keyboard_get_level
eek_keyboard_set_modifier_behavior
eek_keyboard_get_modifier_behavior
eek_keyboard_get_modifiers
eek_keyboard_create_section
eek_keyboard_find_key_by_keycode
eek_keyboard_add_outline
eek_keyboard_get_outline
eek_keyboard_set_num_lock_mask
eek_keyboard_get_num_lock_mask
eek_keyboard_set_alt_gr_mask
eek_keyboard_get_alt_gr_mask
EekKeyboardPrivate
<SUBSECTION Standard>
EEK_KEYBOARD
EEK_IS_KEYBOARD
EEK_TYPE_KEYBOARD
eek_keyboard_get_type
EEK_KEYBOARD_CLASS
EEK_IS_KEYBOARD_CLASS
EEK_KEYBOARD_GET_CLASS
</SECTION> </SECTION>
<SECTION> <SECTION>
<FILE>eek-layout</FILE> <FILE>eek-clutter</FILE>
<TITLE>EekLayout</TITLE>
EekLayout
EekLayoutClass
<SUBSECTION Standard>
EEK_LAYOUT
EEK_IS_LAYOUT
EEK_TYPE_LAYOUT
eek_layout_get_type
EEK_LAYOUT_CLASS
EEK_IS_LAYOUT_CLASS
EEK_LAYOUT_GET_CLASS
</SECTION> </SECTION>
<SECTION> <SECTION>
<FILE>eek-gtk-keyboard</FILE> <FILE>eek-clutter-key</FILE>
<TITLE>EekGtkKeyboard</TITLE> <TITLE>EekClutterKey</TITLE>
EekGtkKeyboard EekClutterKey
EekGtkKeyboardClass EekClutterKeyClass
eek_gtk_keyboard_new eek_clutter_key_new
eek_gtk_keyboard_set_theme
EekGtkKeyboardPrivate
<SUBSECTION Standard> <SUBSECTION Standard>
EEK_GTK_KEYBOARD EEK_CLUTTER_KEY
EEK_IS_GTK_KEYBOARD EEK_CLUTTER_KEY_CLASS
EEK_TYPE_GTK_KEYBOARD EEK_CLUTTER_KEY_GET_CLASS
eek_gtk_keyboard_get_type EEK_IS_CLUTTER_KEY
EEK_GTK_KEYBOARD_CLASS EEK_IS_CLUTTER_KEY_CLASS
EEK_IS_GTK_KEYBOARD_CLASS EEK_TYPE_CLUTTER_KEY
EEK_GTK_KEYBOARD_GET_CLASS EekClutterKeyPrivate
</SECTION> eek_clutter_key_get_type
<SECTION>
<FILE>eek-theme-node</FILE>
EekSide
EekCorner
eek_theme_node_new
eek_theme_node_get_parent
eek_theme_node_get_theme
eek_theme_node_get_element_type
eek_theme_node_get_element_id
eek_theme_node_get_element_class
eek_theme_node_get_pseudo_class
eek_theme_node_get_color
eek_theme_node_get_background_color
eek_theme_node_get_foreground_color
eek_theme_node_get_background_gradient
eek_theme_node_get_border_width
eek_theme_node_get_border_radius
eek_theme_node_get_border_color
eek_theme_node_get_font
EekThemeNodePrivate
EekThemeNodeClass
<SUBSECTION Standard>
EEK_THEME_NODE
EEK_IS_THEME_NODE
EEK_TYPE_THEME_NODE
eek_theme_node_get_type
EEK_THEME_NODE_CLASS
EEK_IS_THEME_NODE_CLASS
EEK_THEME_NODE_GET_CLASS
</SECTION>
<SECTION>
<FILE>eek-section</FILE>
<TITLE>EekSection</TITLE>
EekSection
EekSectionClass
eek_section_set_angle
eek_section_get_angle
eek_section_get_n_rows
eek_section_add_row
eek_section_get_row
eek_section_create_key
eek_section_find_key_by_keycode
EekSectionPrivate
<SUBSECTION Standard>
EEK_SECTION
EEK_IS_SECTION
EEK_TYPE_SECTION
eek_section_get_type
EEK_SECTION_CLASS
EEK_IS_SECTION_CLASS
EEK_SECTION_GET_CLASS
</SECTION>
<SECTION>
<FILE>eek-theme-context</FILE>
eek_theme_context_new
eek_theme_context_set_theme
eek_theme_context_get_theme
eek_theme_context_set_resolution
eek_theme_context_set_default_resolution
eek_theme_context_get_resolution
eek_theme_context_set_font
eek_theme_context_get_font
eek_theme_context_get_root_node
EekThemeContextClass
<SUBSECTION Standard>
EEK_THEME_CONTEXT
EEK_IS_THEME_CONTEXT
EEK_TYPE_THEME_CONTEXT
eek_theme_context_get_type
EEK_THEME_CONTEXT_CLASS
EEK_IS_THEME_CONTEXT_CLASS
EEK_THEME_CONTEXT_GET_CLASS
</SECTION>
<SECTION>
<FILE>eek-container</FILE>
<TITLE>EekContainer</TITLE>
EekCallback
EekCompareFunc
EekContainer
EekContainerClass
eek_container_foreach_child
eek_container_find
eek_container_add_child
EekContainerPrivate
<SUBSECTION Standard>
EEK_CONTAINER
EEK_IS_CONTAINER
EEK_TYPE_CONTAINER
eek_container_get_type
EEK_CONTAINER_CLASS
EEK_IS_CONTAINER_CLASS
EEK_CONTAINER_GET_CLASS
</SECTION> </SECTION>
<SECTION> <SECTION>
@ -172,142 +32,71 @@ EekClutterKeyboard
EekClutterKeyboardClass EekClutterKeyboardClass
eek_clutter_keyboard_new eek_clutter_keyboard_new
eek_clutter_keyboard_set_theme eek_clutter_keyboard_set_theme
EekClutterKeyboardPrivate
<SUBSECTION Standard> <SUBSECTION Standard>
EEK_CLUTTER_KEYBOARD EEK_CLUTTER_KEYBOARD
EEK_IS_CLUTTER_KEYBOARD
EEK_TYPE_CLUTTER_KEYBOARD
eek_clutter_keyboard_get_type
EEK_CLUTTER_KEYBOARD_CLASS EEK_CLUTTER_KEYBOARD_CLASS
EEK_IS_CLUTTER_KEYBOARD_CLASS
EEK_CLUTTER_KEYBOARD_GET_CLASS EEK_CLUTTER_KEYBOARD_GET_CLASS
EEK_IS_CLUTTER_KEYBOARD
EEK_IS_CLUTTER_KEYBOARD_CLASS
EEK_TYPE_CLUTTER_KEYBOARD
EekClutterKeyboardPrivate
eek_clutter_keyboard_get_type
</SECTION> </SECTION>
<SECTION> <SECTION>
<FILE>eek-symbol</FILE> <FILE>eek-clutter-renderer</FILE>
<TITLE>EekSymbol</TITLE> <TITLE>EekClutterRenderer</TITLE>
EekSymbolCategory EekClutterRenderer
EekSymbol EekClutterRendererClass
EekSymbolClass eek_clutter_renderer_new
eek_symbol_new eek_clutter_renderer_render_key
eek_symbol_set_name
eek_symbol_get_name
eek_symbol_set_label
eek_symbol_get_label
eek_symbol_set_category
eek_symbol_get_category
eek_symbol_get_modifier_mask
eek_symbol_set_modifier_mask
eek_symbol_is_modifier
eek_symbol_set_icon_name
eek_symbol_get_icon_name
EekSymbolPrivate
<SUBSECTION Standard> <SUBSECTION Standard>
EEK_SYMBOL EEK_CLUTTER_RENDERER
EEK_IS_SYMBOL EEK_CLUTTER_RENDERER_CLASS
EEK_TYPE_SYMBOL EEK_CLUTTER_RENDERER_GET_CLASS
eek_symbol_get_type EEK_IS_CLUTTER_RENDERER
EEK_SYMBOL_CLASS EEK_IS_CLUTTER_RENDERER_CLASS
EEK_IS_SYMBOL_CLASS EEK_TYPE_CLUTTER_RENDERER
EEK_SYMBOL_GET_CLASS EekClutterRendererPrivate
eek_clutter_renderer_get_type
</SECTION> </SECTION>
<SECTION> <SECTION>
<FILE>eek-xkl-layout</FILE> <FILE>eek-clutter-section</FILE>
<TITLE>EekXklLayout</TITLE> <TITLE>EekClutterSection</TITLE>
EekXklLayout EekClutterSection
EekXklLayoutClass EekClutterSectionClass
eek_xkl_layout_new eek_clutter_section_new
eek_xkl_layout_set_config
eek_xkl_layout_set_config_full
eek_xkl_layout_set_model
eek_xkl_layout_set_layouts
eek_xkl_layout_set_variants
eek_xkl_layout_set_options
eek_xkl_layout_enable_option
eek_xkl_layout_disable_option
eek_xkl_layout_get_model
eek_xkl_layout_get_layouts
eek_xkl_layout_get_variants
eek_xkl_layout_get_options
eek_xkl_layout_get_option
EekXklLayoutPrivate
<SUBSECTION Standard> <SUBSECTION Standard>
EEK_XKL_LAYOUT EEK_CLUTTER_SECTION
EEK_IS_XKL_LAYOUT EEK_CLUTTER_SECTION_CLASS
EEK_TYPE_XKL_LAYOUT EEK_CLUTTER_SECTION_GET_CLASS
eek_xkl_layout_get_type EEK_IS_CLUTTER_SECTION
EEK_XKL_LAYOUT_CLASS EEK_IS_CLUTTER_SECTION_CLASS
EEK_IS_XKL_LAYOUT_CLASS EEK_TYPE_CLUTTER_SECTION
EEK_XKL_LAYOUT_GET_CLASS EekClutterSectionPrivate
eek_clutter_section_get_type
</SECTION> </SECTION>
<SECTION> <SECTION>
<FILE>eek-xkb-layout</FILE> <FILE>eek-container</FILE>
<TITLE>EekXkbLayout</TITLE> <TITLE>EekContainer</TITLE>
EekXkbLayout EekCallback
EekXkbLayoutClass EekCompareFunc
eek_xkb_layout_new EekContainer
eek_xkb_layout_set_names EekContainerClass
eek_xkb_layout_set_names_full eek_container_add_child
eek_xkb_layout_set_names_full_valist eek_container_find
eek_xkb_layout_set_keycodes eek_container_foreach_child
eek_xkb_layout_set_geometry
eek_xkb_layout_set_symbols
eek_xkb_layout_get_keycodes
eek_xkb_layout_get_geometry
eek_xkb_layout_get_symbols
EekXkbLayoutPrivate
<SUBSECTION Standard> <SUBSECTION Standard>
EEK_XKB_LAYOUT EEK_CONTAINER
EEK_IS_XKB_LAYOUT EEK_CONTAINER_CLASS
EEK_TYPE_XKB_LAYOUT EEK_CONTAINER_GET_CLASS
eek_xkb_layout_get_type EEK_IS_CONTAINER
EEK_XKB_LAYOUT_CLASS EEK_IS_CONTAINER_CLASS
EEK_IS_XKB_LAYOUT_CLASS EEK_TYPE_CONTAINER
EEK_XKB_LAYOUT_GET_CLASS EekContainerPrivate
</SECTION> eek_container_get_type
<SECTION>
<FILE>eek-key</FILE>
<TITLE>EekKey</TITLE>
EekKey
EekKeyClass
eek_key_set_keycode
eek_key_get_keycode
eek_key_set_symbol_matrix
eek_key_get_symbol_matrix
eek_key_get_symbol
eek_key_get_symbol_with_fallback
eek_key_get_symbol_at_index
eek_key_set_index
eek_key_get_index
eek_key_set_oref
eek_key_get_oref
eek_key_is_pressed
EekKeyPrivate
<SUBSECTION Standard>
EEK_KEY
EEK_IS_KEY
EEK_TYPE_KEY
eek_key_get_type
EEK_KEY_CLASS
EEK_IS_KEY_CLASS
EEK_KEY_GET_CLASS
</SECTION>
<SECTION>
<FILE>eek-serializable</FILE>
<TITLE>EekSerializable</TITLE>
EekSerializableIface
eek_serializable_serialize
eek_serializable_deserialize
<SUBSECTION Standard>
EEK_SERIALIZABLE
EEK_IS_SERIALIZABLE
EEK_TYPE_SERIALIZABLE
eek_serializable_get_type
EEK_SERIALIZABLE_GET_IFACE
</SECTION> </SECTION>
<SECTION> <SECTION>
@ -315,86 +104,417 @@ EEK_SERIALIZABLE_GET_IFACE
<TITLE>EekElement</TITLE> <TITLE>EekElement</TITLE>
EekElement EekElement
EekElementClass EekElementClass
eek_element_set_parent
eek_element_get_parent
eek_element_set_name
eek_element_get_name
eek_element_set_bounds
eek_element_get_bounds
eek_element_set_position
eek_element_set_size
eek_element_get_absolute_position eek_element_get_absolute_position
eek_element_set_symbol_index eek_element_get_bounds
eek_element_get_symbol_index
eek_element_set_group
eek_element_set_level
eek_element_get_group eek_element_get_group
eek_element_get_level eek_element_get_level
EekElementPrivate eek_element_get_name
eek_element_get_parent
eek_element_get_symbol_index
eek_element_set_bounds
eek_element_set_group
eek_element_set_level
eek_element_set_name
eek_element_set_parent
eek_element_set_position
eek_element_set_size
eek_element_set_symbol_index
<SUBSECTION Standard> <SUBSECTION Standard>
EEK_ELEMENT EEK_ELEMENT
EEK_IS_ELEMENT
EEK_TYPE_ELEMENT
eek_element_get_type
EEK_ELEMENT_CLASS EEK_ELEMENT_CLASS
EEK_IS_ELEMENT_CLASS
EEK_ELEMENT_GET_CLASS EEK_ELEMENT_GET_CLASS
EEK_IS_ELEMENT
EEK_IS_ELEMENT_CLASS
EEK_TYPE_ELEMENT
EekElementPrivate
eek_element_get_type
</SECTION> </SECTION>
<SECTION> <SECTION>
<FILE>eek-xml-layout</FILE> <FILE>eek-gtk</FILE>
<TITLE>EekXmlLayout</TITLE>
EekXmlLayout
EekXmlLayoutClass
eek_xml_layout_new
eek_xml_layout_set_source
eek_xml_layout_get_source
EekXmlLayoutPrivate
<SUBSECTION Standard>
EEK_XML_LAYOUT
EEK_IS_XML_LAYOUT
EEK_TYPE_XML_LAYOUT
eek_xml_layout_get_type
EEK_XML_LAYOUT_CLASS
EEK_IS_XML_LAYOUT_CLASS
EEK_XML_LAYOUT_GET_CLASS
</SECTION> </SECTION>
<SECTION> <SECTION>
<FILE>eek-theme</FILE> <FILE>eek-gtk-keyboard</FILE>
eek_theme_new <TITLE>EekGtkKeyboard</TITLE>
eek_theme_load_stylesheet EekGtkKeyboard
eek_theme_unload_stylesheet EekGtkKeyboardClass
EekThemeClass eek_gtk_keyboard_new
eek_gtk_keyboard_set_theme
<SUBSECTION Standard> <SUBSECTION Standard>
EEK_THEME EEK_GTK_KEYBOARD
EEK_IS_THEME EEK_GTK_KEYBOARD_CLASS
EEK_TYPE_THEME EEK_GTK_KEYBOARD_GET_CLASS
eek_theme_get_type EEK_IS_GTK_KEYBOARD
EEK_THEME_CLASS EEK_IS_GTK_KEYBOARD_CLASS
EEK_IS_THEME_CLASS EEK_TYPE_GTK_KEYBOARD
EEK_THEME_GET_CLASS EekGtkKeyboardPrivate
eek_gtk_keyboard_get_type
</SECTION>
<SECTION>
<FILE>eek-key</FILE>
<TITLE>EekKey</TITLE>
EekKey
EekKeyClass
eek_key_get_index
eek_key_get_keycode
eek_key_get_oref
eek_key_get_symbol
eek_key_get_symbol_at_index
eek_key_get_symbol_matrix
eek_key_get_symbol_with_fallback
eek_key_is_locked
eek_key_is_pressed
eek_key_set_index
eek_key_set_keycode
eek_key_set_oref
eek_key_set_symbol_matrix
<SUBSECTION Standard>
EEK_IS_KEY
EEK_IS_KEY_CLASS
EEK_KEY
EEK_KEY_CLASS
EEK_KEY_GET_CLASS
EEK_TYPE_KEY
EekKeyPrivate
eek_key_get_type
</SECTION>
<SECTION>
<FILE>eek-keyboard</FILE>
<TITLE>EekKeyboard</TITLE>
EekKeyboard
EekKeyboardClass
EekModifierKey
eek_keyboard_add_outline
eek_keyboard_create_section
eek_keyboard_find_key_by_keycode
eek_keyboard_get_alt_gr_mask
eek_keyboard_get_group
eek_keyboard_get_layout
eek_keyboard_get_level
eek_keyboard_get_locked_keys
eek_keyboard_get_modifier_behavior
eek_keyboard_get_modifiers
eek_keyboard_get_num_lock_mask
eek_keyboard_get_outline
eek_keyboard_get_pressed_keys
eek_keyboard_get_size
eek_keyboard_get_symbol_index
eek_keyboard_new
eek_keyboard_set_alt_gr_mask
eek_keyboard_set_group
eek_keyboard_set_level
eek_keyboard_set_modifier_behavior
eek_keyboard_set_modifiers
eek_keyboard_set_num_lock_mask
eek_keyboard_set_size
eek_keyboard_set_symbol_index
<SUBSECTION Standard>
EEK_IS_KEYBOARD
EEK_IS_KEYBOARD_CLASS
EEK_KEYBOARD
EEK_KEYBOARD_CLASS
EEK_KEYBOARD_GET_CLASS
EEK_TYPE_KEYBOARD
EekKeyboardPrivate
eek_keyboard_get_type
</SECTION> </SECTION>
<SECTION> <SECTION>
<FILE>eek-keysym</FILE> <FILE>eek-keysym</FILE>
<TITLE>EekKeysym</TITLE> <TITLE>EekKeysym</TITLE>
EEK_KEYSYM
EekKeysym EekKeysym
EekKeysymClass EekKeysymClass
eek_keysym_new
eek_keysym_get_xkeysym eek_keysym_get_xkeysym
eek_keysym_new
eek_keysym_new_from_name eek_keysym_new_from_name
eek_keysym_new_with_modifier eek_keysym_new_with_modifier
EekKeysymPrivate
<SUBSECTION Standard> <SUBSECTION Standard>
EEK_INVALID_KEYSYM EEK_INVALID_KEYSYM
EEK_IS_KEYSYM EEK_IS_KEYSYM
EEK_TYPE_KEYSYM
eek_keysym_get_type
EEK_KEYSYM_CLASS
EEK_IS_KEYSYM_CLASS EEK_IS_KEYSYM_CLASS
EEK_KEYSYM
EEK_KEYSYM_CLASS
EEK_KEYSYM_GET_CLASS EEK_KEYSYM_GET_CLASS
EEK_TYPE_KEYSYM
EekKeysymPrivate
eek_keysym_get_type
</SECTION>
<SECTION>
<FILE>eek-layout</FILE>
<TITLE>EekLayout</TITLE>
EekLayout
EekLayoutClass
<SUBSECTION Standard>
EEK_IS_LAYOUT
EEK_IS_LAYOUT_CLASS
EEK_LAYOUT
EEK_LAYOUT_CLASS
EEK_LAYOUT_GET_CLASS
EEK_TYPE_LAYOUT
eek_layout_get_type
</SECTION>
<SECTION>
<FILE>eek-marshalers</FILE>
</SECTION>
<SECTION>
<FILE>eek-section</FILE>
<TITLE>EekSection</TITLE>
EekSection
EekSectionClass
eek_section_add_row
eek_section_create_key
eek_section_find_key_by_keycode
eek_section_get_angle
eek_section_get_n_rows
eek_section_get_row
eek_section_set_angle
<SUBSECTION Standard>
EEK_IS_SECTION
EEK_IS_SECTION_CLASS
EEK_SECTION
EEK_SECTION_CLASS
EEK_SECTION_GET_CLASS
EEK_TYPE_SECTION
EekSectionPrivate
eek_section_get_type
</SECTION>
<SECTION>
<FILE>eek-serializable</FILE>
<TITLE>EekSerializable</TITLE>
EekSerializableIface
eek_serializable_deserialize
eek_serializable_serialize
<SUBSECTION Standard>
EEK_IS_SERIALIZABLE
EEK_SERIALIZABLE
EEK_SERIALIZABLE_GET_IFACE
EEK_TYPE_SERIALIZABLE
eek_serializable_get_type
</SECTION>
<SECTION>
<FILE>eek-special-keysym-entries</FILE>
</SECTION>
<SECTION>
<FILE>eek-symbol</FILE>
<TITLE>EekSymbol</TITLE>
EekSymbol
EekSymbolCategory
EekSymbolClass
eek_symbol_category_from_name
eek_symbol_category_get_name
eek_symbol_get_category
eek_symbol_get_icon_name
eek_symbol_get_label
eek_symbol_get_modifier_mask
eek_symbol_get_name
eek_symbol_is_modifier
eek_symbol_new
eek_symbol_set_category
eek_symbol_set_icon_name
eek_symbol_set_label
eek_symbol_set_modifier_mask
eek_symbol_set_name
<SUBSECTION Standard>
EEK_IS_SYMBOL
EEK_IS_SYMBOL_CLASS
EEK_SYMBOL
EEK_SYMBOL_CLASS
EEK_SYMBOL_GET_CLASS
EEK_TYPE_SYMBOL
EekSymbolPrivate
eek_symbol_get_type
</SECTION>
<SECTION>
<FILE>eek-symbol-matrix</FILE>
EekSymbolMatrix
eek_symbol_matrix_copy
eek_symbol_matrix_free
eek_symbol_matrix_get_symbol
eek_symbol_matrix_new
eek_symbol_matrix_set_symbol
<SUBSECTION Standard>
EEK_TYPE_SYMBOL_MATRIX
eek_symbol_matrix_get_type
</SECTION>
<SECTION>
<FILE>eek-text</FILE>
<TITLE>EekText</TITLE>
EekText
EekTextClass
eek_text_get_text
eek_text_new
<SUBSECTION Standard>
EEK_IS_TEXT
EEK_IS_TEXT_CLASS
EEK_TEXT
EEK_TEXT_CLASS
EEK_TEXT_GET_CLASS
EEK_TYPE_TEXT
EekTextPrivate
eek_text_get_type
</SECTION>
<SECTION>
<FILE>eek-theme-context</FILE>
EekThemeContextClass
eek_theme_context_get_font
eek_theme_context_get_resolution
eek_theme_context_get_root_node
eek_theme_context_get_theme
eek_theme_context_new
eek_theme_context_set_default_resolution
eek_theme_context_set_font
eek_theme_context_set_resolution
eek_theme_context_set_theme
<SUBSECTION Standard>
EEK_IS_THEME_CONTEXT
EEK_IS_THEME_CONTEXT_CLASS
EEK_THEME_CONTEXT
EEK_THEME_CONTEXT_CLASS
EEK_THEME_CONTEXT_GET_CLASS
EEK_TYPE_THEME_CONTEXT
eek_theme_context_get_type
</SECTION>
<SECTION>
<FILE>eek-theme-private</FILE>
</SECTION>
<SECTION>
<FILE>eek-types</FILE>
EEK_INVALID_KEYCODE
EekBounds
EekColor
EekContainer
EekElement
EekGradientType
EekKey
EekKeyboard
EekKeysym
EekModifierBehavior
EekModifierType
EekOrientation
EekOutline
EekPoint
EekSection
EekSymbol
EekSymbolMatrix
EekText
EekTheme
EekThemeContext
EekThemeNode
I_
eek_bounds_copy
eek_bounds_free
eek_bounds_long_side
eek_color_copy
eek_color_free
eek_color_new
eek_outline_copy
eek_outline_free
eek_point_copy
eek_point_free
eek_point_rotate
<SUBSECTION Standard>
EEK_TYPE_BOUNDS
EEK_TYPE_COLOR
EEK_TYPE_OUTLINE
EEK_TYPE_POINT
eek_bounds_get_type
eek_color_get_type
eek_outline_get_type
eek_point_get_type
</SECTION>
<SECTION>
<FILE>eek-unicode-keysym-entries</FILE>
</SECTION>
<SECTION>
<FILE>eek-xkb</FILE>
</SECTION>
<SECTION>
<FILE>eek-xkb-layout</FILE>
<TITLE>EekXkbLayout</TITLE>
EekXkbLayout
EekXkbLayoutClass
eek_xkb_layout_get_geometry
eek_xkb_layout_get_keycodes
eek_xkb_layout_get_symbols
eek_xkb_layout_new
eek_xkb_layout_set_geometry
eek_xkb_layout_set_keycodes
eek_xkb_layout_set_names
eek_xkb_layout_set_names_full
eek_xkb_layout_set_names_full_valist
eek_xkb_layout_set_symbols
<SUBSECTION Standard>
EEK_IS_XKB_LAYOUT
EEK_IS_XKB_LAYOUT_CLASS
EEK_TYPE_XKB_LAYOUT
EEK_XKB_LAYOUT
EEK_XKB_LAYOUT_CLASS
EEK_XKB_LAYOUT_GET_CLASS
EekXkbLayoutPrivate
eek_xkb_layout_get_type
</SECTION>
<SECTION>
<FILE>eek-xkeysym-keysym-entries</FILE>
</SECTION>
<SECTION>
<FILE>eek-xkl</FILE>
</SECTION>
<SECTION>
<FILE>eek-xkl-layout</FILE>
<TITLE>EekXklLayout</TITLE>
EekXklLayout
EekXklLayoutClass
eek_xkl_layout_disable_option
eek_xkl_layout_enable_option
eek_xkl_layout_get_layouts
eek_xkl_layout_get_model
eek_xkl_layout_get_option
eek_xkl_layout_get_options
eek_xkl_layout_get_variants
eek_xkl_layout_new
eek_xkl_layout_set_config
eek_xkl_layout_set_config_full
eek_xkl_layout_set_layouts
eek_xkl_layout_set_model
eek_xkl_layout_set_options
eek_xkl_layout_set_variants
<SUBSECTION Standard>
EEK_IS_XKL_LAYOUT
EEK_IS_XKL_LAYOUT_CLASS
EEK_TYPE_XKL_LAYOUT
EEK_XKL_LAYOUT
EEK_XKL_LAYOUT_CLASS
EEK_XKL_LAYOUT_GET_CLASS
EekXklLayoutPrivate
eek_xkl_layout_get_type
</SECTION> </SECTION>
<SECTION> <SECTION>
@ -404,50 +524,21 @@ eek_keyboard_output
</SECTION> </SECTION>
<SECTION> <SECTION>
<FILE>eek-types</FILE> <FILE>eek-xml-layout</FILE>
I_ <TITLE>EekXmlLayout</TITLE>
EEK_TYPE_POINT EekXmlLayout
EEK_TYPE_BOUNDS EekXmlLayoutClass
EEK_TYPE_OUTLINE eek_xml_layout_get_source
EEK_TYPE_COLOR eek_xml_layout_new
EekOrientation eek_xml_layout_set_source
EekModifierBehavior <SUBSECTION Standard>
EekModifierType EEK_IS_XML_LAYOUT
EEK_INVALID_KEYCODE EEK_IS_XML_LAYOUT_CLASS
EekPoint EEK_TYPE_XML_LAYOUT
eek_point_get_type EEK_XML_LAYOUT
eek_point_copy EEK_XML_LAYOUT_CLASS
eek_point_free EEK_XML_LAYOUT_GET_CLASS
eek_point_rotate EekXmlLayoutPrivate
EekBounds eek_xml_layout_get_type
eek_bounds_get_type
eek_bounds_copy
eek_bounds_free
eek_bounds_long_side
EekOutline
eek_outline_get_type
eek_outline_copy
eek_outline_free
EekColor
eek_color_get_type
eek_color_new
eek_color_copy
eek_color_free
EekGradientType
EekThemeNode
EekThemeContext
EekTheme
</SECTION>
<SECTION>
<FILE>eek-symbol-matrix</FILE>
EekSymbolMatrix
EEK_TYPE_SYMBOL_MATRIX
eek_symbol_matrix_get_type
eek_symbol_matrix_new
eek_symbol_matrix_copy
eek_symbol_matrix_free
eek_symbol_matrix_set_symbol
eek_symbol_matrix_get_symbol
</SECTION> </SECTION>

View File

@ -35,10 +35,15 @@
<part id="apireference"> <part id="apireference">
<title>API Manual</title> <title>API Manual</title>
<chapter> <chapter>
<title>D-Bus client interface to eekboard-server</title> <title>Client interface to eekboard-server</title>
<xi:include href="xml/eekboard-eekboard.xml"/> <xi:include href="xml/eekboard-client.xml"/>
<xi:include href="xml/eekboard-context.xml"/> <xi:include href="xml/eekboard-context.xml"/>
</chapter> </chapter>
<chapter>
<title>Server interface to implement custom eekboard-server</title>
<xi:include href="xml/eekboard-service.xml"/>
<xi:include href="xml/eekboard-context-service.xml"/>
</chapter>
<chapter id="object-tree"> <chapter id="object-tree">
<title>Object Hierarchy</title> <title>Object Hierarchy</title>
<xi:include href="xml/tree_index.sgml"/> <xi:include href="xml/tree_index.sgml"/>

View File

@ -1,22 +1,41 @@
<SECTION> <SECTION>
<FILE>eekboard-eekboard</FILE> <FILE>eekboard-client</FILE>
<TITLE>EekboardEekboard</TITLE> <TITLE>EekboardClient</TITLE>
EekboardEekboard EekboardClient
EekboardEekboardClass EekboardClientClass
EekboardEekboardPrivate eekboard_client_new
eekboard_eekboard_new eekboard_client_create_context
eekboard_eekboard_create_context eekboard_client_push_context
eekboard_eekboard_push_context eekboard_client_pop_context
eekboard_eekboard_pop_context eekboard_client_destroy_context
eekboard_eekboard_destroy_context EekboardClientPrivate
<SUBSECTION Standard> <SUBSECTION Standard>
EEKBOARD_EEKBOARD EEKBOARD_CLIENT
EEKBOARD_IS_EEKBOARD EEKBOARD_IS_CLIENT
EEKBOARD_TYPE_EEKBOARD EEKBOARD_TYPE_CLIENT
eekboard_eekboard_get_type eekboard_client_get_type
EEKBOARD_EEKBOARD_CLASS EEKBOARD_CLIENT_CLASS
EEKBOARD_IS_EEKBOARD_CLASS EEKBOARD_IS_CLIENT_CLASS
EEKBOARD_EEKBOARD_GET_CLASS EEKBOARD_CLIENT_GET_CLASS
</SECTION>
<SECTION>
<FILE>eekboard-service</FILE>
<TITLE>EekboardService</TITLE>
EEKBOARD_SERVICE_PATH
EEKBOARD_SERVICE_INTERFACE
EekboardService
EekboardServiceClass
eekboard_service_new
EekboardServicePrivate
<SUBSECTION Standard>
EEKBOARD_SERVICE
EEKBOARD_IS_SERVICE
EEKBOARD_TYPE_SERVICE
eekboard_service_get_type
EEKBOARD_SERVICE_CLASS
EEKBOARD_IS_SERVICE_CLASS
EEKBOARD_SERVICE_GET_CLASS
</SECTION> </SECTION>
<SECTION> <SECTION>
@ -24,17 +43,21 @@ EEKBOARD_EEKBOARD_GET_CLASS
<TITLE>EekboardContext</TITLE> <TITLE>EekboardContext</TITLE>
EekboardContext EekboardContext
EekboardContextClass EekboardContextClass
EekboardContextPrivate
eekboard_context_new eekboard_context_new
eekboard_context_add_keyboard
eekboard_context_remove_keyboard
eekboard_context_set_keyboard eekboard_context_set_keyboard
eekboard_context_show_keyboard eekboard_context_show_keyboard
eekboard_context_hide_keyboard eekboard_context_hide_keyboard
eekboard_context_set_group eekboard_context_set_group
eekboard_context_press_key eekboard_context_get_group
eekboard_context_release_key eekboard_context_press_keycode
eekboard_context_release_keycode
eekboard_context_is_keyboard_visible eekboard_context_is_keyboard_visible
eekboard_context_set_enabled eekboard_context_set_enabled
eekboard_context_is_enabled eekboard_context_is_enabled
eekboard_context_set_fullscreen
EekboardContextPrivate
<SUBSECTION Standard> <SUBSECTION Standard>
EEKBOARD_CONTEXT EEKBOARD_CONTEXT
EEKBOARD_IS_CONTEXT EEKBOARD_IS_CONTEXT
@ -45,3 +68,37 @@ EEKBOARD_IS_CONTEXT_CLASS
EEKBOARD_CONTEXT_GET_CLASS EEKBOARD_CONTEXT_GET_CLASS
</SECTION> </SECTION>
<SECTION>
<FILE>eekboard-context-service</FILE>
<TITLE>EekboardContextService</TITLE>
EEKBOARD_CONTEXT_SERVICE_PATH
EEKBOARD_CONTEXT_SERVICE_INTERFACE
EekboardContextService
EekboardContextServiceClass
eekboard_context_service_enable
eekboard_context_service_disable
eekboard_context_service_get_keyboard
eekboard_context_service_get_fullscreen
eekboard_context_service_get_client_name
EekboardContextServicePrivate
<SUBSECTION Standard>
EEKBOARD_CONTEXT_SERVICE
EEKBOARD_IS_CONTEXT_SERVICE
EEKBOARD_TYPE_CONTEXT_SERVICE
eekboard_context_service_get_type
EEKBOARD_CONTEXT_SERVICE_CLASS
EEKBOARD_IS_CONTEXT_SERVICE_CLASS
EEKBOARD_CONTEXT_SERVICE_GET_CLASS
</SECTION>
<SECTION>
<FILE>eekboard-xklutil</FILE>
eekboard_xkl_config_rec_from_string
eekboard_xkl_config_rec_to_string
eekboard_xkl_list_models
eekboard_xkl_list_layouts
eekboard_xkl_list_option_groups
eekboard_xkl_list_layout_variants
eekboard_xkl_list_options
</SECTION>

View File

@ -1,2 +1,4 @@
eekboard_client_get_type
eekboard_context_get_type eekboard_context_get_type
eekboard_eekboard_get_type eekboard_context_service_get_type
eekboard_service_get_type

View File

@ -19,13 +19,8 @@
lib_LTLIBRARIES = \ lib_LTLIBRARIES = \
libeek.la \ libeek.la \
libeek-gtk.la \ libeek-gtk.la \
libeek-xkb.la \
libeek-xkl.la libeek-xkl.la
if ENABLE_CLUTTER
lib_LTLIBRARIES += libeek-clutter.la
endif
libeek_public_headers = \ libeek_public_headers = \
$(srcdir)/eek-layout.h \ $(srcdir)/eek-layout.h \
$(srcdir)/eek-element.h \ $(srcdir)/eek-element.h \
@ -35,6 +30,7 @@ libeek_public_headers = \
$(srcdir)/eek-key.h \ $(srcdir)/eek-key.h \
$(srcdir)/eek-symbol.h \ $(srcdir)/eek-symbol.h \
$(srcdir)/eek-keysym.h \ $(srcdir)/eek-keysym.h \
$(srcdir)/eek-text.h \
$(srcdir)/eek-symbol-matrix.h \ $(srcdir)/eek-symbol-matrix.h \
$(srcdir)/eek-types.h \ $(srcdir)/eek-types.h \
$(srcdir)/eek-xml.h \ $(srcdir)/eek-xml.h \
@ -54,6 +50,7 @@ libeek_private_headers = \
$(srcdir)/eek-theme-node.h $(srcdir)/eek-theme-node.h
libeek_sources = \ libeek_sources = \
$(srcdir)/eek.c \
$(srcdir)/eek-layout.c \ $(srcdir)/eek-layout.c \
$(srcdir)/eek-element.c \ $(srcdir)/eek-element.c \
$(srcdir)/eek-container.c \ $(srcdir)/eek-container.c \
@ -63,6 +60,7 @@ libeek_sources = \
$(srcdir)/eek-symbol-matrix.c \ $(srcdir)/eek-symbol-matrix.c \
$(srcdir)/eek-symbol.c \ $(srcdir)/eek-symbol.c \
$(srcdir)/eek-keysym.c \ $(srcdir)/eek-keysym.c \
$(srcdir)/eek-text.c \
$(srcdir)/eek-types.c \ $(srcdir)/eek-types.c \
$(srcdir)/eek-serializable.c \ $(srcdir)/eek-serializable.c \
$(srcdir)/eek-xml.c \ $(srcdir)/eek-xml.c \
@ -96,29 +94,20 @@ libeek_la_SOURCES = \
$(srcdir)/eek-enumtypes.c \ $(srcdir)/eek-enumtypes.c \
$(srcdir)/eek-marshalers.c $(srcdir)/eek-marshalers.c
libeek_la_CFLAGS = -DEEK_COMPILATION=1 $(GIO2_CFLAGS) $(PANGOCAIRO_CFLAGS) $(LIBCROCO_CFLAGS) libeek_la_CFLAGS = \
libeek_la_LIBADD = $(GIO2_LIBS) $(PANGOCAIRO_LIBS) $(LIBCROCO_LIBS) -lm -DEEK_COMPILATION=1 \
-DKEYBOARDSDIR=\"$(pkgdatadir)/keyboards\" \
$(GIO2_CFLAGS) \
$(PANGOCAIRO_CFLAGS) \
$(LIBCROCO_CFLAGS) \
$(NULL)
if ENABLE_CLUTTER libeek_la_LIBADD = \
libeek_clutter_public_headers = \ $(GIO2_LIBS) \
$(srcdir)/eek-clutter-keyboard.h \ $(PANGOCAIRO_LIBS) \
$(srcdir)/eek-clutter.h $(LIBCROCO_LIBS) \
-lm \
libeek_clutter_private_headers = \ $(NULL)
$(srcdir)/eek-clutter-section.h \
$(srcdir)/eek-clutter-key.h \
$(srcdir)/eek-clutter-renderer.h
libeek_clutter_sources = \
$(srcdir)/eek-clutter-keyboard.c \
$(srcdir)/eek-clutter-section.c \
$(srcdir)/eek-clutter-key.c \
$(srcdir)/eek-clutter-renderer.c
libeek_clutter_la_SOURCES = $(libeek_clutter_sources)
libeek_clutter_la_CFLAGS = -DEEK_COMPILATION=1 $(CLUTTER_CFLAGS)
libeek_clutter_la_LIBADD = libeek.la $(CLUTTER_LIBS)
endif
libeek_gtk_public_headers = \ libeek_gtk_public_headers = \
$(srcdir)/eek-gtk-keyboard.h \ $(srcdir)/eek-gtk-keyboard.h \
@ -130,53 +119,44 @@ libeek_gtk_sources = \
$(srcdir)/eek-gtk-renderer.c $(srcdir)/eek-gtk-renderer.c
libeek_gtk_la_SOURCES = $(libeek_gtk_sources) libeek_gtk_la_SOURCES = $(libeek_gtk_sources)
libeek_gtk_la_CFLAGS = -DEEK_COMPILATION=1 $(GTK_CFLAGS) libeek_gtk_la_CFLAGS = -DEEK_COMPILATION=1 $(GTK_CFLAGS) $(LIBCANBERRA_CFLAGS)
libeek_gtk_la_LIBADD = libeek.la $(GTK_LIBS) libeek_gtk_la_LIBADD = libeek.la $(GTK_LIBS) $(LIBCANBERRA_LIBS)
libeek_xkb_public_headers = \
$(srcdir)/eek-xkb-layout.h \
$(srcdir)/eek-xkb.h
libeek_xkb_sources = \
$(srcdir)/eek-xkb-layout.c
libeek_xkb_la_SOURCES = $(libeek_xkb_sources)
libeek_xkb_la_CFLAGS = -DEEK_COMPILATION=1 $(XKB_CFLAGS) $(GTK_CFLAGS)
libeek_xkb_la_LIBADD = libeek.la $(XKB_LIBS) $(GTK_LIBS)
libeek_xkl_public_headers = \ libeek_xkl_public_headers = \
$(srcdir)/eek-xkl-layout.h \ $(srcdir)/eek-xkl-layout.h \
$(srcdir)/eek-xkl.h $(srcdir)/eek-xkl.h \
$(srcdir)/eek-xkb-layout.h \
$(srcdir)/eek-xkb.h
libeek_xkl_sources = \ libeek_xkl_sources = \
$(srcdir)/eek-xkb-layout.c \
$(srcdir)/eek-xkl-layout.c $(srcdir)/eek-xkl-layout.c
libeek_xkl_la_SOURCES = $(libeek_xkl_sources) libeek_xkl_la_SOURCES = $(libeek_xkl_sources)
libeek_xkl_la_CFLAGS = -DEEK_COMPILATION=1 $(LIBXKLAVIER_CFLAGS) $(GTK_CFLAGS) libeek_xkl_la_CFLAGS = -DEEK_COMPILATION=1 $(LIBXKLAVIER_CFLAGS)
libeek_xkl_la_LIBADD = libeek-xkb.la $(LIBXKLAVIER_LIBS) $(GTK_LIBS) libeek_xkl_la_LIBADD = libeek.la $(LIBXKLAVIER_LIBS)
eekdir = $(includedir)/eek-$(EEK_API_VERSION)/eek eekdir = $(includedir)/eek-$(EEK_API_VERSION)/eek
eek_HEADERS = \ eek_HEADERS = \
$(libeek_public_headers) \ $(libeek_public_headers) \
$(srcdir)/eek-enumtypes.h \ $(srcdir)/eek-enumtypes.h \
$(libeek_clutter_public_headers) \
$(libeek_gtk_public_headers) \ $(libeek_gtk_public_headers) \
$(libeek_xkb_public_headers) \
$(libeek_xkl_public_headers) $(libeek_xkl_public_headers)
noinst_HEADERS = \ noinst_HEADERS = \
$(libeek_private_headers) \ $(libeek_private_headers) \
$(libeek_clutter_private_headers) \
$(libeek_gtk_private_headers) \ $(libeek_gtk_private_headers) \
$(libeek_xkb_private_headers) \
$(libeek_xkl_private_headers) $(libeek_xkl_private_headers)
eek-special-keysym-entries.h: special-keysym-entries.txt eek-special-keysym-entries.h: special-keysym-entries.txt
$(PYTHON) ./gen-keysym-entries.py special_keysym_entries < $< > $@ $(AM_V_GEN) $(PYTHON) ./gen-keysym-entries.py special_keysym_entries \
< $< > $@
eek-unicode-keysym-entries.h: unicode-keysym-entries.txt eek-unicode-keysym-entries.h: unicode-keysym-entries.txt
$(PYTHON) ./gen-keysym-entries.py unicode_keysym_entries < $< > $@ $(AM_V_GEN) $(PYTHON) ./gen-keysym-entries.py unicode_keysym_entries \
< $< > $@
eek-xkeysym-keysym-entries.h: xkeysym-keysym-entries.txt eek-xkeysym-keysym-entries.h: xkeysym-keysym-entries.txt
$(PYTHON) ./gen-keysym-entries.py xkeysym_keysym_entries < $< > $@ $(AM_V_GEN) $(PYTHON) ./gen-keysym-entries.py xkeysym_keysym_entries \
< $< > $@
eek-enumtypes.h: $(libeek_public_headers) eek-enumtypes.h.template eek-enumtypes.h: $(libeek_public_headers) eek-enumtypes.h.template
$(AM_V_GEN) $(GLIB_MKENUMS) --template eek-enumtypes.h.template \ $(AM_V_GEN) $(GLIB_MKENUMS) --template eek-enumtypes.h.template \
@ -202,13 +182,8 @@ pkgconfigdir = $(libdir)/pkgconfig
pkgconfig_DATA = \ pkgconfig_DATA = \
eek-$(EEK_API_VERSION).pc \ eek-$(EEK_API_VERSION).pc \
eek-gtk-$(EEK_API_VERSION).pc \ eek-gtk-$(EEK_API_VERSION).pc \
eek-xkb-$(EEK_API_VERSION).pc \
eek-xkl-$(EEK_API_VERSION).pc eek-xkl-$(EEK_API_VERSION).pc
if ENABLE_CLUTTER
pkgconfig_DATA += eek-clutter-$(EEK_API_VERSION).pc
endif
CLEANFILES = CLEANFILES =
DISTCLEANFILES = \ DISTCLEANFILES = \
@ -232,34 +207,21 @@ INTROSPECTION_COMPILER_ARGS = --includedir=$(srcdir)
if HAVE_INTROSPECTION if HAVE_INTROSPECTION
Eek@EEK_LIBRARY_SUFFIX@.gir: libeek.la Eek@EEK_LIBRARY_SUFFIX@.gir: libeek.la
Eek@EEK_LIBRARY_SUFFIX_U@_gir_SCANNERFLAGS = --strip-prefix=Eek --pkg=glib-2.0 Eek@EEK_LIBRARY_SUFFIX_U@_gir_SCANNERFLAGS = --strip-prefix=Eek --pkg=glib-2.0 --pkg-export=eek-$(EEK_API_VERSION)
Eek@EEK_LIBRARY_SUFFIX_U@_gir_INCLUDES = GLib-2.0 GObject-2.0 Gio-2.0 Eek@EEK_LIBRARY_SUFFIX_U@_gir_INCLUDES = GLib-2.0 GObject-2.0 Gio-2.0
Eek@EEK_LIBRARY_SUFFIX_U@_gir_CFLAGS = $(libeek_la_CFLAGS) Eek@EEK_LIBRARY_SUFFIX_U@_gir_CFLAGS = $(libeek_la_CFLAGS)
Eek@EEK_LIBRARY_SUFFIX_U@_gir_LIBS = libeek.la Eek@EEK_LIBRARY_SUFFIX_U@_gir_LIBS = libeek.la
Eek@EEK_LIBRARY_SUFFIX_U@_gir_FILES = $(libeek_sources) $(libeek_public_headers) $(srcdir)/eek-enumtypes.h Eek@EEK_LIBRARY_SUFFIX_U@_gir_FILES = $(libeek_sources) $(libeek_public_headers) $(srcdir)/eek-enumtypes.h
EekGtk@EEK_LIBRARY_SUFFIX@.gir: libeek-gtk.la Eek@EEK_LIBRARY_SUFFIX@.gir EekGtk@EEK_LIBRARY_SUFFIX@.gir: libeek-gtk.la Eek@EEK_LIBRARY_SUFFIX@.gir
EekGtk@EEK_LIBRARY_SUFFIX_U@_gir_SCANNERFLAGS = --pkg-export=eek-gtk-$(EEK_API_VERSION)
EekGtk@EEK_LIBRARY_SUFFIX_U@_gir_INCLUDES = GObject-2.0 Gtk-@GTK_API_VERSION@ Eek@EEK_LIBRARY_SUFFIX@ EekGtk@EEK_LIBRARY_SUFFIX_U@_gir_INCLUDES = GObject-2.0 Gtk-@GTK_API_VERSION@ Eek@EEK_LIBRARY_SUFFIX@
EekGtk@EEK_LIBRARY_SUFFIX_U@_gir_CFLAGS = $(libeek_gtk_la_CFLAGS) EekGtk@EEK_LIBRARY_SUFFIX_U@_gir_CFLAGS = $(libeek_gtk_la_CFLAGS)
EekGtk@EEK_LIBRARY_SUFFIX_U@_gir_LIBS = libeek-gtk.la EekGtk@EEK_LIBRARY_SUFFIX_U@_gir_LIBS = libeek-gtk.la
EekGtk@EEK_LIBRARY_SUFFIX_U@_gir_FILES = $(libeek_gtk_sources) $(libeek_gtk_public_headers) EekGtk@EEK_LIBRARY_SUFFIX_U@_gir_FILES = $(libeek_gtk_sources) $(libeek_gtk_public_headers)
if ENABLE_CLUTTER EekXkl@EEK_LIBRARY_SUFFIX@.gir: libeek-xkl.la Eek@EEK_LIBRARY_SUFFIX@.gir
EekClutter@EEK_LIBRARY_SUFFIX@.gir: libeek-clutter.la Eek@EEK_LIBRARY_SUFFIX@.gir EekXkl@EEK_LIBRARY_SUFFIX_U@_gir_INCLUDES = GObject-2.0 Eek@EEK_LIBRARY_SUFFIX@
EekClutter@EEK_LIBRARY_SUFFIX_U@_gir_INCLUDES = GObject-2.0 Clutter-1.0 Eek@EEK_LIBRARY_SUFFIX@
EekClutter@EEK_LIBRARY_SUFFIX_U@_gir_CFLAGS = $(libeek_clutter_la_CFLAGS)
EekClutter@EEK_LIBRARY_SUFFIX_U@_gir_LIBS = libeek-clutter.la
EekClutter@EEK_LIBRARY_SUFFIX_U@_gir_FILES = $(libeek_clutter_sources) $(libeek_clutter_public_headers)
endif
EekXkb@EEK_LIBRARY_SUFFIX@.gir: libeek-xkb.la Eek@EEK_LIBRARY_SUFFIX@.gir
EekXkb@EEK_LIBRARY_SUFFIX_U@_gir_INCLUDES = GObject-2.0 Eek@EEK_LIBRARY_SUFFIX@
EekXkb@EEK_LIBRARY_SUFFIX_U@_gir_CFLAGS = $(libeek_xkb_la_CFLAGS)
EekXkb@EEK_LIBRARY_SUFFIX_U@_gir_LIBS = libeek-xkb.la
EekXkb@EEK_LIBRARY_SUFFIX_U@_gir_FILES = $(libeek_xkb_sources) $(libeek_xkb_public_headers)
EekXkl@EEK_LIBRARY_SUFFIX@.gir: libeek-xkl.la EekXkb@EEK_LIBRARY_SUFFIX@.gir
EekXkl@EEK_LIBRARY_SUFFIX_U@_gir_INCLUDES = GObject-2.0 EekXkb@EEK_LIBRARY_SUFFIX@
EekXkl@EEK_LIBRARY_SUFFIX_U@_gir_CFLAGS = $(libeek_xkl_la_CFLAGS) EekXkl@EEK_LIBRARY_SUFFIX_U@_gir_CFLAGS = $(libeek_xkl_la_CFLAGS)
EekXkl@EEK_LIBRARY_SUFFIX_U@_gir_LIBS = libeek-xkl.la EekXkl@EEK_LIBRARY_SUFFIX_U@_gir_LIBS = libeek-xkl.la
EekXkl@EEK_LIBRARY_SUFFIX_U@_gir_FILES = $(libeek_xkl_sources) $(libeek_xkl_public_headers) EekXkl@EEK_LIBRARY_SUFFIX_U@_gir_FILES = $(libeek_xkl_sources) $(libeek_xkl_public_headers)
@ -267,14 +229,8 @@ EekXkl@EEK_LIBRARY_SUFFIX_U@_gir_FILES = $(libeek_xkl_sources) $(libeek_xkl_publ
INTROSPECTION_GIRS += \ INTROSPECTION_GIRS += \
Eek@EEK_LIBRARY_SUFFIX@.gir \ Eek@EEK_LIBRARY_SUFFIX@.gir \
EekGtk@EEK_LIBRARY_SUFFIX@.gir \ EekGtk@EEK_LIBRARY_SUFFIX@.gir \
EekXkb@EEK_LIBRARY_SUFFIX@.gir \
EekXkl@EEK_LIBRARY_SUFFIX@.gir EekXkl@EEK_LIBRARY_SUFFIX@.gir
if ENABLE_CLUTTER
INTROSPECTION_GIRS += \
EekClutter@EEK_LIBRARY_SUFFIX@.gir
endif
girdir = $(datadir)/gir-1.0 girdir = $(datadir)/gir-1.0
gir_DATA = $(INTROSPECTION_GIRS) gir_DATA = $(INTROSPECTION_GIRS)

View File

@ -1,30 +0,0 @@
# Copyright (C) 2010-2011 Daiki Ueno <ueno@unixuser.org>
# Copyright (C) 2010-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
prefix=@prefix@
exec_prefix=@exec_prefix@
libdir=@libdir@
includedir=@includedir@
Name: libeek-clutter
Description: A Library to Create Keyboard-like UI (Clutter Support)
URL: http://fedorahosted.org/eekboard/
Version: @VERSION@
Requires: eek-@EEK_API_VERSION@ clutter-1.0
Libs: -L${libdir} -leek-clutter
Cflags: -I${includedir}/eek-@EEK_API_VERSION@

View File

@ -1,307 +0,0 @@
/*
* Copyright (C) 2010-2011 Daiki Ueno <ueno@unixuser.org>
* Copyright (C) 2010-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 "eek-clutter-key.h"
enum {
PROP_0,
PROP_KEY,
PROP_RENDERER,
PROP_LAST
};
G_DEFINE_TYPE (EekClutterKey, eek_clutter_key, CLUTTER_TYPE_ACTOR);
#define EEK_CLUTTER_KEY_GET_PRIVATE(obj) \
(G_TYPE_INSTANCE_GET_PRIVATE ((obj), EEK_TYPE_CLUTTER_KEY, EekClutterKeyPrivate))
struct _EekClutterKeyPrivate
{
EekKey *key;
EekClutterRenderer *renderer;
gulong pressed_handler;
gulong released_handler;
};
static void
on_pressed (EekKey *key, gpointer user_data)
{
ClutterActor *actor = user_data, *parent;
parent = clutter_actor_get_parent (actor);
clutter_actor_raise_top (parent);
clutter_actor_raise_top (actor);
clutter_actor_set_scale_with_gravity (actor,
1.0,
1.0,
CLUTTER_GRAVITY_CENTER);
clutter_actor_animate (actor, CLUTTER_EASE_IN_SINE, 150,
"scale-x", 1.5,
"scale-y", 1.5,
NULL);
}
static void
on_released (EekKey *key, gpointer user_data)
{
ClutterActor *actor = user_data, *parent;
parent = clutter_actor_get_parent (actor);
clutter_actor_raise_top (parent);
clutter_actor_raise_top (actor);
clutter_actor_set_scale_with_gravity (actor,
1.5,
1.5,
CLUTTER_GRAVITY_CENTER);
clutter_actor_animate (actor, CLUTTER_EASE_OUT_SINE, 150,
"scale-x", 1.0,
"scale-y", 1.0,
NULL);
}
static void
set_position (ClutterActor *self)
{
EekClutterKeyPrivate *priv = EEK_CLUTTER_KEY_GET_PRIVATE(self);
EekBounds bounds;
gdouble scale;
eek_element_get_bounds (EEK_ELEMENT(priv->key), &bounds);
scale = eek_renderer_get_scale (EEK_RENDERER(priv->renderer));
clutter_actor_set_position (self, bounds.x * scale, bounds.y * scale);
}
static void
eek_clutter_key_real_realize (ClutterActor *self)
{
EekClutterKeyPrivate *priv = EEK_CLUTTER_KEY_GET_PRIVATE(self);
set_position (self);
clutter_actor_set_reactive (self, TRUE);
priv->pressed_handler =
g_signal_connect (priv->key, "pressed",
G_CALLBACK(on_pressed), self);
priv->released_handler =
g_signal_connect (priv->key, "released",
G_CALLBACK(on_released), self);
}
static void
eek_clutter_key_real_paint (ClutterActor *self)
{
EekClutterKeyPrivate *priv = EEK_CLUTTER_KEY_GET_PRIVATE(self);
set_position (self);
eek_clutter_renderer_render_key (priv->renderer, self, priv->key);
}
static void
eek_clutter_key_real_get_preferred_width (ClutterActor *self,
gfloat for_height,
gfloat *min_width_p,
gfloat *natural_width_p)
{
EekClutterKeyPrivate *priv = EEK_CLUTTER_KEY_GET_PRIVATE(self);
EekBounds bounds;
gdouble scale;
scale = eek_renderer_get_scale (EEK_RENDERER(priv->renderer));
eek_element_get_bounds (EEK_ELEMENT(priv->key), &bounds);
*min_width_p = 0.0f;
*natural_width_p = bounds.width * scale;
}
static void
eek_clutter_key_real_get_preferred_height (ClutterActor *self,
gfloat for_width,
gfloat *min_height_p,
gfloat *natural_height_p)
{
EekClutterKeyPrivate *priv = EEK_CLUTTER_KEY_GET_PRIVATE(self);
EekBounds bounds;
gdouble scale;
scale = eek_renderer_get_scale (EEK_RENDERER(priv->renderer));
eek_element_get_bounds (EEK_ELEMENT(priv->key), &bounds);
*min_height_p = 0.0f;
*natural_height_p = bounds.height * scale;
}
static void
eek_clutter_key_real_allocate (ClutterActor *self,
const ClutterActorBox *box,
ClutterAllocationFlags flags)
{
CLUTTER_ACTOR_CLASS (eek_clutter_key_parent_class)->
allocate (self, box, flags);
}
static gboolean
eek_clutter_key_real_button_press_event (ClutterActor *self,
ClutterButtonEvent *event)
{
EekClutterKeyPrivate *priv = EEK_CLUTTER_KEY_GET_PRIVATE(self);
g_signal_emit_by_name (priv->key, "pressed");
return TRUE;
}
static gboolean
eek_clutter_key_real_button_release_event (ClutterActor *self,
ClutterButtonEvent *event)
{
EekClutterKeyPrivate *priv = EEK_CLUTTER_KEY_GET_PRIVATE(self);
g_signal_emit_by_name (priv->key, "released");
return TRUE;
}
static gboolean
eek_clutter_key_real_leave_event (ClutterActor *self,
ClutterCrossingEvent *event)
{
EekClutterKeyPrivate *priv = EEK_CLUTTER_KEY_GET_PRIVATE(self);
if (eek_key_is_pressed (priv->key))
g_signal_emit_by_name (priv->key, "released");
return TRUE;
}
static void
eek_clutter_key_set_property (GObject *object,
guint prop_id,
const GValue *value,
GParamSpec *pspec)
{
EekClutterKeyPrivate *priv = EEK_CLUTTER_KEY_GET_PRIVATE(object);
switch (prop_id) {
case PROP_KEY:
priv->key = g_value_get_object (value);
g_object_ref (priv->key);
break;
case PROP_RENDERER:
priv->renderer = g_value_get_object (value);
g_object_ref (priv->renderer);
break;
default:
g_object_set_property (object,
g_param_spec_get_name (pspec),
value);
break;
}
}
static void
eek_clutter_key_dispose (GObject *object)
{
EekClutterKeyPrivate *priv = EEK_CLUTTER_KEY_GET_PRIVATE(object);
if (priv->renderer) {
g_object_unref (priv->renderer);
priv->renderer = NULL;
}
if (priv->key) {
if (g_signal_handler_is_connected (priv->key, priv->pressed_handler))
g_signal_handler_disconnect (priv->key, priv->pressed_handler);
if (g_signal_handler_is_connected (priv->key, priv->released_handler))
g_signal_handler_disconnect (priv->key, priv->released_handler);
g_object_unref (priv->key);
priv->key = NULL;
}
G_OBJECT_CLASS (eek_clutter_key_parent_class)->dispose (object);
}
static void
eek_clutter_key_class_init (EekClutterKeyClass *klass)
{
ClutterActorClass *actor_class = CLUTTER_ACTOR_CLASS (klass);
GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
GParamSpec *pspec;
g_type_class_add_private (gobject_class,
sizeof (EekClutterKeyPrivate));
actor_class->realize = eek_clutter_key_real_realize;
actor_class->paint = eek_clutter_key_real_paint;
actor_class->get_preferred_width =
eek_clutter_key_real_get_preferred_width;
actor_class->get_preferred_height =
eek_clutter_key_real_get_preferred_height;
actor_class->allocate = eek_clutter_key_real_allocate;
/* signals */
actor_class->button_press_event =
eek_clutter_key_real_button_press_event;
actor_class->button_release_event =
eek_clutter_key_real_button_release_event;
actor_class->leave_event =
eek_clutter_key_real_leave_event;
gobject_class->set_property = eek_clutter_key_set_property;
gobject_class->dispose = eek_clutter_key_dispose;
pspec = g_param_spec_object ("key",
"Key",
"Key",
EEK_TYPE_KEY,
G_PARAM_CONSTRUCT_ONLY | G_PARAM_WRITABLE);
g_object_class_install_property (gobject_class,
PROP_KEY,
pspec);
pspec = g_param_spec_object ("renderer",
"Renderer",
"Renderer",
EEK_TYPE_RENDERER,
G_PARAM_CONSTRUCT_ONLY | G_PARAM_WRITABLE);
g_object_class_install_property (gobject_class,
PROP_RENDERER,
pspec);
}
static void
eek_clutter_key_init (EekClutterKey *self)
{
EekClutterKeyPrivate *priv;
priv = self->priv = EEK_CLUTTER_KEY_GET_PRIVATE (self);
priv->key = NULL;
priv->renderer = NULL;
}
ClutterActor *
eek_clutter_key_new (EekKey *key, EekClutterRenderer *renderer)
{
return g_object_new (EEK_TYPE_CLUTTER_KEY,
"key", key,
"renderer", renderer,
NULL);
}

View File

@ -1,63 +0,0 @@
/*
* Copyright (C) 2010-2011 Daiki Ueno <ueno@unixuser.org>
* Copyright (C) 2010-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
*/
#ifndef EEK_CLUTTER_KEY_H
#define EEK_CLUTTER_KEY_H 1
#include <clutter/clutter.h>
#include "eek-key.h"
#include "eek-clutter-renderer.h"
G_BEGIN_DECLS
#define EEK_TYPE_CLUTTER_KEY (eek_clutter_key_get_type())
#define EEK_CLUTTER_KEY(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), EEK_TYPE_CLUTTER_KEY, EekClutterKey))
#define EEK_CLUTTER_KEY_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), EEK_TYPE_CLUTTER_KEY, EekClutterKeyClass))
#define EEK_IS_CLUTTER_KEY(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), EEK_TYPE_CLUTTER_KEY))
#define EEK_IS_CLUTTER_KEY_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), EEK_TYPE_CLUTTER_KEY))
#define EEK_CLUTTER_KEY_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), EEK_TYPE_CLUTTER_KEY, EekClutterKeyClass))
typedef struct _EekClutterKey EekClutterKey;
typedef struct _EekClutterKeyClass EekClutterKeyClass;
typedef struct _EekClutterKeyPrivate EekClutterKeyPrivate;
struct _EekClutterKey
{
/*< private >*/
ClutterActor parent;
/*< private >*/
EekClutterKeyPrivate *priv;
};
struct _EekClutterKeyClass
{
/*< private >*/
ClutterActorClass parent_class;
/*< private >*/
/* padding */
gpointer pdummy[24];
};
GType eek_clutter_key_get_type (void) G_GNUC_CONST;
ClutterActor *eek_clutter_key_new (EekKey *key,
EekClutterRenderer *renderer);
G_END_DECLS
#endif /* EEK_CLUTTER_KEY_H */

View File

@ -1,272 +0,0 @@
/*
* Copyright (C) 2010-2011 Daiki Ueno <ueno@unixuser.org>
* Copyright (C) 2010-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
*/
/**
* SECTION:eek-clutter-keyboard
* @short_description: a #ClutterActor displaying #EekKeyboard
*/
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif /* HAVE_CONFIG_H */
#include <string.h>
#include <gdk-pixbuf/gdk-pixbuf.h>
#include "eek-clutter-keyboard.h"
#include "eek-clutter-section.h"
#include "eek-clutter-renderer.h"
#include "eek-keyboard.h"
enum {
PROP_0,
PROP_KEYBOARD,
PROP_LAST
};
G_DEFINE_TYPE (EekClutterKeyboard, eek_clutter_keyboard, CLUTTER_TYPE_GROUP);
#define EEK_CLUTTER_KEYBOARD_GET_PRIVATE(obj) \
(G_TYPE_INSTANCE_GET_PRIVATE ((obj), EEK_TYPE_CLUTTER_KEYBOARD, EekClutterKeyboardPrivate))
struct _EekClutterKeyboardPrivate
{
EekKeyboard *keyboard;
EekClutterRenderer *renderer;
EekTheme *theme;
};
struct _CreateSectionCallbackData {
ClutterActor *actor;
EekClutterRenderer *renderer;
};
typedef struct _CreateSectionCallbackData CreateSectionCallbackData;
static void
create_section (EekElement *element, gpointer user_data)
{
CreateSectionCallbackData *data = user_data;
ClutterActor *section;
section = eek_clutter_section_new (EEK_SECTION(element), data->renderer);
clutter_container_add_actor (CLUTTER_CONTAINER(data->actor), section);
}
static void
eek_clutter_keyboard_real_realize (ClutterActor *self)
{
EekClutterKeyboardPrivate *priv;
CreateSectionCallbackData data;
EekBounds bounds;
gdouble scale;
priv = EEK_CLUTTER_KEYBOARD_GET_PRIVATE(self);
if (priv->theme)
eek_renderer_set_theme (EEK_RENDERER(priv->renderer), priv->theme);
scale = eek_renderer_get_scale (EEK_RENDERER(priv->renderer));
clutter_actor_set_position (CLUTTER_ACTOR(self),
bounds.x * scale,
bounds.y * scale);
data.actor = CLUTTER_ACTOR(self);
data.renderer = priv->renderer;
eek_container_foreach_child (EEK_CONTAINER(priv->keyboard),
create_section,
&data);
}
static void
eek_clutter_keyboard_real_get_preferred_width (ClutterActor *self,
float for_height,
float *min_width_p,
float *natural_width_p)
{
EekClutterKeyboardPrivate *priv = EEK_CLUTTER_KEYBOARD_GET_PRIVATE(self);
gdouble width;
eek_renderer_get_size (EEK_RENDERER(priv->renderer), &width, NULL);
*min_width_p = 0.0f;
*natural_width_p = width;
}
static void
eek_clutter_keyboard_real_get_preferred_height (ClutterActor *self,
float for_width,
float *min_height_p,
float *natural_height_p)
{
EekClutterKeyboardPrivate *priv = EEK_CLUTTER_KEYBOARD_GET_PRIVATE(self);
gdouble height;
eek_renderer_get_size (EEK_RENDERER(priv->renderer), NULL, &height);
*min_height_p = 0.0f;
*natural_height_p = height;
}
static void
eek_clutter_keyboard_real_allocate (ClutterActor *self,
const ClutterActorBox *box,
ClutterAllocationFlags flags)
{
EekClutterKeyboardPrivate *priv = EEK_CLUTTER_KEYBOARD_GET_PRIVATE(self);
eek_renderer_set_allocation_size (EEK_RENDERER(priv->renderer),
box->x2 - box->x1,
box->y2 - box->y1);
CLUTTER_ACTOR_CLASS (eek_clutter_keyboard_parent_class)->
allocate (self, box, flags);
}
static void
create_renderer (EekClutterKeyboard *self)
{
EekClutterKeyboardPrivate *priv = EEK_CLUTTER_KEYBOARD_GET_PRIVATE(self);
PangoContext *pcontext;
PangoFontDescription *font;
EekBounds bounds;
pcontext = clutter_actor_get_pango_context (CLUTTER_ACTOR(self));
font = pango_font_description_from_string ("Sans 48px");
pango_context_set_font_description (pcontext, font);
pango_font_description_free (font);
priv->renderer = eek_clutter_renderer_new (priv->keyboard, pcontext);
eek_element_get_bounds (EEK_ELEMENT(priv->keyboard), &bounds);
eek_renderer_set_allocation_size (EEK_RENDERER(priv->renderer),
bounds.width,
bounds.height);
}
static void
eek_clutter_keyboard_set_property (GObject *object,
guint prop_id,
const GValue *value,
GParamSpec *pspec)
{
EekClutterKeyboardPrivate *priv = EEK_CLUTTER_KEYBOARD_GET_PRIVATE(object);
switch (prop_id) {
case PROP_KEYBOARD:
priv->keyboard = g_value_get_object (value);
g_object_ref (priv->keyboard);
create_renderer (EEK_CLUTTER_KEYBOARD(object));
break;
default:
g_object_set_property (object,
g_param_spec_get_name (pspec),
value);
break;
}
}
static void
eek_clutter_keyboard_dispose (GObject *object)
{
EekClutterKeyboardPrivate *priv = EEK_CLUTTER_KEYBOARD_GET_PRIVATE(object);
if (priv->renderer) {
g_object_unref (G_OBJECT(priv->renderer));
priv->renderer = NULL;
}
if (priv->keyboard) {
g_object_unref (priv->keyboard);
priv->keyboard = NULL;
}
if (priv->theme) {
g_object_unref (priv->theme);
priv->keyboard = NULL;
}
G_OBJECT_CLASS (eek_clutter_keyboard_parent_class)->dispose (object);
}
static void
eek_clutter_keyboard_class_init (EekClutterKeyboardClass *klass)
{
ClutterActorClass *actor_class = CLUTTER_ACTOR_CLASS (klass);
GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
GParamSpec *pspec;
g_type_class_add_private (gobject_class,
sizeof (EekClutterKeyboardPrivate));
actor_class->realize =
eek_clutter_keyboard_real_realize;
actor_class->get_preferred_width =
eek_clutter_keyboard_real_get_preferred_width;
actor_class->get_preferred_height =
eek_clutter_keyboard_real_get_preferred_height;
actor_class->allocate = eek_clutter_keyboard_real_allocate;
gobject_class->set_property = eek_clutter_keyboard_set_property;
gobject_class->dispose = eek_clutter_keyboard_dispose;
pspec = g_param_spec_object ("keyboard",
"Keyboard",
"Keyboard",
EEK_TYPE_KEYBOARD,
G_PARAM_CONSTRUCT_ONLY | G_PARAM_WRITABLE);
g_object_class_install_property (gobject_class,
PROP_KEYBOARD,
pspec);
}
static void
eek_clutter_keyboard_init (EekClutterKeyboard *self)
{
EekClutterKeyboardPrivate *priv;
priv = self->priv = EEK_CLUTTER_KEYBOARD_GET_PRIVATE(self);
priv->keyboard = NULL;
priv->renderer = NULL;
}
/**
* eek_clutter_keyboard_new:
* @keyboard: an #EekKeyboard
*
* Create a new #ClutterActor displaying @keyboard.
* Returns: a #ClutterActor
*/
ClutterActor *
eek_clutter_keyboard_new (EekKeyboard *keyboard)
{
return g_object_new (EEK_TYPE_CLUTTER_KEYBOARD, "keyboard", keyboard, NULL);
}
void
eek_clutter_keyboard_set_theme (EekClutterKeyboard *keyboard,
EekTheme *theme)
{
EekClutterKeyboardPrivate *priv;
g_return_if_fail (EEK_IS_CLUTTER_KEYBOARD(keyboard));
g_return_if_fail (EEK_IS_THEME(theme));
priv = EEK_CLUTTER_KEYBOARD_GET_PRIVATE(keyboard);
priv->theme = g_object_ref (theme);
}

View File

@ -1,67 +0,0 @@
/*
* Copyright (C) 2010-2011 Daiki Ueno <ueno@unixuser.org>
* Copyright (C) 2010-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
*/
#if !defined(__EEK_H_INSIDE__) && !defined(EEK_COMPILATION)
#error "Only <eek/eek-clutter.h> can be included directly."
#endif
#ifndef EEK_CLUTTER_KEYBOARD_H
#define EEK_CLUTTER_KEYBOARD_H 1
#include <clutter/clutter.h>
#include "eek-keyboard.h"
G_BEGIN_DECLS
#define EEK_TYPE_CLUTTER_KEYBOARD (eek_clutter_keyboard_get_type())
#define EEK_CLUTTER_KEYBOARD(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), EEK_TYPE_CLUTTER_KEYBOARD, EekClutterKeyboard))
#define EEK_CLUTTER_KEYBOARD_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), EEK_TYPE_CLUTTER_KEYBOARD, EekClutterKeyboardClass))
#define EEK_IS_CLUTTER_KEYBOARD(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), EEK_TYPE_CLUTTER_KEYBOARD))
#define EEK_IS_CLUTTER_KEYBOARD_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), EEK_TYPE_CLUTTER_KEYBOARD))
#define EEK_CLUTTER_KEYBOARD_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), EEK_TYPE_CLUTTER_KEYBOARD, EekClutterKeyboardClass))
typedef struct _EekClutterKeyboard EekClutterKeyboard;
typedef struct _EekClutterKeyboardClass EekClutterKeyboardClass;
typedef struct _EekClutterKeyboardPrivate EekClutterKeyboardPrivate;
struct _EekClutterKeyboard
{
/*< private >*/
ClutterGroup parent;
EekClutterKeyboardPrivate *priv;
};
struct _EekClutterKeyboardClass
{
/*< private >*/
ClutterGroupClass parent_class;
/*< private >*/
/* padding */
gpointer pdummy[24];
};
GType eek_clutter_keyboard_get_type (void) G_GNUC_CONST;
ClutterActor *eek_clutter_keyboard_new (EekKeyboard *keyboard);
void eek_clutter_keyboard_set_theme (EekClutterKeyboard *keyboard,
EekTheme *theme);
G_END_DECLS
#endif /* EEK_CLUTTER_KEYBOARD_H */

View File

@ -1,235 +0,0 @@
/*
* Copyright (C) 2010-2011 Daiki Ueno <ueno@unixuser.org>
* Copyright (C) 2010-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 <gdk-pixbuf/gdk-pixbuf.h>
#include <cogl/cogl.h>
#include <cogl/cogl-pango.h>
#include <clutter/clutter.h>
#include "eek-clutter-renderer.h"
#include "eek-key.h"
G_DEFINE_TYPE (EekClutterRenderer, eek_clutter_renderer, EEK_TYPE_RENDERER);
#define EEK_CLUTTER_RENDERER_GET_PRIVATE(obj) \
(G_TYPE_INSTANCE_GET_PRIVATE ((obj), EEK_TYPE_CLUTTER_RENDERER, EekClutterRendererPrivate))
struct _EekClutterRendererPrivate
{
GHashTable *outline_texture_cache;
};
/* This routine is copied from librsvg:
Copyright © 2005 Dom Lachowicz <cinamod@hotmail.com>
Copyright © 2005 Caleb Moore <c.moore@student.unsw.edu.au>
Copyright © 2005 Red Hat, Inc.
*/
static void
cairo_pixels_to_pixbuf (guint8 *pixels,
int rowstride,
int height)
{
int row;
/* un-premultiply data */
for (row = 0; row < height; row++) {
guint8 *row_data = (pixels + (row * rowstride));
int i;
for (i = 0; i < rowstride; i += 4) {
guint8 *b = &row_data[i];
guint32 pixel;
guint8 alpha;
memcpy (&pixel, b, sizeof (guint32));
alpha = (pixel & 0xff000000) >> 24;
if (alpha == 0) {
b[0] = b[1] = b[2] = b[3] = 0;
} else {
b[0] = (((pixel & 0xff0000) >> 16) * 255 + alpha / 2) / alpha;
b[1] = (((pixel & 0x00ff00) >> 8) * 255 + alpha / 2) / alpha;
b[2] = (((pixel & 0x0000ff) >> 0) * 255 + alpha / 2) / alpha;
b[3] = alpha;
}
}
}
}
static void
eek_clutter_renderer_finalize (GObject *object)
{
EekClutterRendererPrivate *priv = EEK_CLUTTER_RENDERER_GET_PRIVATE(object);
g_hash_table_destroy (priv->outline_texture_cache);
G_OBJECT_CLASS (eek_clutter_renderer_parent_class)->finalize (object);
}
static void
eek_clutter_renderer_class_init (EekClutterRendererClass *klass)
{
GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
g_type_class_add_private (gobject_class,
sizeof (EekClutterRendererPrivate));
gobject_class->finalize = eek_clutter_renderer_finalize;
}
static void
eek_clutter_renderer_init (EekClutterRenderer *self)
{
EekClutterRendererPrivate *priv;
priv = self->priv = EEK_CLUTTER_RENDERER_GET_PRIVATE(self);
priv->outline_texture_cache =
g_hash_table_new_full (g_direct_hash,
g_direct_equal,
NULL,
cogl_handle_unref);
}
void
eek_clutter_renderer_render_key (EekClutterRenderer *renderer,
ClutterActor *actor,
EekKey *key)
{
EekClutterRendererPrivate *priv;
EekOutline *outline;
CoglHandle *outline_texture;
PangoLayout *layout;
PangoRectangle extents = { 0, };
EekColor foreground;
CoglColor color;
ClutterGeometry geom;
gulong oref;
EekKeyboard *keyboard;
g_assert (EEK_IS_CLUTTER_RENDERER(renderer));
g_assert (CLUTTER_IS_ACTOR(actor));
g_assert (EEK_IS_KEY(key));
oref = eek_key_get_oref (key);
g_object_get (renderer, "keyboard", &keyboard, NULL);
outline = eek_keyboard_get_outline (keyboard, oref);
g_object_unref (keyboard);
priv = EEK_CLUTTER_RENDERER_GET_PRIVATE(renderer);
outline_texture = g_hash_table_lookup (priv->outline_texture_cache,
outline);
if (!outline_texture) {
gint rowstride;
guint8 *data;
cairo_surface_t *surface;
cairo_t *cr;
EekBounds bounds;
gdouble scale;
GdkPixbuf *pixbuf;
eek_element_get_bounds (EEK_ELEMENT(key), &bounds);
scale = eek_renderer_get_scale (EEK_RENDERER(renderer));
rowstride = cairo_format_stride_for_width (CAIRO_FORMAT_ARGB32,
bounds.width * scale);
data = g_malloc0 (rowstride * bounds.height);
surface = cairo_image_surface_create_for_data (data,
CAIRO_FORMAT_ARGB32,
bounds.width * scale,
bounds.height * scale,
rowstride);
cr = cairo_create (surface);
eek_renderer_render_key_outline (EEK_RENDERER(renderer),
cr,
key,
1.0,
FALSE);
cairo_destroy (cr);
cairo_surface_destroy (surface);
cairo_pixels_to_pixbuf (data, rowstride, bounds.height * scale);
pixbuf = gdk_pixbuf_new_from_data (data,
GDK_COLORSPACE_RGB,
TRUE,
8,
bounds.width * scale,
bounds.height * scale,
rowstride,
(GdkPixbufDestroyNotify) g_free,
data);
outline_texture =
cogl_texture_new_from_data (gdk_pixbuf_get_width (pixbuf),
gdk_pixbuf_get_height (pixbuf),
COGL_TEXTURE_NONE,
gdk_pixbuf_get_has_alpha (pixbuf)
? COGL_PIXEL_FORMAT_RGBA_8888
: COGL_PIXEL_FORMAT_RGB_888,
COGL_PIXEL_FORMAT_ANY,
gdk_pixbuf_get_rowstride (pixbuf),
gdk_pixbuf_get_pixels (pixbuf));
g_object_unref (pixbuf);
g_hash_table_insert (priv->outline_texture_cache,
outline,
outline_texture);
}
clutter_actor_get_allocation_geometry (actor, &geom);
cogl_set_source_texture (outline_texture);
cogl_rectangle (0.0f, 0.0f, geom.width, geom.height);
layout = eek_renderer_create_pango_layout (EEK_RENDERER(renderer));
eek_renderer_render_key_label (EEK_RENDERER(renderer), layout, key);
pango_layout_get_extents (layout, NULL, &extents);
eek_renderer_get_foreground_color (EEK_RENDERER(renderer),
EEK_ELEMENT(key),
&foreground);
cogl_color_set_from_4f (&color,
foreground.red,
foreground.green,
foreground.blue,
foreground.alpha);
cogl_pango_render_layout (layout,
(geom.width - extents.width / PANGO_SCALE) / 2,
(geom.height - extents.height / PANGO_SCALE) / 2,
&color,
0);
g_object_unref (layout);
}
EekClutterRenderer *
eek_clutter_renderer_new (EekKeyboard *keyboard,
PangoContext *pcontext)
{
EekClutterRenderer *renderer;
renderer = g_object_new (EEK_TYPE_CLUTTER_RENDERER,
"keyboard", keyboard,
"pango-context", pcontext,
NULL);
return renderer;
}

View File

@ -1,64 +0,0 @@
/*
* Copyright (C) 2010-2011 Daiki Ueno <ueno@unixuser.org>
* Copyright (C) 2010-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
*/
#ifndef EEK_CLUTTER_RENDERER_H
#define EEK_CLUTTER_RENDERER_H 1
#include "eek-renderer.h"
G_BEGIN_DECLS
#define EEK_TYPE_CLUTTER_RENDERER (eek_clutter_renderer_get_type())
#define EEK_CLUTTER_RENDERER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), EEK_TYPE_CLUTTER_RENDERER, EekClutterRenderer))
#define EEK_CLUTTER_RENDERER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), EEK_TYPE_CLUTTER_RENDERER, EekClutterRendererClass))
#define EEK_IS_CLUTTER_RENDERER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), EEK_TYPE_CLUTTER_RENDERER))
#define EEK_IS_CLUTTER_RENDERER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), EEK_TYPE_CLUTTER_RENDERER))
#define EEK_CLUTTER_RENDERER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), EEK_TYPE_CLUTTER_RENDERER, EekClutterRendererClass))
typedef struct _EekClutterRenderer EekClutterRenderer;
typedef struct _EekClutterRendererClass EekClutterRendererClass;
typedef struct _EekClutterRendererPrivate EekClutterRendererPrivate;
struct _EekClutterRenderer {
EekRenderer parent;
EekClutterRendererPrivate *priv;
};
struct _EekClutterRendererClass
{
EekRendererClass parent_class;
/*< private >*/
/* padding */
gpointer pdummy[24];
};
GType eek_clutter_renderer_get_type
(void) G_GNUC_CONST;
EekClutterRenderer *eek_clutter_renderer_new (EekKeyboard *keyboard,
PangoContext *pcontext);
void eek_clutter_renderer_render_key
(EekClutterRenderer *renderer,
ClutterActor *actor,
EekKey *key);
G_END_DECLS
#endif /* EEK_CLUTTER_RENDERER_H */

View File

@ -1,232 +0,0 @@
/*
* Copyright (C) 2010-2011 Daiki Ueno <ueno@unixuser.org>
* Copyright (C) 2010-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 "eek-clutter-section.h"
#include "eek-clutter-key.h"
enum {
PROP_0,
PROP_SECTION,
PROP_RENDERER,
PROP_LAST
};
G_DEFINE_TYPE (EekClutterSection, eek_clutter_section, CLUTTER_TYPE_GROUP);
#define EEK_CLUTTER_SECTION_GET_PRIVATE(obj) \
(G_TYPE_INSTANCE_GET_PRIVATE ((obj), EEK_TYPE_CLUTTER_SECTION, EekClutterSectionPrivate))
struct _EekClutterSectionPrivate
{
EekSection *section;
EekClutterRenderer *renderer;
};
struct _CreateKeyCallbackData {
ClutterActor *actor;
EekClutterRenderer *renderer;
};
typedef struct _CreateKeyCallbackData CreateKeyCallbackData;
static void
create_key (EekElement *element, gpointer user_data)
{
CreateKeyCallbackData *data = user_data;
ClutterActor *key;
key = eek_clutter_key_new (EEK_KEY(element), data->renderer);
clutter_container_add_actor (CLUTTER_CONTAINER(data->actor), key);
}
static void
set_position (ClutterActor *self)
{
EekClutterSectionPrivate *priv = EEK_CLUTTER_SECTION_GET_PRIVATE(self);
EekBounds bounds;
gdouble scale;
eek_element_get_bounds (EEK_ELEMENT(priv->section), &bounds);
scale = eek_renderer_get_scale (EEK_RENDERER(priv->renderer));
clutter_actor_set_position (self, bounds.x * scale, bounds.y * scale);
}
static void
eek_clutter_section_real_realize (ClutterActor *self)
{
EekClutterSectionPrivate *priv = EEK_CLUTTER_SECTION_GET_PRIVATE(self);
CreateKeyCallbackData data;
clutter_actor_set_rotation (self,
CLUTTER_Z_AXIS,
eek_section_get_angle (priv->section),
0.0f, 0.0f, 0.0f);
set_position (self);
data.actor = self;
data.renderer = priv->renderer;
eek_container_foreach_child (EEK_CONTAINER(priv->section),
create_key,
&data);
}
static void
eek_clutter_section_real_paint (ClutterActor *self)
{
set_position (self);
CLUTTER_ACTOR_CLASS (eek_clutter_section_parent_class)->
paint (self);
}
static void
eek_clutter_section_real_get_preferred_width (ClutterActor *self,
float for_height,
float *min_width_p,
float *natural_width_p)
{
EekClutterSectionPrivate *priv = EEK_CLUTTER_SECTION_GET_PRIVATE(self);
EekBounds bounds;
gdouble scale;
scale = eek_renderer_get_scale (EEK_RENDERER(priv->renderer));
eek_element_get_bounds (EEK_ELEMENT(priv->section), &bounds);
*min_width_p = 0.0f;
*natural_width_p = bounds.width * scale;
}
static void
eek_clutter_section_real_get_preferred_height (ClutterActor *self,
float for_width,
float *min_height_p,
float *natural_height_p)
{
EekClutterSectionPrivate *priv = EEK_CLUTTER_SECTION_GET_PRIVATE(self);
EekBounds bounds;
gdouble scale;
scale = eek_renderer_get_scale (EEK_RENDERER(priv->renderer));
eek_element_get_bounds (EEK_ELEMENT(priv->section), &bounds);
*min_height_p = 0.0f;
*natural_height_p = bounds.height * scale;
}
static void
eek_clutter_section_set_property (GObject *object,
guint prop_id,
const GValue *value,
GParamSpec *pspec)
{
EekClutterSectionPrivate *priv = EEK_CLUTTER_SECTION_GET_PRIVATE(object);
switch (prop_id) {
case PROP_SECTION:
priv->section = g_value_get_object (value);
g_object_ref (priv->section);
break;
case PROP_RENDERER:
priv->renderer = g_value_get_object (value);
g_object_ref (priv->renderer);
break;
default:
g_object_set_property (object,
g_param_spec_get_name (pspec),
value);
break;
}
}
static void
eek_clutter_section_dispose (GObject *object)
{
EekClutterSectionPrivate *priv = EEK_CLUTTER_SECTION_GET_PRIVATE(object);
if (priv->renderer) {
g_object_unref (priv->renderer);
priv->renderer = NULL;
}
if (priv->section) {
g_object_unref (priv->section);
priv->section = NULL;
}
G_OBJECT_CLASS (eek_clutter_section_parent_class)->dispose (object);
}
static void
eek_clutter_section_class_init (EekClutterSectionClass *klass)
{
ClutterActorClass *actor_class = CLUTTER_ACTOR_CLASS (klass);
GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
GParamSpec *pspec;
g_type_class_add_private (gobject_class, sizeof (EekClutterSectionPrivate));
actor_class->realize =
eek_clutter_section_real_realize;
actor_class->paint =
eek_clutter_section_real_paint;
actor_class->get_preferred_width =
eek_clutter_section_real_get_preferred_width;
actor_class->get_preferred_height =
eek_clutter_section_real_get_preferred_height;
gobject_class->set_property = eek_clutter_section_set_property;
gobject_class->dispose = eek_clutter_section_dispose;
pspec = g_param_spec_object ("section",
"Section",
"Section",
EEK_TYPE_SECTION,
G_PARAM_CONSTRUCT_ONLY | G_PARAM_WRITABLE);
g_object_class_install_property (gobject_class,
PROP_SECTION,
pspec);
pspec = g_param_spec_object ("renderer",
"Renderer",
"Renderer",
EEK_TYPE_RENDERER,
G_PARAM_CONSTRUCT_ONLY | G_PARAM_WRITABLE);
g_object_class_install_property (gobject_class,
PROP_RENDERER,
pspec);
}
static void
eek_clutter_section_init (EekClutterSection *self)
{
EekClutterSectionPrivate *priv;
priv = self->priv = EEK_CLUTTER_SECTION_GET_PRIVATE (self);
priv->section = NULL;
priv->renderer = NULL;
}
ClutterActor *
eek_clutter_section_new (EekSection *section,
EekClutterRenderer *renderer)
{
return g_object_new (EEK_TYPE_CLUTTER_SECTION,
"section", section,
"renderer", renderer,
NULL);
}

View File

@ -1,62 +0,0 @@
/*
* Copyright (C) 2010-2011 Daiki Ueno <ueno@unixuser.org>
* Copyright (C) 2010-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
*/
#ifndef EEK_CLUTTER_SECTION_H
#define EEK_CLUTTER_SECTION_H 1
#include <clutter/clutter.h>
#include "eek-section.h"
#include "eek-clutter-renderer.h"
G_BEGIN_DECLS
#define EEK_TYPE_CLUTTER_SECTION (eek_clutter_section_get_type())
#define EEK_CLUTTER_SECTION(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), EEK_TYPE_CLUTTER_SECTION, EekClutterSection))
#define EEK_CLUTTER_SECTION_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), EEK_TYPE_CLUTTER_SECTION, EekClutterSectionClass))
#define EEK_IS_CLUTTER_SECTION(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), EEK_TYPE_CLUTTER_SECTION))
#define EEK_IS_CLUTTER_SECTION_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), EEK_TYPE_CLUTTER_SECTION))
#define EEK_CLUTTER_SECTION_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), EEK_TYPE_CLUTTER_SECTION, EekClutterSectionClass))
typedef struct _EekClutterSection EekClutterSection;
typedef struct _EekClutterSectionClass EekClutterSectionClass;
typedef struct _EekClutterSectionPrivate EekClutterSectionPrivate;
struct _EekClutterSection
{
/*< private >*/
ClutterGroup parent;
EekClutterSectionPrivate *priv;
};
struct _EekClutterSectionClass
{
/*< private >*/
ClutterGroupClass parent_class;
/*< private >*/
/* padding */
gpointer pdummy[24];
};
GType eek_clutter_section_get_type (void) G_GNUC_CONST;
ClutterActor *eek_clutter_section_new (EekSection *section,
EekClutterRenderer *renderer);
G_END_DECLS
#endif /* EEK_CLUTTER_SECTION_H */

View File

@ -31,7 +31,6 @@
#endif /* HAVE_CONFIG_H */ #endif /* HAVE_CONFIG_H */
#include "eek-container.h" #include "eek-container.h"
#include "eek-serializable.h"
enum { enum {
CHILD_ADDED, CHILD_ADDED,
@ -41,11 +40,7 @@ enum {
static guint signals[LAST_SIGNAL] = { 0, }; static guint signals[LAST_SIGNAL] = { 0, };
static void eek_serializable_iface_init (EekSerializableIface *iface); G_DEFINE_ABSTRACT_TYPE (EekContainer, eek_container, EEK_TYPE_ELEMENT);
G_DEFINE_ABSTRACT_TYPE_WITH_CODE (EekContainer, eek_container, EEK_TYPE_ELEMENT,
G_IMPLEMENT_INTERFACE (EEK_TYPE_SERIALIZABLE,
eek_serializable_iface_init));
#define EEK_CONTAINER_GET_PRIVATE(obj) \ #define EEK_CONTAINER_GET_PRIVATE(obj) \
(G_TYPE_INSTANCE_GET_PRIVATE ((obj), EEK_TYPE_CONTAINER, EekContainerPrivate)) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), EEK_TYPE_CONTAINER, EekContainerPrivate))
@ -53,63 +48,10 @@ G_DEFINE_ABSTRACT_TYPE_WITH_CODE (EekContainer, eek_container, EEK_TYPE_ELEMENT,
struct _EekContainerPrivate struct _EekContainerPrivate
{ {
GSList *children; GList *head;
GList *last;
}; };
static EekSerializableIface *eek_container_parent_serializable_iface;
static void
eek_container_real_serialize (EekSerializable *self,
GVariantBuilder *builder)
{
EekContainerPrivate *priv = EEK_CONTAINER_GET_PRIVATE(self);
GSList *head;
GVariantBuilder array;
eek_container_parent_serializable_iface->serialize (self, builder);
g_variant_builder_init (&array, G_VARIANT_TYPE("av"));
for (head = priv->children; head; head = g_slist_next (head)) {
GVariant *variant =
eek_serializable_serialize (EEK_SERIALIZABLE(head->data));
g_variant_builder_add (&array, "v", variant);
}
g_variant_builder_add (builder, "v", g_variant_builder_end (&array));
}
static gsize
eek_container_real_deserialize (EekSerializable *self,
GVariant *variant,
gsize index)
{
GVariant *array, *child;
GVariantIter iter;
index = eek_container_parent_serializable_iface->deserialize (self,
variant,
index);
g_variant_get_child (variant, index++, "v", &array);
g_variant_iter_init (&iter, array);
while (g_variant_iter_next (&iter, "v", &child)) {
EekSerializable *serializable = eek_serializable_deserialize (child);
eek_container_add_child (EEK_CONTAINER(self),
EEK_ELEMENT(serializable));
}
return index;
}
static void
eek_serializable_iface_init (EekSerializableIface *iface)
{
eek_container_parent_serializable_iface =
g_type_interface_peek_parent (iface);
iface->serialize = eek_container_real_serialize;
iface->deserialize = eek_container_real_deserialize;
}
static void static void
eek_container_real_add_child (EekContainer *self, eek_container_real_add_child (EekContainer *self,
EekElement *child) EekElement *child)
@ -119,9 +61,14 @@ eek_container_real_add_child (EekContainer *self,
g_return_if_fail (EEK_IS_ELEMENT(child)); g_return_if_fail (EEK_IS_ELEMENT(child));
g_object_ref (child); g_object_ref (child);
priv->children = g_slist_prepend (priv->children, child); if (!priv->head) {
priv->head = priv->last = g_list_prepend (priv->head, child);
} else {
priv->last->next = g_list_prepend (priv->last->next, child);
priv->last = priv->last->next;
}
eek_element_set_parent (child, EEK_ELEMENT(self)); eek_element_set_parent (child, EEK_ELEMENT(self));
g_signal_emit_by_name (self, "child-added", child); g_signal_emit (self, signals[CHILD_ADDED], 0, child);
} }
static void static void
@ -129,15 +76,17 @@ eek_container_real_remove_child (EekContainer *self,
EekElement *child) EekElement *child)
{ {
EekContainerPrivate *priv = EEK_CONTAINER_GET_PRIVATE(self); EekContainerPrivate *priv = EEK_CONTAINER_GET_PRIVATE(self);
GSList *head; GList *head;
g_return_if_fail (EEK_IS_ELEMENT(child)); g_return_if_fail (EEK_IS_ELEMENT(child));
head = g_slist_find (priv->children, child); head = g_list_find (priv->head, child);
g_return_if_fail (head); g_return_if_fail (head);
g_object_unref (child); g_object_unref (child);
priv->children = g_slist_remove_link (priv->children, head); if (head == priv->last)
priv->last = g_list_previous (priv->last);
priv->head = g_list_remove_link (priv->head, head);
eek_element_set_parent (child, NULL); eek_element_set_parent (child, NULL);
g_signal_emit_by_name (self, "child-removed", child); g_signal_emit (self, signals[CHILD_REMOVED], 0, child);
} }
static void static void
@ -146,9 +95,9 @@ eek_container_real_foreach_child (EekContainer *self,
gpointer user_data) gpointer user_data)
{ {
EekContainerPrivate *priv = EEK_CONTAINER_GET_PRIVATE(self); EekContainerPrivate *priv = EEK_CONTAINER_GET_PRIVATE(self);
GSList *head; GList *head;
for (head = priv->children; head; head = g_slist_next (head)) for (head = priv->head; head; head = g_list_next (head))
(*callback) (EEK_ELEMENT(head->data), user_data); (*callback) (EEK_ELEMENT(head->data), user_data);
} }
@ -158,9 +107,9 @@ eek_container_real_find (EekContainer *self,
gpointer user_data) gpointer user_data)
{ {
EekContainerPrivate *priv = EEK_CONTAINER_GET_PRIVATE(self); EekContainerPrivate *priv = EEK_CONTAINER_GET_PRIVATE(self);
GSList *head; GList *head;
head = g_slist_find_custom (priv->children, user_data, (GCompareFunc)func); head = g_list_find_custom (priv->head, user_data, (GCompareFunc)func);
if (head) if (head)
return head->data; return head->data;
return NULL; return NULL;
@ -170,12 +119,12 @@ static void
eek_container_dispose (GObject *object) eek_container_dispose (GObject *object)
{ {
EekContainerPrivate *priv = EEK_CONTAINER_GET_PRIVATE(object); EekContainerPrivate *priv = EEK_CONTAINER_GET_PRIVATE(object);
GSList *head; GList *head;
for (head = priv->children; head; head = priv->children) { for (head = priv->head; head; head = priv->head) {
g_object_unref (head->data); g_object_unref (head->data);
priv->children = g_slist_next (head); priv->head = g_list_next (head);
g_slist_free1 (head); g_list_free1 (head);
} }
G_OBJECT_CLASS(eek_container_parent_class)->dispose (object); G_OBJECT_CLASS(eek_container_parent_class)->dispose (object);
} }
@ -240,10 +189,7 @@ eek_container_class_init (EekContainerClass *klass)
static void static void
eek_container_init (EekContainer *self) eek_container_init (EekContainer *self)
{ {
EekContainerPrivate *priv; self->priv = EEK_CONTAINER_GET_PRIVATE(self);
priv = self->priv = EEK_CONTAINER_GET_PRIVATE(self);
priv->children = NULL;
} }
/** /**

View File

@ -35,7 +35,6 @@
#include "eek-element.h" #include "eek-element.h"
#include "eek-container.h" #include "eek-container.h"
#include "eek-marshalers.h" #include "eek-marshalers.h"
#include "eek-serializable.h"
enum { enum {
PROP_0, PROP_0,
@ -53,11 +52,7 @@ enum {
static guint signals[LAST_SIGNAL] = { 0, }; static guint signals[LAST_SIGNAL] = { 0, };
static void eek_serializable_iface_init (EekSerializableIface *iface); G_DEFINE_ABSTRACT_TYPE (EekElement, eek_element, G_TYPE_OBJECT);
G_DEFINE_ABSTRACT_TYPE_WITH_CODE (EekElement, eek_element, G_TYPE_OBJECT,
G_IMPLEMENT_INTERFACE (EEK_TYPE_SERIALIZABLE,
eek_serializable_iface_init));
#define EEK_ELEMENT_GET_PRIVATE(obj) \ #define EEK_ELEMENT_GET_PRIVATE(obj) \
(G_TYPE_INSTANCE_GET_PRIVATE ((obj), EEK_TYPE_ELEMENT, EekElementPrivate)) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), EEK_TYPE_ELEMENT, EekElementPrivate))
@ -72,155 +67,6 @@ struct _EekElementPrivate
gint level; gint level;
}; };
static GVariant *
_g_variant_new_bounds (EekBounds *bounds)
{
GVariantBuilder builder;
g_variant_builder_init (&builder, G_VARIANT_TYPE ("ad"));
g_variant_builder_add (&builder, "d", bounds->x);
g_variant_builder_add (&builder, "d", bounds->y);
g_variant_builder_add (&builder, "d", bounds->width);
g_variant_builder_add (&builder, "d", bounds->height);
return g_variant_builder_end (&builder);
}
static void
_g_variant_get_bounds (GVariant *variant, EekBounds *bounds)
{
g_variant_get_child (variant, 0, "d", &bounds->x);
g_variant_get_child (variant, 1, "d", &bounds->y);
g_variant_get_child (variant, 2, "d", &bounds->width);
g_variant_get_child (variant, 3, "d", &bounds->height);
}
static void
eek_element_real_serialize (EekSerializable *self,
GVariantBuilder *builder)
{
EekElementPrivate *priv = EEK_ELEMENT_GET_PRIVATE(self);
g_variant_builder_add (builder, "s", priv->name == NULL ? "" : priv->name);
g_variant_builder_add (builder, "v", _g_variant_new_bounds (&priv->bounds));
}
static gsize
eek_element_real_deserialize (EekSerializable *self,
GVariant *variant,
gsize index)
{
EekElementPrivate *priv = EEK_ELEMENT_GET_PRIVATE(self);
GVariant *bounds;
g_variant_get_child (variant, index++, "s", &priv->name);
g_variant_get_child (variant, index++, "v", &bounds);
_g_variant_get_bounds (bounds, &priv->bounds);
return index;
}
static void
eek_serializable_iface_init (EekSerializableIface *iface)
{
iface->serialize = eek_element_real_serialize;
iface->deserialize = eek_element_real_deserialize;
}
static void
eek_element_real_set_parent (EekElement *self,
EekElement *parent)
{
EekElementPrivate *priv = EEK_ELEMENT_GET_PRIVATE(self);
if (!parent) {
g_return_if_fail (priv->parent);
/* release self-reference acquired when setting parent */
g_object_unref (self);
priv->parent = NULL;
} else {
g_return_if_fail (!priv->parent);
g_object_ref (self);
priv->parent = parent;
}
}
static EekElement *
eek_element_real_get_parent (EekElement *self)
{
EekElementPrivate *priv = EEK_ELEMENT_GET_PRIVATE(self);
return priv->parent;
}
static void
eek_element_real_set_name (EekElement *self,
const gchar *name)
{
EekElementPrivate *priv = EEK_ELEMENT_GET_PRIVATE(self);
g_free (priv->name);
priv->name = g_strdup (name);
g_object_notify (G_OBJECT(self), "name");
}
static G_CONST_RETURN gchar *
eek_element_real_get_name (EekElement *self)
{
EekElementPrivate *priv = EEK_ELEMENT_GET_PRIVATE(self);
return priv->name;
}
static void
eek_element_real_set_bounds (EekElement *self,
EekBounds *bounds)
{
EekElementPrivate *priv = EEK_ELEMENT_GET_PRIVATE(self);
priv->bounds = *bounds;
}
static void
eek_element_real_get_bounds (EekElement *self,
EekBounds *bounds)
{
EekElementPrivate *priv = EEK_ELEMENT_GET_PRIVATE(self);
g_return_if_fail (bounds);
*bounds = priv->bounds;
g_object_notify (G_OBJECT(self), "bounds");
}
static void
eek_element_real_set_symbol_index (EekElement *self,
gint group,
gint level)
{
EekElementPrivate *priv = EEK_ELEMENT_GET_PRIVATE(self);
if (priv->group != group || priv->level != level) {
priv->group = group;
priv->level = level;
g_signal_emit_by_name (self, "symbol-index-changed", group, level);
}
}
static void
eek_element_real_get_symbol_index (EekElement *self,
gint *group,
gint *level)
{
EekElementPrivate *priv = EEK_ELEMENT_GET_PRIVATE(self);
if (group)
*group = priv->group;
if (level)
*level = priv->level;
}
static void static void
eek_element_real_symbol_index_changed (EekElement *self, eek_element_real_symbol_index_changed (EekElement *self,
gint group, gint group,
@ -244,22 +90,21 @@ eek_element_set_property (GObject *object,
const GValue *value, const GValue *value,
GParamSpec *pspec) GParamSpec *pspec)
{ {
EekElement *element = EEK_ELEMENT(object);
switch (prop_id) { switch (prop_id) {
case PROP_NAME: case PROP_NAME:
eek_element_set_name (EEK_ELEMENT(object), eek_element_set_name (element,
g_value_get_string (value)); g_value_dup_string (value));
break; break;
case PROP_BOUNDS: case PROP_BOUNDS:
eek_element_set_bounds (EEK_ELEMENT(object), eek_element_set_bounds (element, g_value_get_boxed (value));
g_value_get_boxed (value));
break; break;
case PROP_GROUP: case PROP_GROUP:
eek_element_set_group (EEK_ELEMENT(object), eek_element_set_group (element, g_value_get_int (value));
g_value_get_int (value));
break; break;
case PROP_LEVEL: case PROP_LEVEL:
eek_element_set_level (EEK_ELEMENT(object), eek_element_set_level (element, g_value_get_int (value));
g_value_get_int (value));
default: default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break; break;
@ -272,21 +117,22 @@ eek_element_get_property (GObject *object,
GValue *value, GValue *value,
GParamSpec *pspec) GParamSpec *pspec)
{ {
EekElement *element = EEK_ELEMENT(object);
EekBounds bounds; EekBounds bounds;
switch (prop_id) { switch (prop_id) {
case PROP_NAME: case PROP_NAME:
g_value_set_string (value, eek_element_get_name (EEK_ELEMENT(object))); g_value_set_string (value, eek_element_get_name (element));
break; break;
case PROP_BOUNDS: case PROP_BOUNDS:
eek_element_get_bounds (EEK_ELEMENT(object), &bounds); eek_element_get_bounds (element, &bounds);
g_value_set_boxed (value, &bounds); g_value_set_boxed (value, &bounds);
break; break;
case PROP_GROUP: case PROP_GROUP:
g_value_set_int (value, eek_element_get_group (EEK_ELEMENT(object))); g_value_set_int (value, eek_element_get_group (element));
break; break;
case PROP_LEVEL: case PROP_LEVEL:
g_value_set_int (value, eek_element_get_level (EEK_ELEMENT(object))); g_value_set_int (value, eek_element_get_level (element));
break; break;
default: default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
@ -303,15 +149,6 @@ eek_element_class_init (EekElementClass *klass)
g_type_class_add_private (gobject_class, g_type_class_add_private (gobject_class,
sizeof (EekElementPrivate)); sizeof (EekElementPrivate));
klass->set_parent = eek_element_real_set_parent;
klass->get_parent = eek_element_real_get_parent;
klass->set_name = eek_element_real_set_name;
klass->get_name = eek_element_real_get_name;
klass->set_bounds = eek_element_real_set_bounds;
klass->get_bounds = eek_element_real_get_bounds;
klass->set_symbol_index = eek_element_real_set_symbol_index;
klass->get_symbol_index = eek_element_real_get_symbol_index;
/* signals */ /* signals */
klass->symbol_index_changed = eek_element_real_symbol_index_changed; klass->symbol_index_changed = eek_element_real_symbol_index_changed;
@ -404,8 +241,6 @@ eek_element_init (EekElement *self)
EekElementPrivate *priv; EekElementPrivate *priv;
priv = self->priv = EEK_ELEMENT_GET_PRIVATE(self); priv = self->priv = EEK_ELEMENT_GET_PRIVATE(self);
priv->name = NULL;
memset (&priv->bounds, 0, sizeof priv->bounds);
priv->group = -1; priv->group = -1;
priv->level = -1; priv->level = -1;
} }
@ -413,7 +248,7 @@ eek_element_init (EekElement *self)
/** /**
* eek_element_set_parent: * eek_element_set_parent:
* @element: an #EekElement * @element: an #EekElement
* @parent: an #EekElement * @parent: (allow-none): an #EekElement or %NULL
* *
* Set the parent of @element to @parent. * Set the parent of @element to @parent.
*/ */
@ -422,8 +257,21 @@ eek_element_set_parent (EekElement *element,
EekElement *parent) EekElement *parent)
{ {
g_return_if_fail (EEK_IS_ELEMENT(element)); g_return_if_fail (EEK_IS_ELEMENT(element));
g_return_if_fail (EEK_IS_ELEMENT(parent)); g_return_if_fail (parent == NULL || EEK_IS_ELEMENT(parent));
EEK_ELEMENT_GET_CLASS(element)->set_parent (element, parent);
if (element->priv->parent == parent)
return;
if (element->priv->parent != NULL) {
/* release self-reference acquired when setting parent */
g_object_unref (element);
}
if (parent != NULL) {
g_object_ref (element);
}
element->priv->parent = parent;
} }
/** /**
@ -437,7 +285,7 @@ EekElement *
eek_element_get_parent (EekElement *element) eek_element_get_parent (EekElement *element)
{ {
g_return_val_if_fail (EEK_IS_ELEMENT(element), NULL); g_return_val_if_fail (EEK_IS_ELEMENT(element), NULL);
return EEK_ELEMENT_GET_CLASS(element)->get_parent (element); return element->priv->parent;
} }
/** /**
@ -452,7 +300,8 @@ eek_element_set_name (EekElement *element,
const gchar *name) const gchar *name)
{ {
g_return_if_fail (EEK_IS_ELEMENT(element)); g_return_if_fail (EEK_IS_ELEMENT(element));
EEK_ELEMENT_GET_CLASS(element)->set_name (element, name); g_free (element->priv->name);
element->priv->name = g_strdup (name);
} }
/** /**
@ -466,7 +315,7 @@ G_CONST_RETURN gchar *
eek_element_get_name (EekElement *element) eek_element_get_name (EekElement *element)
{ {
g_return_val_if_fail (EEK_IS_ELEMENT(element), NULL); g_return_val_if_fail (EEK_IS_ELEMENT(element), NULL);
return EEK_ELEMENT_GET_CLASS(element)->get_name (element); return element->priv->name;
} }
/** /**
@ -483,13 +332,13 @@ eek_element_set_bounds (EekElement *element,
EekBounds *bounds) EekBounds *bounds)
{ {
g_return_if_fail (EEK_IS_ELEMENT(element)); g_return_if_fail (EEK_IS_ELEMENT(element));
EEK_ELEMENT_GET_CLASS(element)->set_bounds (element, bounds); memcpy (&element->priv->bounds, bounds, sizeof(EekBounds));
} }
/** /**
* 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
@ -500,7 +349,8 @@ eek_element_get_bounds (EekElement *element,
EekBounds *bounds) EekBounds *bounds)
{ {
g_return_if_fail (EEK_IS_ELEMENT(element)); g_return_if_fail (EEK_IS_ELEMENT(element));
EEK_ELEMENT_GET_CLASS(element)->get_bounds (element, bounds); g_return_if_fail (bounds != NULL);
memcpy (bounds, &element->priv->bounds, sizeof(EekBounds));
} }
/** /**
@ -585,8 +435,18 @@ eek_element_set_symbol_index (EekElement *element,
gint group, gint group,
gint level) gint level)
{ {
gboolean emit_signal;
g_return_if_fail (EEK_IS_ELEMENT(element)); g_return_if_fail (EEK_IS_ELEMENT(element));
EEK_ELEMENT_GET_CLASS(element)->set_symbol_index (element, group, level);
emit_signal = group != eek_element_get_group (element) ||
level != eek_element_get_level (element);
eek_element_set_group (element, group);
eek_element_set_level (element, level);
if (emit_signal)
g_signal_emit (element, signals[SYMBOL_INDEX_CHANGED], 0, group, level);
} }
/** /**
@ -604,8 +464,11 @@ eek_element_get_symbol_index (EekElement *element,
gint *level) gint *level)
{ {
g_return_if_fail (EEK_IS_ELEMENT(element)); g_return_if_fail (EEK_IS_ELEMENT(element));
g_return_if_fail (group || level); g_return_if_fail (group != NULL || level != NULL);
EEK_ELEMENT_GET_CLASS(element)->get_symbol_index (element, group, level); if (group != NULL)
*group = eek_element_get_group (element);
if (level != NULL)
*level = eek_element_get_level (element);
} }
/** /**
@ -622,10 +485,13 @@ void
eek_element_set_group (EekElement *element, eek_element_set_group (EekElement *element,
gint group) gint group)
{ {
gint level; g_return_if_fail (EEK_IS_ELEMENT(element));
if (element->priv->group != group) {
level = eek_element_get_level (element); element->priv->group = group;
eek_element_set_symbol_index (element, group, level); g_object_notify (G_OBJECT(element), "group");
g_signal_emit (element, signals[SYMBOL_INDEX_CHANGED], 0,
group, element->priv->level);
}
} }
/** /**
@ -642,10 +508,13 @@ void
eek_element_set_level (EekElement *element, eek_element_set_level (EekElement *element,
gint level) gint level)
{ {
gint group; g_return_if_fail (EEK_IS_ELEMENT(element));
if (element->priv->level != level) {
group = eek_element_get_group (element); element->priv->level = level;
eek_element_set_symbol_index (element, group, level); g_object_notify (G_OBJECT(element), "level");
g_signal_emit (element, signals[SYMBOL_INDEX_CHANGED], 0,
element->priv->group, level);
}
} }
/** /**
@ -660,10 +529,8 @@ eek_element_set_level (EekElement *element,
gint gint
eek_element_get_group (EekElement *element) eek_element_get_group (EekElement *element)
{ {
gint group; g_return_val_if_fail (EEK_IS_ELEMENT(element), -1);
return element->priv->group;
eek_element_get_symbol_index (element, &group, NULL);
return group;
} }
/** /**
@ -678,8 +545,6 @@ eek_element_get_group (EekElement *element)
gint gint
eek_element_get_level (EekElement *element) eek_element_get_level (EekElement *element)
{ {
gint level; g_return_val_if_fail (EEK_IS_ELEMENT(element), -1);
return element->priv->level;
eek_element_get_symbol_index (element, NULL, &level);
return level;
} }

View File

@ -51,35 +51,11 @@ struct _EekElementClass
{ {
/*< private >*/ /*< private >*/
GObjectClass parent_class; GObjectClass parent_class;
void (* set_parent) (EekElement *self,
EekElement *parent);
EekElement *(* get_parent) (EekElement *self);
void (* set_name) (EekElement *self,
const gchar *name);
G_CONST_RETURN gchar *(* get_name) (EekElement *self);
void (* set_bounds) (EekElement *self,
EekBounds *bounds);
void (* get_bounds) (EekElement *self,
EekBounds *bounds);
void (* set_symbol_index) (EekElement *self,
gint group,
gint level);
void (* get_symbol_index) (EekElement *self,
gint *group,
gint *level);
/* signals */ /* signals */
void (* symbol_index_changed) (EekElement *self, void (* symbol_index_changed) (EekElement *self,
gint group, gint group,
gint level); gint level);
/*< private >*/
/* padding */
gpointer pdummy[21];
}; };
GType eek_element_get_type (void) G_GNUC_CONST; GType eek_element_get_type (void) G_GNUC_CONST;

View File

@ -27,6 +27,10 @@
#include "config.h" #include "config.h"
#endif /* HAVE_CONFIG_H */ #endif /* HAVE_CONFIG_H */
#ifdef HAVE_LIBCANBERRA
#include <canberra-gtk.h>
#endif
#include <string.h> #include <string.h>
#include "eek-gtk-keyboard.h" #include "eek-gtk-keyboard.h"
@ -57,9 +61,11 @@ struct _EekGtkKeyboardPrivate
{ {
EekRenderer *renderer; EekRenderer *renderer;
EekKeyboard *keyboard; EekKeyboard *keyboard;
EekKey *dragged_key;
gulong key_pressed_handler; gulong key_pressed_handler;
gulong key_released_handler; gulong key_released_handler;
gulong key_locked_handler;
gulong key_unlocked_handler;
gulong key_cancelled_handler;
gulong symbol_index_changed_handler; gulong symbol_index_changed_handler;
EekTheme *theme; EekTheme *theme;
}; };
@ -71,12 +77,25 @@ static void on_key_pressed (EekKeyboard *keyboard,
static void on_key_released (EekKeyboard *keyboard, static void on_key_released (EekKeyboard *keyboard,
EekKey *key, EekKey *key,
gpointer user_data); gpointer user_data);
static void on_key_locked (EekKeyboard *keyboard,
EekKey *key,
gpointer user_data);
static void on_key_unlocked (EekKeyboard *keyboard,
EekKey *key,
gpointer user_data);
static void on_key_cancelled (EekKeyboard *keyboard,
EekKey *key,
gpointer user_data);
static void on_symbol_index_changed (EekKeyboard *keyboard, static void on_symbol_index_changed (EekKeyboard *keyboard,
gint group, gint group,
gint level, gint level,
gpointer user_data); gpointer user_data);
static void render_pressed_key (GtkWidget *widget, static void render_pressed_key (GtkWidget *widget,
EekKey *key); EekKey *key);
static void render_locked_key (GtkWidget *widget,
EekKey *key);
static void render_released_key (GtkWidget *widget,
EekKey *key);
static void static void
eek_gtk_keyboard_real_realize (GtkWidget *self) eek_gtk_keyboard_real_realize (GtkWidget *self)
@ -87,7 +106,8 @@ eek_gtk_keyboard_real_realize (GtkWidget *self)
GDK_KEY_PRESS_MASK | GDK_KEY_PRESS_MASK |
GDK_KEY_RELEASE_MASK | GDK_KEY_RELEASE_MASK |
GDK_BUTTON_PRESS_MASK | GDK_BUTTON_PRESS_MASK |
GDK_BUTTON_RELEASE_MASK); GDK_BUTTON_RELEASE_MASK |
GDK_BUTTON_MOTION_MASK);
GTK_WIDGET_CLASS (eek_gtk_keyboard_parent_class)->realize (self); GTK_WIDGET_CLASS (eek_gtk_keyboard_parent_class)->realize (self);
} }
@ -99,6 +119,7 @@ eek_gtk_keyboard_real_draw (GtkWidget *self,
EekGtkKeyboardPrivate *priv = EEK_GTK_KEYBOARD_GET_PRIVATE(self); EekGtkKeyboardPrivate *priv = EEK_GTK_KEYBOARD_GET_PRIVATE(self);
GtkAllocation allocation; GtkAllocation allocation;
EekColor background; EekColor background;
GList *list, *head;
gtk_widget_get_allocation (self, &allocation); gtk_widget_get_allocation (self, &allocation);
@ -120,11 +141,11 @@ eek_gtk_keyboard_real_draw (GtkWidget *self,
style = gtk_widget_get_style (self); style = gtk_widget_get_style (self);
state = gtk_widget_get_state (self); state = gtk_widget_get_state (self);
color = color_from_gdk_color (&style->fg[state]); color = color_from_gdk_color (&style->text[state]);
eek_renderer_set_default_foreground_color (priv->renderer, color); eek_renderer_set_default_foreground_color (priv->renderer, color);
eek_color_free (color); eek_color_free (color);
color = color_from_gdk_color (&style->bg[state]); color = color_from_gdk_color (&style->base[state]);
eek_renderer_set_default_background_color (priv->renderer, color); eek_renderer_set_default_background_color (priv->renderer, color);
eek_color_free (color); eek_color_free (color);
} }
@ -142,29 +163,23 @@ eek_gtk_keyboard_real_draw (GtkWidget *self,
eek_renderer_render_keyboard (priv->renderer, cr); eek_renderer_render_keyboard (priv->renderer, cr);
/* redraw dragged key */ /* redraw pressed key */
if (priv->dragged_key) list = eek_keyboard_get_pressed_keys (priv->keyboard);
render_pressed_key (self, priv->dragged_key); for (head = list; head; head = g_list_next (head)) {
render_pressed_key (self, head->data);
}
g_list_free (list);
/* redraw locked key */
list = eek_keyboard_get_locked_keys (priv->keyboard);
for (head = list; head; head = g_list_next (head)) {
render_locked_key (self, ((EekModifierKey *)head->data)->key);
}
g_list_free (list);
return FALSE; return FALSE;
} }
#if !GTK_CHECK_VERSION (2, 91, 2)
static gboolean
eek_gtk_keyboard_real_expose_event (GtkWidget *self,
GdkEventExpose *event)
{
gboolean retval;
cairo_t *cr;
cr = gdk_cairo_create (GDK_DRAWABLE (gtk_widget_get_window (self)));
retval = eek_gtk_keyboard_real_draw (self, cr);
cairo_destroy (cr);
return retval;
}
#endif /* !GTK_CHECK_VERSION (2, 91, 2) */
static void static void
eek_gtk_keyboard_real_size_allocate (GtkWidget *self, eek_gtk_keyboard_real_size_allocate (GtkWidget *self,
GtkAllocation *allocation) GtkAllocation *allocation)
@ -190,40 +205,73 @@ eek_gtk_keyboard_real_button_press_event (GtkWidget *self,
key = eek_renderer_find_key_by_position (priv->renderer, key = eek_renderer_find_key_by_position (priv->renderer,
(gdouble)event->x, (gdouble)event->x,
(gdouble)event->y); (gdouble)event->y);
if (key)
if (priv->dragged_key && priv->dragged_key != key)
g_signal_emit_by_name (priv->dragged_key, "released", priv->keyboard);
if (key && !eek_key_is_pressed (key)) {
priv->dragged_key = key;
g_signal_emit_by_name (key, "pressed", priv->keyboard); g_signal_emit_by_name (key, "pressed", priv->keyboard);
}
return TRUE; return TRUE;
} }
static void
clear_dragged_key (EekGtkKeyboard *keyboard)
{
EekGtkKeyboardPrivate *priv = EEK_GTK_KEYBOARD_GET_PRIVATE(keyboard);
if (priv->dragged_key) {
g_signal_emit_by_name (priv->dragged_key, "released", priv->keyboard);
priv->dragged_key = NULL;
}
}
static gboolean static gboolean
eek_gtk_keyboard_real_button_release_event (GtkWidget *self, eek_gtk_keyboard_real_button_release_event (GtkWidget *self,
GdkEventButton *event) GdkEventButton *event)
{ {
clear_dragged_key (EEK_GTK_KEYBOARD(self)); EekGtkKeyboardPrivate *priv = EEK_GTK_KEYBOARD_GET_PRIVATE(self);
GList *list, *head;
list = eek_keyboard_get_pressed_keys (priv->keyboard);
for (head = list; head; head = g_list_next (head))
g_signal_emit_by_name (head->data, "released", priv->keyboard);
g_list_free (list);
return TRUE;
}
static gboolean
eek_gtk_keyboard_real_motion_notify_event (GtkWidget *self,
GdkEventMotion *event)
{
EekGtkKeyboardPrivate *priv = EEK_GTK_KEYBOARD_GET_PRIVATE(self);
EekKey *key;
key = eek_renderer_find_key_by_position (priv->renderer,
(gdouble)event->x,
(gdouble)event->y);
if (key) {
GList *list, *head;
gboolean found = FALSE;
list = eek_keyboard_get_pressed_keys (priv->keyboard);
for (head = list; head; head = g_list_next (head)) {
if (head->data == key)
found = TRUE;
else
g_signal_emit_by_name (head->data, "cancelled", priv->keyboard);
}
g_list_free (list);
if (!found)
g_signal_emit_by_name (key, "pressed", priv->keyboard);
}
return TRUE; return TRUE;
} }
static void static void
eek_gtk_keyboard_real_unmap (GtkWidget *self) eek_gtk_keyboard_real_unmap (GtkWidget *self)
{ {
clear_dragged_key (EEK_GTK_KEYBOARD(self)); EekGtkKeyboardPrivate *priv = EEK_GTK_KEYBOARD_GET_PRIVATE(self);
if (priv->keyboard) {
GList *list, *head;
/* Make a copy of HEAD before sending "released" signal on
elements, so that the default handler of
EekKeyboard::key-released signal can remove elements from its
internal copy */
list = eek_keyboard_get_pressed_keys (priv->keyboard);
for (head = list; head; head = g_list_next (head))
g_signal_emit_by_name (head->data, "released", priv->keyboard);
g_list_free (list);
}
GTK_WIDGET_CLASS (eek_gtk_keyboard_parent_class)->unmap (self); GTK_WIDGET_CLASS (eek_gtk_keyboard_parent_class)->unmap (self);
} }
@ -240,6 +288,15 @@ eek_gtk_keyboard_set_keyboard (EekGtkKeyboard *self,
priv->key_released_handler = priv->key_released_handler =
g_signal_connect (priv->keyboard, "key-released", g_signal_connect (priv->keyboard, "key-released",
G_CALLBACK(on_key_released), self); G_CALLBACK(on_key_released), self);
priv->key_locked_handler =
g_signal_connect (priv->keyboard, "key-locked",
G_CALLBACK(on_key_locked), self);
priv->key_unlocked_handler =
g_signal_connect (priv->keyboard, "key-unlocked",
G_CALLBACK(on_key_unlocked), self);
priv->key_cancelled_handler =
g_signal_connect (priv->keyboard, "key-cancelled",
G_CALLBACK(on_key_cancelled), self);
priv->symbol_index_changed_handler = priv->symbol_index_changed_handler =
g_signal_connect (priv->keyboard, "symbol-index-changed", g_signal_connect (priv->keyboard, "symbol-index-changed",
G_CALLBACK(on_symbol_index_changed), self); G_CALLBACK(on_symbol_index_changed), self);
@ -259,9 +316,7 @@ eek_gtk_keyboard_set_property (GObject *object,
eek_gtk_keyboard_set_keyboard (EEK_GTK_KEYBOARD(object), keyboard); eek_gtk_keyboard_set_keyboard (EEK_GTK_KEYBOARD(object), keyboard);
break; break;
default: default:
g_object_set_property (object, G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
g_param_spec_get_name (pspec),
value);
break; break;
} }
} }
@ -285,17 +340,30 @@ eek_gtk_keyboard_dispose (GObject *object)
priv->key_released_handler)) priv->key_released_handler))
g_signal_handler_disconnect (priv->keyboard, g_signal_handler_disconnect (priv->keyboard,
priv->key_released_handler); priv->key_released_handler);
if (g_signal_handler_is_connected (priv->keyboard,
priv->key_locked_handler))
g_signal_handler_disconnect (priv->keyboard,
priv->key_locked_handler);
if (g_signal_handler_is_connected (priv->keyboard,
priv->key_unlocked_handler))
g_signal_handler_disconnect (priv->keyboard,
priv->key_unlocked_handler);
if (g_signal_handler_is_connected (priv->keyboard,
priv->key_cancelled_handler))
g_signal_handler_disconnect (priv->keyboard,
priv->key_cancelled_handler);
if (g_signal_handler_is_connected (priv->keyboard, if (g_signal_handler_is_connected (priv->keyboard,
priv->symbol_index_changed_handler)) priv->symbol_index_changed_handler))
g_signal_handler_disconnect (priv->keyboard, g_signal_handler_disconnect (priv->keyboard,
priv->symbol_index_changed_handler); priv->symbol_index_changed_handler);
if (priv->dragged_key) { GList *list, *head;
g_signal_emit_by_name (priv->dragged_key,
"released", list = eek_keyboard_get_pressed_keys (priv->keyboard);
priv->keyboard); for (head = list; head; head = g_list_next (head)) {
priv->dragged_key = NULL; g_signal_emit_by_name (head->data, "released", priv->keyboard);
} }
g_list_free (list);
g_object_unref (priv->keyboard); g_object_unref (priv->keyboard);
priv->keyboard = NULL; priv->keyboard = NULL;
@ -321,16 +389,14 @@ eek_gtk_keyboard_class_init (EekGtkKeyboardClass *klass)
widget_class->realize = eek_gtk_keyboard_real_realize; widget_class->realize = eek_gtk_keyboard_real_realize;
widget_class->unmap = eek_gtk_keyboard_real_unmap; widget_class->unmap = eek_gtk_keyboard_real_unmap;
#if GTK_CHECK_VERSION (2, 91, 2)
widget_class->draw = eek_gtk_keyboard_real_draw; widget_class->draw = eek_gtk_keyboard_real_draw;
#else /* GTK_CHECK_VERSION (2, 91, 2) */
widget_class->expose_event = eek_gtk_keyboard_real_expose_event;
#endif /* !GTK_CHECK_VERSION (2, 91, 2) */
widget_class->size_allocate = eek_gtk_keyboard_real_size_allocate; widget_class->size_allocate = eek_gtk_keyboard_real_size_allocate;
widget_class->button_press_event = widget_class->button_press_event =
eek_gtk_keyboard_real_button_press_event; eek_gtk_keyboard_real_button_press_event;
widget_class->button_release_event = widget_class->button_release_event =
eek_gtk_keyboard_real_button_release_event; eek_gtk_keyboard_real_button_release_event;
widget_class->motion_notify_event =
eek_gtk_keyboard_real_motion_notify_event;
gobject_class->set_property = eek_gtk_keyboard_set_property; gobject_class->set_property = eek_gtk_keyboard_set_property;
gobject_class->dispose = eek_gtk_keyboard_dispose; gobject_class->dispose = eek_gtk_keyboard_dispose;
@ -348,12 +414,7 @@ eek_gtk_keyboard_class_init (EekGtkKeyboardClass *klass)
static void static void
eek_gtk_keyboard_init (EekGtkKeyboard *self) eek_gtk_keyboard_init (EekGtkKeyboard *self)
{ {
EekGtkKeyboardPrivate *priv; self->priv = EEK_GTK_KEYBOARD_GET_PRIVATE(self);
priv = self->priv = EEK_GTK_KEYBOARD_GET_PRIVATE(self);
priv->renderer = NULL;
priv->keyboard = NULL;
priv->dragged_key = NULL;
} }
/** /**
@ -379,15 +440,26 @@ color_from_gdk_color (GdkColor *gdk_color)
} }
static void static void
magnify_bounds (EekBounds *bounds, EekBounds *large_bounds, gdouble scale) magnify_bounds (GtkWidget *self,
EekBounds *bounds,
EekBounds *large_bounds,
gdouble scale)
{ {
GtkAllocation allocation;
gdouble x, y;
g_assert (scale >= 1.0); g_assert (scale >= 1.0);
gtk_widget_get_allocation (self, &allocation);
large_bounds->width = bounds->width * scale; large_bounds->width = bounds->width * scale;
large_bounds->height = bounds->height * scale; large_bounds->height = bounds->height * scale;
large_bounds->x = bounds->x - (large_bounds->width - bounds->width) / 2; x = bounds->x - (large_bounds->width - bounds->width) / 2;
large_bounds->y = bounds->y - (large_bounds->height - bounds->height) / 2; y = bounds->y - large_bounds->height;
large_bounds->x = CLAMP(x, 0, allocation.width - large_bounds->width);
large_bounds->y = CLAMP(y, 0, allocation.height - large_bounds->height);
} }
static void static void
@ -401,10 +473,63 @@ render_pressed_key (GtkWidget *widget,
cr = gdk_cairo_create (GDK_DRAWABLE (gtk_widget_get_window (widget))); cr = gdk_cairo_create (GDK_DRAWABLE (gtk_widget_get_window (widget)));
eek_renderer_get_key_bounds (priv->renderer, key, &bounds, TRUE); eek_renderer_get_key_bounds (priv->renderer, key, &bounds, TRUE);
magnify_bounds (&bounds, &large_bounds, 1.5); magnify_bounds (widget, &bounds, &large_bounds, 1.5);
cairo_save (cr);
cairo_translate (cr, bounds.x, bounds.y);
eek_renderer_render_key (priv->renderer, cr, key, 1.0, TRUE);
cairo_restore (cr);
cairo_save (cr);
cairo_translate (cr, large_bounds.x, large_bounds.y); cairo_translate (cr, large_bounds.x, large_bounds.y);
eek_renderer_render_key (priv->renderer, cr, key, 1.5, TRUE); eek_renderer_render_key (priv->renderer, cr, key, 1.5, TRUE);
cairo_restore (cr);
cairo_destroy (cr);
}
static void
render_locked_key (GtkWidget *widget,
EekKey *key)
{
EekGtkKeyboardPrivate *priv = EEK_GTK_KEYBOARD_GET_PRIVATE(widget);
EekBounds bounds;
cairo_t *cr;
cr = gdk_cairo_create (GDK_DRAWABLE (gtk_widget_get_window (widget)));
eek_renderer_get_key_bounds (priv->renderer, key, &bounds, TRUE);
cairo_translate (cr, bounds.x, bounds.y);
eek_renderer_render_key (priv->renderer, cr, key, 1.0, TRUE);
cairo_destroy (cr);
}
static void
render_released_key (GtkWidget *widget,
EekKey *key)
{
EekGtkKeyboardPrivate *priv = EEK_GTK_KEYBOARD_GET_PRIVATE(widget);
EekBounds bounds, large_bounds;
cairo_t *cr;
cr = gdk_cairo_create (GDK_DRAWABLE (gtk_widget_get_window (widget)));
eek_renderer_get_key_bounds (priv->renderer, key, &bounds, TRUE);
magnify_bounds (widget, &bounds, &large_bounds, 2.0);
cairo_rectangle (cr,
large_bounds.x,
large_bounds.y,
large_bounds.width,
large_bounds.height);
cairo_rectangle (cr,
bounds.x,
bounds.y,
bounds.width,
bounds.height);
cairo_clip (cr);
eek_renderer_render_keyboard (priv->renderer, cr);
cairo_destroy (cr); cairo_destroy (cr);
} }
@ -421,6 +546,14 @@ on_key_pressed (EekKeyboard *keyboard,
return; return;
render_pressed_key (widget, key); render_pressed_key (widget, key);
#if HAVE_LIBCANBERRA
ca_gtk_play_for_widget (widget, 0,
CA_PROP_EVENT_ID, "button-pressed",
CA_PROP_EVENT_DESCRIPTION, "virtual key pressed",
CA_PROP_APPLICATION_ID, "org.fedorahosted.Eekboard",
NULL);
#endif
} }
static void static void
@ -430,27 +563,65 @@ on_key_released (EekKeyboard *keyboard,
{ {
GtkWidget *widget = user_data; GtkWidget *widget = user_data;
EekGtkKeyboardPrivate *priv = EEK_GTK_KEYBOARD_GET_PRIVATE(widget); EekGtkKeyboardPrivate *priv = EEK_GTK_KEYBOARD_GET_PRIVATE(widget);
cairo_t *cr;
EekBounds bounds, large_bounds;
/* renderer may have not been set yet if the widget is a popup */ /* renderer may have not been set yet if the widget is a popup */
if (!priv->renderer) if (!priv->renderer)
return; return;
cr = gdk_cairo_create (GDK_DRAWABLE (gtk_widget_get_window (widget))); render_released_key (widget, key);
eek_renderer_get_key_bounds (priv->renderer, key, &bounds, TRUE); #if HAVE_LIBCANBERRA
magnify_bounds (&bounds, &large_bounds, 2.0); ca_gtk_play_for_widget (widget, 0,
cairo_rectangle (cr, CA_PROP_EVENT_ID, "button-released",
large_bounds.x, CA_PROP_EVENT_DESCRIPTION, "virtual key pressed",
large_bounds.y, CA_PROP_APPLICATION_ID, "org.fedorahosted.Eekboard",
large_bounds.width, NULL);
large_bounds.height); #endif
cairo_clip (cr); }
eek_renderer_render_keyboard (priv->renderer, cr); static void
cairo_set_operator (cr, CAIRO_OPERATOR_CLEAR); on_key_cancelled (EekKeyboard *keyboard,
cairo_destroy (cr); EekKey *key,
gpointer user_data)
{
GtkWidget *widget = user_data;
EekGtkKeyboardPrivate *priv = EEK_GTK_KEYBOARD_GET_PRIVATE(widget);
/* renderer may have not been set yet if the widget is a popup */
if (!priv->renderer)
return;
render_released_key (widget, key);
}
static void
on_key_locked (EekKeyboard *keyboard,
EekKey *key,
gpointer user_data)
{
GtkWidget *widget = user_data;
EekGtkKeyboardPrivate *priv = EEK_GTK_KEYBOARD_GET_PRIVATE(widget);
/* renderer may have not been set yet if the widget is a popup */
if (!priv->renderer)
return;
render_locked_key (widget, key);
}
static void
on_key_unlocked (EekKeyboard *keyboard,
EekKey *key,
gpointer user_data)
{
GtkWidget *widget = user_data;
EekGtkKeyboardPrivate *priv = EEK_GTK_KEYBOARD_GET_PRIVATE(widget);
/* renderer may have not been set yet if the widget is a popup */
if (!priv->renderer)
return;
render_released_key (widget, key);
} }
static void static void

View File

@ -51,58 +51,32 @@ pixbuf_to_cairo_surface (GdkPixbuf *pixbuf)
return surface; return surface;
} }
static void static cairo_surface_t *
eek_gtk_renderer_real_render_key_icon (EekRenderer *self, eek_gtk_renderer_real_get_icon_surface (EekRenderer *self,
cairo_t *cr, const gchar *icon_name,
EekKey *key, gint size)
gdouble scale,
gboolean rotate)
{ {
EekBounds bounds;
EekSymbol *symbol;
const gchar *icon_name;
GdkPixbuf *pixbuf; GdkPixbuf *pixbuf;
cairo_surface_t *surface;
GError *error; GError *error;
gint width, height; cairo_surface_t *surface;
symbol = eek_key_get_symbol_with_fallback (key, 0, 0);
g_return_if_fail (symbol);
icon_name = eek_symbol_get_icon_name (symbol);
g_return_if_fail (icon_name);
eek_element_get_bounds (EEK_ELEMENT(key), &bounds);
bounds.width *= scale;
bounds.height *= scale;
error = NULL; error = NULL;
pixbuf = gtk_icon_theme_load_icon (gtk_icon_theme_get_default (), pixbuf = gtk_icon_theme_load_icon (gtk_icon_theme_get_default (),
icon_name, icon_name,
MIN(bounds.width, bounds.height), size,
0, 0,
&error); &error);
g_return_if_fail (pixbuf); if (pixbuf == NULL) {
g_warning ("can't get icon pixbuf for %s: %s",
icon_name,
error->message);
g_error_free (error);
return NULL;
}
width = gdk_pixbuf_get_width (pixbuf);
height = gdk_pixbuf_get_height (pixbuf);
if (bounds.width * height < bounds.height * width)
scale = bounds.width / width;
else
scale = bounds.height / height;
cairo_save (cr);
cairo_translate (cr,
(bounds.width - width * scale) / 2,
(bounds.height - height * scale) / 2);
eek_renderer_apply_transformation_for_key (self, cr, key, scale, rotate);
surface = pixbuf_to_cairo_surface (pixbuf); surface = pixbuf_to_cairo_surface (pixbuf);
g_object_unref (pixbuf); g_object_unref (pixbuf);
cairo_set_source_surface (cr, surface, 0.0, 0.0); return surface;
cairo_paint (cr);
cairo_restore (cr);
} }
static void static void
@ -110,7 +84,7 @@ eek_gtk_renderer_class_init (EekGtkRendererClass *klass)
{ {
EekRendererClass *renderer_class = EEK_RENDERER_CLASS (klass); EekRendererClass *renderer_class = EEK_RENDERER_CLASS (klass);
renderer_class->render_key_icon = eek_gtk_renderer_real_render_key_icon; renderer_class->get_icon_surface = eek_gtk_renderer_real_get_icon_surface;
} }
static void static void
@ -123,12 +97,8 @@ eek_gtk_renderer_new (EekKeyboard *keyboard,
PangoContext *pcontext, PangoContext *pcontext,
GtkWidget *widget) GtkWidget *widget)
{ {
EekRenderer *renderer; return g_object_new (EEK_TYPE_GTK_RENDERER,
renderer = g_object_new (EEK_TYPE_GTK_RENDERER,
"keyboard", keyboard, "keyboard", keyboard,
"pango-context", pcontext, "pango-context", pcontext,
NULL); NULL);
return renderer;
} }

View File

@ -39,7 +39,6 @@
#include "eek-section.h" #include "eek-section.h"
#include "eek-keyboard.h" #include "eek-keyboard.h"
#include "eek-symbol.h" #include "eek-symbol.h"
#include "eek-serializable.h"
enum { enum {
PROP_0, PROP_0,
@ -54,16 +53,15 @@ enum {
enum { enum {
PRESSED, PRESSED,
RELEASED, RELEASED,
LOCKED,
UNLOCKED,
CANCELLED,
LAST_SIGNAL LAST_SIGNAL
}; };
static guint signals[LAST_SIGNAL] = { 0, }; static guint signals[LAST_SIGNAL] = { 0, };
static void eek_serializable_iface_init (EekSerializableIface *iface); G_DEFINE_TYPE (EekKey, eek_key, EEK_TYPE_ELEMENT);
G_DEFINE_TYPE_WITH_CODE (EekKey, eek_key, EEK_TYPE_ELEMENT,
G_IMPLEMENT_INTERFACE (EEK_TYPE_SERIALIZABLE,
eek_serializable_iface_init));
#define EEK_KEY_GET_PRIVATE(obj) \ #define EEK_KEY_GET_PRIVATE(obj) \
(G_TYPE_INSTANCE_GET_PRIVATE ((obj), EEK_TYPE_KEY, EekKeyPrivate)) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), EEK_TYPE_KEY, EekKeyPrivate))
@ -77,183 +75,9 @@ struct _EekKeyPrivate
gint row; gint row;
gulong oref; gulong oref;
gboolean is_pressed; gboolean is_pressed;
gboolean is_locked;
}; };
static EekSerializableIface *eek_key_parent_serializable_iface;
static GVariant *
_g_variant_new_symbol_matrix (EekSymbolMatrix *symbol_matrix)
{
GVariantBuilder builder, array;
gint i, num_symbols = symbol_matrix->num_groups * symbol_matrix->num_levels;
g_variant_builder_init (&builder, G_VARIANT_TYPE ("(iiv)"));
g_variant_builder_add (&builder, "i", symbol_matrix->num_groups);
g_variant_builder_add (&builder, "i", symbol_matrix->num_levels);
g_variant_builder_init (&array, G_VARIANT_TYPE ("av"));
for (i = 0; i < num_symbols; i++) {
GVariant *symbol = eek_serializable_serialize
(EEK_SERIALIZABLE(symbol_matrix->data[i]));
g_variant_builder_add (&array, "v", symbol);
}
g_variant_builder_add (&builder, "v", g_variant_builder_end (&array));
return g_variant_builder_end (&builder);
}
static EekSymbolMatrix *
_g_variant_get_symbol_matrix (GVariant *variant)
{
gint num_groups, num_levels, i;
EekSymbolMatrix *symbol_matrix;
GVariant *array, *child;
GVariantIter iter;
g_variant_get_child (variant, 0, "i", &num_groups);
g_variant_get_child (variant, 1, "i", &num_levels);
symbol_matrix = eek_symbol_matrix_new (num_groups, num_levels);
g_variant_get_child (variant, 2, "v", &array);
g_variant_iter_init (&iter, array);
for (i = 0; i < num_groups * num_levels; i++) {
EekSerializable *serializable;
if (!g_variant_iter_next (&iter, "v", &child)) {
eek_symbol_matrix_free (symbol_matrix);
g_return_val_if_reached (NULL);
}
serializable = eek_serializable_deserialize (child);
symbol_matrix->data[i] = EEK_SYMBOL(serializable);
}
return symbol_matrix;
}
static void
eek_key_real_serialize (EekSerializable *self,
GVariantBuilder *builder)
{
EekKeyPrivate *priv = EEK_KEY_GET_PRIVATE(self);
eek_key_parent_serializable_iface->serialize (self, builder);
g_variant_builder_add (builder, "u", priv->keycode);
g_variant_builder_add (builder, "v",
_g_variant_new_symbol_matrix (priv->symbol_matrix));
g_variant_builder_add (builder, "i", priv->column);
g_variant_builder_add (builder, "i", priv->row);
g_variant_builder_add (builder, "u", priv->oref);
}
static gsize
eek_key_real_deserialize (EekSerializable *self,
GVariant *variant,
gsize index)
{
EekKeyPrivate *priv = EEK_KEY_GET_PRIVATE(self);
GVariant *symbol_matrix;
index = eek_key_parent_serializable_iface->deserialize (self,
variant,
index);
g_variant_get_child (variant, index++, "u", &priv->keycode);
g_variant_get_child (variant, index++, "v", &symbol_matrix);
eek_symbol_matrix_free (priv->symbol_matrix);
priv->symbol_matrix = _g_variant_get_symbol_matrix (symbol_matrix);
g_variant_get_child (variant, index++, "i", &priv->column);
g_variant_get_child (variant, index++, "i", &priv->row);
g_variant_get_child (variant, index++, "u", &priv->oref);
return index;
}
static void
eek_serializable_iface_init (EekSerializableIface *iface)
{
eek_key_parent_serializable_iface =
g_type_interface_peek_parent (iface);
iface->serialize = eek_key_real_serialize;
iface->deserialize = eek_key_real_deserialize;
}
static void
eek_key_real_set_keycode (EekKey *self, guint keycode)
{
EekKeyPrivate *priv = EEK_KEY_GET_PRIVATE(self);
priv->keycode = keycode;
}
static guint
eek_key_real_get_keycode (EekKey *self)
{
EekKeyPrivate *priv = EEK_KEY_GET_PRIVATE(self);
return priv->keycode;
}
static void
eek_key_real_set_symbol_matrix (EekKey *self,
EekSymbolMatrix *matrix)
{
EekKeyPrivate *priv = EEK_KEY_GET_PRIVATE(self);
eek_symbol_matrix_free (priv->symbol_matrix);
priv->symbol_matrix = eek_symbol_matrix_copy (matrix);
}
static EekSymbolMatrix *
eek_key_real_get_symbol_matrix (EekKey *self)
{
EekKeyPrivate *priv = EEK_KEY_GET_PRIVATE(self);
return priv->symbol_matrix;
}
static void
eek_key_real_set_index (EekKey *self,
gint column,
gint row)
{
EekKeyPrivate *priv = EEK_KEY_GET_PRIVATE(self);
g_return_if_fail (0 <= column);
g_return_if_fail (0 <= row);
priv->column = column;
priv->row = row;
}
static void
eek_key_real_get_index (EekKey *self,
gint *column,
gint *row)
{
EekKeyPrivate *priv = EEK_KEY_GET_PRIVATE(self);
if (column)
*column = priv->column;
if (row)
*row = priv->row;
}
static void
eek_key_real_set_oref (EekKey *self, gulong oref)
{
EekKeyPrivate *priv = EEK_KEY_GET_PRIVATE(self);
priv->oref = oref;
}
static gulong
eek_key_real_get_oref (EekKey *self)
{
EekKeyPrivate *priv = EEK_KEY_GET_PRIVATE(self);
return priv->oref;
}
static gboolean
eek_key_real_is_pressed (EekKey *self)
{
EekKeyPrivate *priv = EEK_KEY_GET_PRIVATE(self);
return priv->is_pressed;
}
static void static void
eek_key_real_pressed (EekKey *self) eek_key_real_pressed (EekKey *self)
{ {
@ -276,6 +100,39 @@ eek_key_real_released (EekKey *self)
#endif #endif
} }
static void
eek_key_real_locked (EekKey *self)
{
EekKeyPrivate *priv = EEK_KEY_GET_PRIVATE(self);
priv->is_locked = TRUE;
#if DEBUG
g_debug ("locked %X", eek_key_get_keycode (self));
#endif
}
static void
eek_key_real_unlocked (EekKey *self)
{
EekKeyPrivate *priv = EEK_KEY_GET_PRIVATE(self);
priv->is_locked = FALSE;
#if DEBUG
g_debug ("unlocked %X", eek_key_get_keycode (self));
#endif
}
static void
eek_key_real_cancelled (EekKey *self)
{
EekKeyPrivate *priv = EEK_KEY_GET_PRIVATE(self);
priv->is_pressed = FALSE;
#if DEBUG
g_debug ("cancelled %X", eek_key_get_keycode (self));
#endif
}
static void static void
eek_key_finalize (GObject *object) eek_key_finalize (GObject *object)
{ {
@ -313,9 +170,7 @@ eek_key_set_property (GObject *object,
eek_key_set_oref (EEK_KEY(object), g_value_get_uint (value)); eek_key_set_oref (EEK_KEY(object), g_value_get_uint (value));
break; break;
default: default:
g_object_set_property (object, G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
g_param_spec_get_name (pspec),
value);
break; break;
} }
} }
@ -328,7 +183,6 @@ eek_key_get_property (GObject *object,
{ {
gint column, row; gint column, row;
g_return_if_fail (EEK_IS_KEY(object));
switch (prop_id) { switch (prop_id) {
case PROP_KEYCODE: case PROP_KEYCODE:
g_value_set_uint (value, eek_key_get_keycode (EEK_KEY(object))); g_value_set_uint (value, eek_key_get_keycode (EEK_KEY(object)));
@ -349,9 +203,7 @@ eek_key_get_property (GObject *object,
g_value_set_uint (value, eek_key_get_oref (EEK_KEY(object))); g_value_set_uint (value, eek_key_get_oref (EEK_KEY(object)));
break; break;
default: default:
g_object_get_property (object, G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
g_param_spec_get_name (pspec),
value);
break; break;
} }
} }
@ -365,16 +217,6 @@ eek_key_class_init (EekKeyClass *klass)
g_type_class_add_private (gobject_class, g_type_class_add_private (gobject_class,
sizeof (EekKeyPrivate)); sizeof (EekKeyPrivate));
klass->get_keycode = eek_key_real_get_keycode;
klass->set_keycode = eek_key_real_set_keycode;
klass->set_symbol_matrix = eek_key_real_set_symbol_matrix;
klass->get_symbol_matrix = eek_key_real_get_symbol_matrix;
klass->set_index = eek_key_real_set_index;
klass->get_index = eek_key_real_get_index;
klass->set_oref = eek_key_real_set_oref;
klass->get_oref = eek_key_real_get_oref;
klass->is_pressed = eek_key_real_is_pressed;
gobject_class->set_property = eek_key_set_property; gobject_class->set_property = eek_key_set_property;
gobject_class->get_property = eek_key_get_property; gobject_class->get_property = eek_key_get_property;
gobject_class->finalize = eek_key_finalize; gobject_class->finalize = eek_key_finalize;
@ -382,6 +224,9 @@ eek_key_class_init (EekKeyClass *klass)
/* signals */ /* signals */
klass->pressed = eek_key_real_pressed; klass->pressed = eek_key_real_pressed;
klass->released = eek_key_real_released; klass->released = eek_key_real_released;
klass->locked = eek_key_real_locked;
klass->unlocked = eek_key_real_unlocked;
klass->cancelled = eek_key_real_cancelled;
/** /**
* EekKey:keycode: * EekKey:keycode:
@ -478,6 +323,59 @@ eek_key_class_init (EekKeyClass *klass)
NULL, NULL,
g_cclosure_marshal_VOID__VOID, g_cclosure_marshal_VOID__VOID,
G_TYPE_NONE, 0); G_TYPE_NONE, 0);
/**
* EekKey::locked:
* @key: an #EekKey
*
* The ::locked signal is emitted each time @key is shifted to
* the locked state. The class handler runs before signal
* handlers to allow signal handlers to read the status of @key
* with eek_key_is_locked().
*/
signals[LOCKED] =
g_signal_new (I_("locked"),
G_TYPE_FROM_CLASS(gobject_class),
G_SIGNAL_RUN_FIRST,
G_STRUCT_OFFSET(EekKeyClass, locked),
NULL,
NULL,
g_cclosure_marshal_VOID__VOID,
G_TYPE_NONE, 0);
/**
* EekKey::unlocked:
* @key: an #EekKey
*
* The ::unlocked signal is emitted each time @key is shifted to
* the unlocked state.
*/
signals[UNLOCKED] =
g_signal_new (I_("unlocked"),
G_TYPE_FROM_CLASS(gobject_class),
G_SIGNAL_RUN_LAST,
G_STRUCT_OFFSET(EekKeyClass, unlocked),
NULL,
NULL,
g_cclosure_marshal_VOID__VOID,
G_TYPE_NONE, 0);
/**
* EekKey::cancelled:
* @key: an #EekKey
*
* The ::cancelled signal is emitted each time @key is shifted to
* the cancelled state.
*/
signals[CANCELLED] =
g_signal_new (I_("cancelled"),
G_TYPE_FROM_CLASS(gobject_class),
G_SIGNAL_RUN_LAST,
G_STRUCT_OFFSET(EekKeyClass, cancelled),
NULL,
NULL,
g_cclosure_marshal_VOID__VOID,
G_TYPE_NONE, 0);
} }
static void static void
@ -486,10 +384,7 @@ eek_key_init (EekKey *self)
EekKeyPrivate *priv; EekKeyPrivate *priv;
priv = self->priv = EEK_KEY_GET_PRIVATE(self); priv = self->priv = EEK_KEY_GET_PRIVATE(self);
priv->keycode = 0;
priv->symbol_matrix = eek_symbol_matrix_new (0, 0); priv->symbol_matrix = eek_symbol_matrix_new (0, 0);
priv->column = priv->row = 0;
priv->oref = 0;
} }
/** /**
@ -508,7 +403,7 @@ eek_key_set_keycode (EekKey *key,
guint keycode) guint keycode)
{ {
g_return_if_fail (EEK_IS_KEY (key)); g_return_if_fail (EEK_IS_KEY (key));
EEK_KEY_GET_CLASS(key)->set_keycode (key, keycode); key->priv->keycode = keycode;
} }
/** /**
@ -522,7 +417,7 @@ guint
eek_key_get_keycode (EekKey *key) eek_key_get_keycode (EekKey *key)
{ {
g_return_val_if_fail (EEK_IS_KEY (key), EEK_INVALID_KEYCODE); g_return_val_if_fail (EEK_IS_KEY (key), EEK_INVALID_KEYCODE);
return EEK_KEY_GET_CLASS(key)->get_keycode (key); return key->priv->keycode;
} }
/** /**
@ -537,7 +432,9 @@ eek_key_set_symbol_matrix (EekKey *key,
EekSymbolMatrix *matrix) EekSymbolMatrix *matrix)
{ {
g_return_if_fail (EEK_IS_KEY(key)); g_return_if_fail (EEK_IS_KEY(key));
EEK_KEY_GET_CLASS(key)->set_symbol_matrix (key, matrix);
eek_symbol_matrix_free (key->priv->symbol_matrix);
key->priv->symbol_matrix = eek_symbol_matrix_copy (matrix);
} }
/** /**
@ -545,13 +442,13 @@ 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)
{ {
g_return_val_if_fail (EEK_IS_KEY(key), NULL); g_return_val_if_fail (EEK_IS_KEY(key), NULL);
return EEK_KEY_GET_CLASS(key)->get_symbol_matrix (key); return key->priv->symbol_matrix;
} }
/** /**
@ -688,14 +585,24 @@ eek_key_set_index (EekKey *key,
gint row) gint row)
{ {
g_return_if_fail (EEK_IS_KEY(key)); g_return_if_fail (EEK_IS_KEY(key));
EEK_KEY_GET_CLASS(key)->set_index (key, column, row); g_return_if_fail (0 <= column);
g_return_if_fail (0 <= row);
if (key->priv->column != column) {
key->priv->column = column;
g_object_notify (G_OBJECT(key), "column");
}
if (key->priv->row != row) {
key->priv->row = row;
g_object_notify (G_OBJECT(key), "row");
}
} }
/** /**
* eek_key_get_index: * eek_key_get_index:
* @key: an #EekKey * @key: an #EekKey
* @column: pointer where the column index of @key in #EekSection will be stored * @column: (allow-none): pointer where the column index of @key in #EekSection will be stored
* @row: pointer where the row index of @key in #EekSection will be stored * @row: (allow-none): pointer where the row index of @key in #EekSection will be stored
* *
* Get the location of @key in #EekSection. * Get the location of @key in #EekSection.
*/ */
@ -705,7 +612,12 @@ eek_key_get_index (EekKey *key,
gint *row) gint *row)
{ {
g_return_if_fail (EEK_IS_KEY(key)); g_return_if_fail (EEK_IS_KEY(key));
EEK_KEY_GET_CLASS(key)->get_index (key, column, row); g_return_if_fail (column != NULL || row != NULL);
if (column != NULL)
*column = key->priv->column;
if (row != NULL)
*row = key->priv->row;
} }
/** /**
@ -717,10 +629,13 @@ eek_key_get_index (EekKey *key,
*/ */
void void
eek_key_set_oref (EekKey *key, eek_key_set_oref (EekKey *key,
gulong oref) guint oref)
{ {
g_return_if_fail (EEK_IS_KEY(key)); g_return_if_fail (EEK_IS_KEY(key));
EEK_KEY_GET_CLASS(key)->set_oref (key, oref); if (key->priv->oref != oref) {
key->priv->oref = oref;
g_object_notify (G_OBJECT(key), "oref");
}
} }
/** /**
@ -728,13 +643,13 @@ eek_key_set_oref (EekKey *key,
* @key: an #EekKey * @key: an #EekKey
* *
* Get the outline id of @key. * Get the outline id of @key.
* Returns: a non-zero unsigned integer on success, 0 if the id is not set * Returns: unsigned integer
*/ */
gulong guint
eek_key_get_oref (EekKey *key) eek_key_get_oref (EekKey *key)
{ {
g_return_val_if_fail (EEK_IS_KEY (key), 0); g_return_val_if_fail (EEK_IS_KEY (key), 0);
return EEK_KEY_GET_CLASS(key)->get_oref (key); return key->priv->oref;
} }
/** /**
@ -746,6 +661,19 @@ eek_key_get_oref (EekKey *key)
gboolean gboolean
eek_key_is_pressed (EekKey *key) eek_key_is_pressed (EekKey *key)
{ {
g_assert (EEK_IS_KEY(key)); g_return_val_if_fail (EEK_IS_KEY(key), FALSE);
return EEK_KEY_GET_CLASS(key)->is_pressed (key); return key->priv->is_pressed;
}
/**
* eek_key_is_locked:
* @key: an #EekKey
*
* Return %TRUE if key is marked as locked.
*/
gboolean
eek_key_is_locked (EekKey *key)
{
g_return_val_if_fail (EEK_IS_KEY(key), FALSE);
return key->priv->is_locked;
} }

View File

@ -40,6 +40,12 @@ G_BEGIN_DECLS
typedef struct _EekKeyClass EekKeyClass; typedef struct _EekKeyClass EekKeyClass;
typedef struct _EekKeyPrivate EekKeyPrivate; typedef struct _EekKeyPrivate EekKeyPrivate;
/**
* EekKey:
*
* The #EekKey structure contains only private data and should only be
* accessed using the provided API.
*/
struct _EekKey struct _EekKey
{ {
/*< private >*/ /*< private >*/
@ -50,19 +56,13 @@ struct _EekKey
/** /**
* EekKeyClass: * EekKeyClass:
* @set_keycode: virtual function for setting keycode of the key
* @get_keycode: virtual function for getting keycode of the key
* @set_symbol_matrix: virtual function for setting symbol matrix of the key
* @get_symbol_matrix: virtual function for getting symbol matrix of the key
* @set_index: virtual function for setting position of the key in the
* section
* @get_index: virtual function for getting position of the key in the
* section
* @set_oref: virtual function for setting outline id of the key
* @get_oref: virtual function for getting outline id of the key
* @pressed: class handler for #EekKey::pressed signal * @pressed: class handler for #EekKey::pressed signal
* @released: class handler for #EekKey::released signal * @released: class handler for #EekKey::released signal
* @locked: class handler for #EekKey::locked signal
* @unlocked: class handler for #EekKey::unlocked signal
* @cancelled: class handler for #EekKey::cancelled signal
* @is_pressed: virtual function for getting whether the key is pressed * @is_pressed: virtual function for getting whether the key is pressed
* @is_locked: virtual function for getting whether the key is locked
*/ */
struct _EekKeyClass struct _EekKeyClass
{ {
@ -70,33 +70,12 @@ struct _EekKeyClass
EekElementClass parent_class; EekElementClass parent_class;
/*< public >*/ /*< public >*/
void (* set_keycode) (EekKey *self,
guint keycode);
guint (* get_keycode) (EekKey *self);
void (* set_symbol_matrix) (EekKey *self,
EekSymbolMatrix *matrix);
EekSymbolMatrix *(* get_symbol_matrix) (EekKey *self);
void (* set_index) (EekKey *self,
gint column,
gint row);
void (* get_index) (EekKey *self,
gint *column,
gint *row);
void (* set_oref) (EekKey *self,
gulong oref);
gulong (* get_oref) (EekKey *self);
gboolean (* is_pressed) (EekKey *self);
/* signals */ /* signals */
void (* pressed) (EekKey *key); void (* pressed) (EekKey *key);
void (* released) (EekKey *key); void (* released) (EekKey *key);
void (* locked) (EekKey *key);
/*< private >*/ void (* unlocked) (EekKey *key);
/* padding */ void (* cancelled) (EekKey *key);
gpointer pdummy[24];
}; };
GType eek_key_get_type (void) G_GNUC_CONST; GType eek_key_get_type (void) G_GNUC_CONST;
@ -126,10 +105,11 @@ void eek_key_get_index (EekKey *key,
gint *row); gint *row);
void eek_key_set_oref (EekKey *key, void eek_key_set_oref (EekKey *key,
gulong oref); guint oref);
gulong eek_key_get_oref (EekKey *key); guint eek_key_get_oref (EekKey *key);
gboolean eek_key_is_pressed (EekKey *key); gboolean eek_key_is_pressed (EekKey *key);
gboolean eek_key_is_locked (EekKey *key);
G_END_DECLS G_END_DECLS
#endif /* EEK_KEY_H */ #endif /* EEK_KEY_H */

View File

@ -35,7 +35,6 @@
#include "eek-section.h" #include "eek-section.h"
#include "eek-key.h" #include "eek-key.h"
#include "eek-symbol.h" #include "eek-symbol.h"
#include "eek-serializable.h"
#include "eek-enumtypes.h" #include "eek-enumtypes.h"
enum { enum {
@ -48,145 +47,48 @@ enum {
enum { enum {
KEY_PRESSED, KEY_PRESSED,
KEY_RELEASED, KEY_RELEASED,
KEY_LOCKED,
KEY_UNLOCKED,
KEY_CANCELLED,
LAST_SIGNAL LAST_SIGNAL
}; };
static guint signals[LAST_SIGNAL] = { 0, }; static guint signals[LAST_SIGNAL] = { 0, };
static void eek_serializable_iface_init (EekSerializableIface *iface); G_DEFINE_TYPE (EekKeyboard, eek_keyboard, EEK_TYPE_CONTAINER);
G_DEFINE_TYPE_WITH_CODE (EekKeyboard, eek_keyboard, EEK_TYPE_CONTAINER,
G_IMPLEMENT_INTERFACE (EEK_TYPE_SERIALIZABLE,
eek_serializable_iface_init));
#define EEK_KEYBOARD_GET_PRIVATE(obj) \ #define EEK_KEYBOARD_GET_PRIVATE(obj) \
(G_TYPE_INSTANCE_GET_PRIVATE ((obj), EEK_TYPE_KEYBOARD, EekKeyboardPrivate)) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), EEK_TYPE_KEYBOARD, EekKeyboardPrivate))
struct _EekKeyboardPrivate struct _EekKeyboardPrivate
{ {
EekLayout *layout; EekLayout *layout;
EekModifierBehavior modifier_behavior; EekModifierBehavior modifier_behavior;
EekModifierType modifiers; EekModifierType modifiers;
GList *pressed_keys;
GList *locked_keys;
GArray *outline_array; GArray *outline_array;
GHashTable *keycodes;
/* modifiers dynamically assigned at run time */ /* modifiers dynamically assigned at run time */
EekModifierType num_lock_mask; EekModifierType num_lock_mask;
EekModifierType alt_gr_mask; EekModifierType alt_gr_mask;
}; };
static EekSerializableIface *eek_keyboard_parent_serializable_iface; G_DEFINE_BOXED_TYPE(EekModifierKey, eek_modifier_key,
eek_modifier_key_copy, eek_modifier_key_free);
static GVariant *_g_variant_new_outline (EekOutline *outline); EekModifierKey *
static EekOutline *_g_variant_get_outline (GVariant *variant); eek_modifier_key_copy (EekModifierKey *modkey)
static GVariant *
_g_variant_new_outline (EekOutline *outline)
{ {
GVariantBuilder builder, array; return g_slice_dup (EekModifierKey, modkey);
gint i;
g_variant_builder_init (&builder, G_VARIANT_TYPE ("(div)"));
g_variant_builder_add (&builder, "d", outline->corner_radius);
g_variant_builder_add (&builder, "i", outline->num_points);
g_variant_builder_init (&array, G_VARIANT_TYPE ("a(dd)"));
for (i = 0; i < outline->num_points; i++)
g_variant_builder_add (&array,
"(dd)",
outline->points[i].x,
outline->points[i].y);
g_variant_builder_add (&builder, "v", g_variant_builder_end (&array));
return g_variant_builder_end (&builder);
} }
static EekOutline * void
_g_variant_get_outline (GVariant *variant) eek_modifier_key_free (EekModifierKey *modkey)
{ {
EekOutline *outline; g_object_unref (modkey->key);
GVariant *array; g_slice_free (EekModifierKey, modkey);
GVariantIter iter;
gdouble x, y;
gint i;
outline = g_slice_new0 (EekOutline);
g_variant_get_child (variant, 0, "d", &outline->corner_radius);
g_variant_get_child (variant, 1, "i", &outline->num_points);
outline->points = g_slice_alloc0 (sizeof (EekPoint) * outline->num_points);
g_variant_get_child (variant, 2, "v", &array);
g_variant_iter_init (&iter, array);
for (i = 0; i < outline->num_points; i++) {
if (!g_variant_iter_next (&iter, "(dd)", &x, &y)) {
eek_outline_free (outline);
g_return_val_if_reached (NULL);
}
outline->points[i].x = x;
outline->points[i].y = y;
}
return outline;
}
static void
eek_keyboard_real_serialize (EekSerializable *self,
GVariantBuilder *builder)
{
EekKeyboardPrivate *priv = EEK_KEYBOARD_GET_PRIVATE(self);
GVariantBuilder array;
guint i;
eek_keyboard_parent_serializable_iface->serialize (self, builder);
g_variant_builder_init (&array, G_VARIANT_TYPE ("av"));
for (i = 0; i < priv->outline_array->len; i++) {
EekOutline *outline =
eek_keyboard_get_outline (EEK_KEYBOARD(self), i + 1);
g_variant_builder_add (&array, "v",
_g_variant_new_outline (outline));
}
g_variant_builder_add (builder, "v", g_variant_builder_end (&array));
g_variant_builder_add (builder, "u", priv->num_lock_mask);
g_variant_builder_add (builder, "u", priv->alt_gr_mask);
}
static gsize
eek_keyboard_real_deserialize (EekSerializable *self,
GVariant *variant,
gsize index)
{
EekKeyboardPrivate *priv = EEK_KEYBOARD_GET_PRIVATE(self);
GVariant *array, *outline;
GVariantIter iter;
index = eek_keyboard_parent_serializable_iface->deserialize (self,
variant,
index);
g_variant_get_child (variant, index++, "v", &array);
g_variant_iter_init (&iter, array);
while (g_variant_iter_next (&iter, "v", &outline)) {
EekOutline *_outline = _g_variant_get_outline (outline);
g_array_append_val (priv->outline_array, *_outline);
/* don't use eek_outline_free here, so as to keep _outline->points */
g_slice_free (EekOutline, _outline);
}
g_variant_get_child (variant, index++, "u", &priv->num_lock_mask);
g_variant_get_child (variant, index++, "u", &priv->alt_gr_mask);
return index;
}
static void
eek_serializable_iface_init (EekSerializableIface *iface)
{
eek_keyboard_parent_serializable_iface =
g_type_interface_peek_parent (iface);
iface->serialize = eek_keyboard_real_serialize;
iface->deserialize = eek_keyboard_real_deserialize;
} }
static void static void
@ -194,7 +96,7 @@ on_key_pressed (EekSection *section,
EekKey *key, EekKey *key,
EekKeyboard *keyboard) EekKeyboard *keyboard)
{ {
g_signal_emit_by_name (keyboard, "key-pressed", key); g_signal_emit (keyboard, signals[KEY_PRESSED], 0, key);
} }
static void static void
@ -202,7 +104,31 @@ on_key_released (EekSection *section,
EekKey *key, EekKey *key,
EekKeyboard *keyboard) EekKeyboard *keyboard)
{ {
g_signal_emit_by_name (keyboard, "key-released", key); g_signal_emit (keyboard, signals[KEY_RELEASED], 0, key);
}
static void
on_key_locked (EekSection *section,
EekKey *key,
EekKeyboard *keyboard)
{
g_signal_emit (keyboard, signals[KEY_LOCKED], 0, key);
}
static void
on_key_unlocked (EekSection *section,
EekKey *key,
EekKeyboard *keyboard)
{
g_signal_emit (keyboard, signals[KEY_UNLOCKED], 0, key);
}
static void
on_key_cancelled (EekSection *section,
EekKey *key,
EekKeyboard *keyboard)
{
g_signal_emit (keyboard, signals[KEY_CANCELLED], 0, key);
} }
static void static void
@ -214,6 +140,27 @@ on_symbol_index_changed (EekSection *section,
g_signal_emit_by_name (keyboard, "symbol-index-changed", group, level); g_signal_emit_by_name (keyboard, "symbol-index-changed", group, level);
} }
static void
section_child_added_cb (EekContainer *container,
EekElement *element,
EekKeyboard *keyboard)
{
guint keycode = eek_key_get_keycode (EEK_KEY(element));
g_hash_table_insert (keyboard->priv->keycodes,
GUINT_TO_POINTER(keycode),
element);
}
static void
section_child_removed_cb (EekContainer *container,
EekElement *element,
EekKeyboard *keyboard)
{
guint keycode = eek_key_get_keycode (EEK_KEY(element));
g_hash_table_remove (keyboard->priv->keycodes,
GUINT_TO_POINTER(keycode));
}
static EekSection * static EekSection *
eek_keyboard_real_create_section (EekKeyboard *self) eek_keyboard_real_create_section (EekKeyboard *self)
{ {
@ -222,43 +169,17 @@ eek_keyboard_real_create_section (EekKeyboard *self)
section = g_object_new (EEK_TYPE_SECTION, NULL); section = g_object_new (EEK_TYPE_SECTION, NULL);
g_return_val_if_fail (section, NULL); g_return_val_if_fail (section, NULL);
g_signal_connect (G_OBJECT(section), "child-added",
G_CALLBACK(section_child_added_cb), self);
g_signal_connect (G_OBJECT(section), "child-removed",
G_CALLBACK(section_child_removed_cb), self);
EEK_CONTAINER_GET_CLASS(self)->add_child (EEK_CONTAINER(self), EEK_CONTAINER_GET_CLASS(self)->add_child (EEK_CONTAINER(self),
EEK_ELEMENT(section)); EEK_ELEMENT(section));
return section; return section;
} }
struct _FindKeyByKeycodeCallbackData {
EekKey *key;
guint keycode;
};
typedef struct _FindKeyByKeycodeCallbackData FindKeyByKeycodeCallbackData;
static gint
find_key_by_keycode_section_callback (EekElement *element, gpointer user_data)
{
FindKeyByKeycodeCallbackData *data = user_data;
data->key = eek_section_find_key_by_keycode (EEK_SECTION(element),
data->keycode);
if (data->key)
return 0;
return -1;
}
static EekKey *
eek_keyboard_real_find_key_by_keycode (EekKeyboard *self,
guint keycode)
{
FindKeyByKeycodeCallbackData data;
data.keycode = keycode;
if (eek_container_find (EEK_CONTAINER(self),
find_key_by_keycode_section_callback,
&data))
return data.key;
return NULL;
}
static void static void
eek_keyboard_set_property (GObject *object, eek_keyboard_set_property (GObject *object,
guint prop_id, guint prop_id,
@ -278,9 +199,7 @@ eek_keyboard_set_property (GObject *object,
g_value_get_enum (value)); g_value_get_enum (value));
break; break;
default: default:
g_object_set_property (object, G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
g_param_spec_get_name (pspec),
value);
break; break;
} }
} }
@ -302,9 +221,7 @@ eek_keyboard_get_property (GObject *object,
eek_keyboard_get_modifier_behavior (EEK_KEYBOARD(object))); eek_keyboard_get_modifier_behavior (EEK_KEYBOARD(object)));
break; break;
default: default:
g_object_get_property (object, G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
g_param_spec_get_name (pspec),
value);
break; break;
} }
} }
@ -322,6 +239,45 @@ set_level_from_modifiers (EekKeyboard *self)
eek_element_set_level (EEK_ELEMENT(self), level); eek_element_set_level (EEK_ELEMENT(self), level);
} }
static void
set_modifiers_with_key (EekKeyboard *self,
EekKey *key,
EekModifierType modifiers)
{
EekKeyboardPrivate *priv = EEK_KEYBOARD_GET_PRIVATE(self);
EekModifierType enabled = (priv->modifiers ^ modifiers) & modifiers;
EekModifierType disabled = (priv->modifiers ^ modifiers) & priv->modifiers;
if (enabled != 0) {
if (priv->modifier_behavior != EEK_MODIFIER_BEHAVIOR_NONE) {
EekModifierKey *modifier_key = g_slice_new (EekModifierKey);
modifier_key->modifiers = enabled;
modifier_key->key = g_object_ref (key);
priv->locked_keys =
g_list_prepend (priv->locked_keys, modifier_key);
g_signal_emit_by_name (modifier_key->key, "locked");
}
} else {
if (priv->modifier_behavior != EEK_MODIFIER_BEHAVIOR_NONE) {
GList *head;
for (head = priv->locked_keys; head; ) {
EekModifierKey *modifier_key = head->data;
if (modifier_key->modifiers & disabled) {
GList *next = g_list_next (head);
priv->locked_keys =
g_list_remove_link (priv->locked_keys, head);
g_signal_emit_by_name (modifier_key->key, "unlocked");
g_list_free1 (head);
head = next;
} else
head = g_list_next (head);
}
}
}
priv->modifiers = modifiers;
}
static void static void
eek_keyboard_real_key_pressed (EekKeyboard *self, eek_keyboard_real_key_pressed (EekKeyboard *self,
EekKey *key) EekKey *key)
@ -330,13 +286,15 @@ eek_keyboard_real_key_pressed (EekKeyboard *self,
EekSymbol *symbol; EekSymbol *symbol;
EekModifierType modifier; EekModifierType modifier;
priv->pressed_keys = g_list_prepend (priv->pressed_keys, key);
symbol = eek_key_get_symbol_with_fallback (key, 0, 0); symbol = eek_key_get_symbol_with_fallback (key, 0, 0);
if (!symbol) if (!symbol)
return; return;
modifier = eek_symbol_get_modifier_mask (symbol); modifier = eek_symbol_get_modifier_mask (symbol);
if (priv->modifier_behavior == EEK_MODIFIER_BEHAVIOR_NONE) { if (priv->modifier_behavior == EEK_MODIFIER_BEHAVIOR_NONE) {
priv->modifiers |= modifier; set_modifiers_with_key (self, key, priv->modifiers | modifier);
set_level_from_modifiers (self); set_level_from_modifiers (self);
} }
} }
@ -349,6 +307,8 @@ eek_keyboard_real_key_released (EekKeyboard *self,
EekSymbol *symbol; EekSymbol *symbol;
EekModifierType modifier; EekModifierType modifier;
EEK_KEYBOARD_GET_CLASS (self)->key_cancelled (self, key);
symbol = eek_key_get_symbol_with_fallback (key, 0, 0); symbol = eek_key_get_symbol_with_fallback (key, 0, 0);
if (!symbol) if (!symbol)
return; return;
@ -356,21 +316,38 @@ eek_keyboard_real_key_released (EekKeyboard *self,
modifier = eek_symbol_get_modifier_mask (symbol); modifier = eek_symbol_get_modifier_mask (symbol);
switch (priv->modifier_behavior) { switch (priv->modifier_behavior) {
case EEK_MODIFIER_BEHAVIOR_NONE: case EEK_MODIFIER_BEHAVIOR_NONE:
priv->modifiers &= ~modifier; set_modifiers_with_key (self, key, priv->modifiers & ~modifier);
break; break;
case EEK_MODIFIER_BEHAVIOR_LOCK: case EEK_MODIFIER_BEHAVIOR_LOCK:
priv->modifiers ^= modifier; priv->modifiers ^= modifier;
break; break;
case EEK_MODIFIER_BEHAVIOR_LATCH: case EEK_MODIFIER_BEHAVIOR_LATCH:
if (modifier == priv->alt_gr_mask || modifier == EEK_SHIFT_MASK) if (modifier)
priv->modifiers ^= modifier; set_modifiers_with_key (self, key, priv->modifiers ^ modifier);
else else
priv->modifiers = (priv->modifiers ^ modifier) & modifier; set_modifiers_with_key (self, key,
(priv->modifiers ^ modifier) & modifier);
break; break;
} }
set_level_from_modifiers (self); set_level_from_modifiers (self);
} }
static void
eek_keyboard_real_key_cancelled (EekKeyboard *self,
EekKey *key)
{
EekKeyboardPrivate *priv = EEK_KEYBOARD_GET_PRIVATE(self);
GList *head;
for (head = priv->pressed_keys; head; head = g_list_next (head)) {
if (head->data == key) {
priv->pressed_keys = g_list_remove_link (priv->pressed_keys, head);
g_list_free1 (head);
break;
}
}
}
static void static void
eek_keyboard_dispose (GObject *object) eek_keyboard_dispose (GObject *object)
{ {
@ -390,6 +367,12 @@ eek_keyboard_finalize (GObject *object)
EekKeyboardPrivate *priv = EEK_KEYBOARD_GET_PRIVATE(object); EekKeyboardPrivate *priv = EEK_KEYBOARD_GET_PRIVATE(object);
gint i; gint i;
g_list_free (priv->pressed_keys);
g_list_free_full (priv->locked_keys,
(GDestroyNotify) eek_modifier_key_free);
g_hash_table_destroy (priv->keycodes);
for (i = 0; i < priv->outline_array->len; i++) { for (i = 0; i < priv->outline_array->len; i++) {
EekOutline *outline = &g_array_index (priv->outline_array, EekOutline *outline = &g_array_index (priv->outline_array,
EekOutline, EekOutline,
@ -410,6 +393,12 @@ eek_keyboard_real_child_added (EekContainer *self,
G_CALLBACK(on_key_pressed), self); G_CALLBACK(on_key_pressed), self);
g_signal_connect (element, "key-released", g_signal_connect (element, "key-released",
G_CALLBACK(on_key_released), self); G_CALLBACK(on_key_released), self);
g_signal_connect (element, "key-locked",
G_CALLBACK(on_key_locked), self);
g_signal_connect (element, "key-unlocked",
G_CALLBACK(on_key_unlocked), self);
g_signal_connect (element, "key-cancelled",
G_CALLBACK(on_key_cancelled), self);
g_signal_connect (element, "symbol-index-changed", g_signal_connect (element, "symbol-index-changed",
G_CALLBACK(on_symbol_index_changed), self); G_CALLBACK(on_symbol_index_changed), self);
} }
@ -420,6 +409,9 @@ eek_keyboard_real_child_removed (EekContainer *self,
{ {
g_signal_handlers_disconnect_by_func (element, on_key_pressed, self); g_signal_handlers_disconnect_by_func (element, on_key_pressed, self);
g_signal_handlers_disconnect_by_func (element, on_key_released, self); g_signal_handlers_disconnect_by_func (element, on_key_released, self);
g_signal_handlers_disconnect_by_func (element, on_key_locked, self);
g_signal_handlers_disconnect_by_func (element, on_key_unlocked, self);
g_signal_handlers_disconnect_by_func (element, on_key_cancelled, self);
} }
static void static void
@ -433,11 +425,11 @@ eek_keyboard_class_init (EekKeyboardClass *klass)
sizeof (EekKeyboardPrivate)); sizeof (EekKeyboardPrivate));
klass->create_section = eek_keyboard_real_create_section; klass->create_section = eek_keyboard_real_create_section;
klass->find_key_by_keycode = eek_keyboard_real_find_key_by_keycode;
/* signals */ /* signals */
klass->key_pressed = eek_keyboard_real_key_pressed; klass->key_pressed = eek_keyboard_real_key_pressed;
klass->key_released = eek_keyboard_real_key_released; klass->key_released = eek_keyboard_real_key_released;
klass->key_cancelled = eek_keyboard_real_key_cancelled;
container_class->child_added = eek_keyboard_real_child_added; container_class->child_added = eek_keyboard_real_child_added;
container_class->child_removed = eek_keyboard_real_child_removed; container_class->child_removed = eek_keyboard_real_child_removed;
@ -515,130 +507,78 @@ eek_keyboard_class_init (EekKeyboardClass *klass)
G_TYPE_NONE, G_TYPE_NONE,
1, 1,
EEK_TYPE_KEY); EEK_TYPE_KEY);
/**
* EekKeyboard::key-locked:
* @keyboard: an #EekKeyboard
* @key: an #EekKey
*
* The ::key-locked signal is emitted each time a key in @keyboard
* is shifted to the locked state.
*/
signals[KEY_LOCKED] =
g_signal_new (I_("key-locked"),
G_TYPE_FROM_CLASS(gobject_class),
G_SIGNAL_RUN_LAST,
G_STRUCT_OFFSET(EekKeyboardClass, key_locked),
NULL,
NULL,
g_cclosure_marshal_VOID__OBJECT,
G_TYPE_NONE,
1,
EEK_TYPE_KEY);
/**
* EekKeyboard::key-unlocked:
* @keyboard: an #EekKeyboard
* @key: an #EekKey
*
* The ::key-unlocked signal is emitted each time a key in @keyboard
* is shifted to the unlocked state.
*/
signals[KEY_UNLOCKED] =
g_signal_new (I_("key-unlocked"),
G_TYPE_FROM_CLASS(gobject_class),
G_SIGNAL_RUN_LAST,
G_STRUCT_OFFSET(EekKeyboardClass, key_unlocked),
NULL,
NULL,
g_cclosure_marshal_VOID__OBJECT,
G_TYPE_NONE,
1,
EEK_TYPE_KEY);
/**
* EekKeyboard::key-cancelled:
* @keyboard: an #EekKeyboard
* @key: an #EekKey
*
* The ::key-cancelled signal is emitted each time a key in @keyboard
* is shifted to the cancelled state.
*/
signals[KEY_CANCELLED] =
g_signal_new (I_("key-cancelled"),
G_TYPE_FROM_CLASS(gobject_class),
G_SIGNAL_RUN_LAST,
G_STRUCT_OFFSET(EekKeyboardClass, key_cancelled),
NULL,
NULL,
g_cclosure_marshal_VOID__OBJECT,
G_TYPE_NONE,
1,
EEK_TYPE_KEY);
} }
static void static void
eek_keyboard_init (EekKeyboard *self) eek_keyboard_init (EekKeyboard *self)
{ {
EekKeyboardPrivate *priv; self->priv = EEK_KEYBOARD_GET_PRIVATE(self);
self->priv->modifier_behavior = EEK_MODIFIER_BEHAVIOR_NONE;
priv = self->priv = EEK_KEYBOARD_GET_PRIVATE(self); self->priv->outline_array = g_array_new (FALSE, TRUE, sizeof (EekOutline));
priv->layout = NULL; self->priv->keycodes = g_hash_table_new (g_direct_hash, g_direct_equal);
priv->modifier_behavior = EEK_MODIFIER_BEHAVIOR_NONE;
priv->modifiers = 0;
priv->outline_array = g_array_new (FALSE, TRUE, sizeof (EekOutline));
priv->num_lock_mask = 0;
eek_element_set_symbol_index (EEK_ELEMENT(self), 0, 0); eek_element_set_symbol_index (EEK_ELEMENT(self), 0, 0);
} }
/**
* eek_keyboard_set_symbol_index:
* @keyboard: an #EekKeyboard
* @group: row index of the symbol matrix of keys on @keyboard
* @level: column index of the symbol matrix of keys on @keyboard
*
* Set the default index of the symbol matrices of keys in @keyboard.
* To unset, pass -1 as group/level.
*
* Deprecated: 1.0: Use eek_element_set_symbol_index()
*/
void
eek_keyboard_set_symbol_index (EekKeyboard *keyboard,
gint group,
gint level)
{
g_return_if_fail (EEK_IS_KEYBOARD(keyboard));
eek_element_set_symbol_index (EEK_ELEMENT(keyboard), group, level);
}
/**
* eek_keyboard_get_symbol_index:
* @keyboard: an #EekKeyboard
* @group: a pointer where the group value of the symbol index will be stored
* @level: a pointer where the level value of the symbol index will be stored
*
* Get the default index of the symbol matrices of keys in @keyboard.
* If the index is not set, -1 will be returned.
*
* Deprecated: 1.0: Use eek_element_get_symbol_index()
*/
void
eek_keyboard_get_symbol_index (EekKeyboard *keyboard,
gint *group,
gint *level)
{
g_return_if_fail (EEK_IS_KEYBOARD(keyboard));
eek_element_get_symbol_index(EEK_ELEMENT(keyboard), group, level);
}
/**
* eek_keyboard_set_group:
* @keyboard: an #EekKeyboard
* @group: group index of @keyboard
*
* Set the group value of the default symbol index of @keyboard. To
* unset, pass -1 as @group.
*
* See also: eek_keyboard_set_symbol_index()
* Deprecated: 1.0: Use eek_element_set_group()
*/
void
eek_keyboard_set_group (EekKeyboard *keyboard,
gint group)
{
eek_element_set_group (EEK_ELEMENT(keyboard), group);
}
/**
* eek_keyboard_set_level:
* @keyboard: an #EekKeyboard
* @level: level index of @keyboard
*
* Set the level value of the default symbol index of @keyboard. To
* unset, pass -1 as @level.
*
* See also: eek_keyboard_set_symbol_index()
* Deprecated: 1.0: Use eek_element_set_level()
*/
void
eek_keyboard_set_level (EekKeyboard *keyboard,
gint level)
{
eek_element_set_level (EEK_ELEMENT(keyboard), level);
}
/**
* eek_keyboard_get_group:
* @keyboard: an #EekKeyboard
*
* Return the group value of the default symbol index of @keyboard.
* If the value is not set, -1 will be returned.
*
* See also: eek_keyboard_get_symbol_index()
* Deprecated: 1.0: Use eek_element_get_group()
*/
gint
eek_keyboard_get_group (EekKeyboard *keyboard)
{
return eek_element_get_group (EEK_ELEMENT(keyboard));
}
/**
* eek_keyboard_get_level:
* @keyboard: an #EekKeyboard
*
* Return the level value of the default symbol index of @keyboard.
* If the value is not set, -1 will be returned.
*
* See also: eek_keyboard_get_symbol_index()
* Deprecated: 1.0: Use eek_element_get_level()
*/
gint
eek_keyboard_get_level (EekKeyboard *keyboard)
{
return eek_element_get_level (EEK_ELEMENT(keyboard));
}
/** /**
* eek_keyboard_create_section: * eek_keyboard_create_section:
* @keyboard: an #EekKeyboard * @keyboard: an #EekKeyboard
@ -650,10 +590,8 @@ eek_keyboard_get_level (EekKeyboard *keyboard)
EekSection * EekSection *
eek_keyboard_create_section (EekKeyboard *keyboard) eek_keyboard_create_section (EekKeyboard *keyboard)
{ {
EekSection *section;
g_return_val_if_fail (EEK_IS_KEYBOARD(keyboard), NULL); g_return_val_if_fail (EEK_IS_KEYBOARD(keyboard), NULL);
section = EEK_KEYBOARD_GET_CLASS(keyboard)->create_section (keyboard); return EEK_KEYBOARD_GET_CLASS(keyboard)->create_section (keyboard);
return section;
} }
/** /**
@ -668,9 +606,9 @@ EekKey *
eek_keyboard_find_key_by_keycode (EekKeyboard *keyboard, eek_keyboard_find_key_by_keycode (EekKeyboard *keyboard,
guint keycode) guint keycode)
{ {
g_assert (EEK_IS_KEYBOARD(keyboard)); g_return_val_if_fail (EEK_IS_KEYBOARD(keyboard), NULL);
return EEK_KEYBOARD_GET_CLASS(keyboard)-> return g_hash_table_lookup (keyboard->priv->keycodes,
find_key_by_keycode (keyboard, keycode); GUINT_TO_POINTER(keycode));
} }
/** /**
@ -683,11 +621,8 @@ eek_keyboard_find_key_by_keycode (EekKeyboard *keyboard,
EekLayout * EekLayout *
eek_keyboard_get_layout (EekKeyboard *keyboard) eek_keyboard_get_layout (EekKeyboard *keyboard)
{ {
EekKeyboardPrivate *priv; g_return_val_if_fail (EEK_IS_KEYBOARD(keyboard), NULL);
return keyboard->priv->layout;
g_assert (EEK_IS_KEYBOARD(keyboard));
priv = EEK_KEYBOARD_GET_PRIVATE(keyboard);
return priv->layout;
} }
/** /**
@ -705,7 +640,6 @@ eek_keyboard_get_size (EekKeyboard *keyboard,
{ {
EekBounds bounds; EekBounds bounds;
g_assert (EEK_IS_KEYBOARD(keyboard));
eek_element_get_bounds (EEK_ELEMENT(keyboard), &bounds); eek_element_get_bounds (EEK_ELEMENT(keyboard), &bounds);
*width = bounds.width; *width = bounds.width;
*height = bounds.height; *height = bounds.height;
@ -722,12 +656,8 @@ void
eek_keyboard_set_modifier_behavior (EekKeyboard *keyboard, eek_keyboard_set_modifier_behavior (EekKeyboard *keyboard,
EekModifierBehavior modifier_behavior) EekModifierBehavior modifier_behavior)
{ {
EekKeyboardPrivate *priv;
g_return_if_fail (EEK_IS_KEYBOARD(keyboard)); g_return_if_fail (EEK_IS_KEYBOARD(keyboard));
priv = EEK_KEYBOARD_GET_PRIVATE(keyboard); keyboard->priv->modifier_behavior = modifier_behavior;
priv->modifier_behavior = modifier_behavior;
} }
/** /**
@ -740,12 +670,17 @@ eek_keyboard_set_modifier_behavior (EekKeyboard *keyboard,
EekModifierBehavior EekModifierBehavior
eek_keyboard_get_modifier_behavior (EekKeyboard *keyboard) eek_keyboard_get_modifier_behavior (EekKeyboard *keyboard)
{ {
EekKeyboardPrivate *priv; g_return_val_if_fail (EEK_IS_KEYBOARD(keyboard), 0);
return keyboard->priv->modifier_behavior;
}
g_assert (EEK_IS_KEYBOARD(keyboard)); void
priv = EEK_KEYBOARD_GET_PRIVATE(keyboard); eek_keyboard_set_modifiers (EekKeyboard *keyboard,
EekModifierType modifiers)
return priv->modifier_behavior; {
g_return_if_fail (EEK_IS_KEYBOARD(keyboard));
keyboard->priv->modifiers = modifiers;
set_level_from_modifiers (keyboard);
} }
/** /**
@ -758,12 +693,8 @@ eek_keyboard_get_modifier_behavior (EekKeyboard *keyboard)
EekModifierType EekModifierType
eek_keyboard_get_modifiers (EekKeyboard *keyboard) eek_keyboard_get_modifiers (EekKeyboard *keyboard)
{ {
EekKeyboardPrivate *priv; g_return_val_if_fail (EEK_IS_KEYBOARD(keyboard), 0);
return keyboard->priv->modifiers;
g_assert (EEK_IS_KEYBOARD(keyboard));
priv = EEK_KEYBOARD_GET_PRIVATE(keyboard);
return priv->modifiers;
} }
/** /**
@ -772,46 +703,56 @@ eek_keyboard_get_modifiers (EekKeyboard *keyboard)
* @outline: an #EekOutline * @outline: an #EekOutline
* *
* Register an outline of @keyboard. * Register an outline of @keyboard.
* Returns: an unsigned long id of the registered outline, for later reference * Returns: an unsigned integer ID of the registered outline, for
* later reference
*/ */
gulong guint
eek_keyboard_add_outline (EekKeyboard *keyboard, eek_keyboard_add_outline (EekKeyboard *keyboard,
EekOutline *outline) EekOutline *outline)
{ {
EekKeyboardPrivate *priv;
EekOutline *_outline; EekOutline *_outline;
g_assert (EEK_IS_KEYBOARD(keyboard)); g_return_val_if_fail (EEK_IS_KEYBOARD(keyboard), 0);
priv = EEK_KEYBOARD_GET_PRIVATE(keyboard);
_outline = eek_outline_copy (outline); _outline = eek_outline_copy (outline);
g_array_append_val (priv->outline_array, *_outline); g_array_append_val (keyboard->priv->outline_array, *_outline);
/* don't use eek_outline_free here, so as to keep _outline->points */ /* don't use eek_outline_free here, so as to keep _outline->points */
g_slice_free (EekOutline, _outline); g_slice_free (EekOutline, _outline);
return priv->outline_array->len; return keyboard->priv->outline_array->len - 1;
} }
/** /**
* eek_keyboard_get_outline: * eek_keyboard_get_outline:
* @keyboard: an #EekKeyboard * @keyboard: an #EekKeyboard
* @oref: an unsigned long id * @oref: ID of the outline
* *
* Get an outline associated with @oref in @keyboard. * Get an outline associated with @oref in @keyboard.
* Returns: an #EekOutline, which should not be released * Returns: an #EekOutline, which should not be released
*/ */
EekOutline * EekOutline *
eek_keyboard_get_outline (EekKeyboard *keyboard, eek_keyboard_get_outline (EekKeyboard *keyboard,
gulong oref) guint oref)
{ {
EekKeyboardPrivate *priv; g_return_val_if_fail (EEK_IS_KEYBOARD(keyboard), NULL);
g_assert (EEK_IS_KEYBOARD(keyboard)); if (oref > keyboard->priv->outline_array->len)
priv = EEK_KEYBOARD_GET_PRIVATE(keyboard);
if (oref > priv->outline_array->len)
return NULL; return NULL;
return &g_array_index (priv->outline_array, EekOutline, oref - 1); return &g_array_index (keyboard->priv->outline_array, EekOutline, oref);
}
/**
* eek_keyboard_get_n_outlines:
* @keyboard: an #EekKeyboard
*
* Get the number of outlines defined in @keyboard.
* Returns: integer
*/
gsize
eek_keyboard_get_n_outlines (EekKeyboard *keyboard)
{
g_return_val_if_fail (EEK_IS_KEYBOARD(keyboard), 0);
return keyboard->priv->outline_array->len;
} }
/** /**
@ -825,12 +766,8 @@ void
eek_keyboard_set_num_lock_mask (EekKeyboard *keyboard, eek_keyboard_set_num_lock_mask (EekKeyboard *keyboard,
EekModifierType num_lock_mask) EekModifierType num_lock_mask)
{ {
EekKeyboardPrivate *priv; g_return_if_fail (EEK_IS_KEYBOARD(keyboard));
keyboard->priv->num_lock_mask = num_lock_mask;
g_assert (EEK_IS_KEYBOARD(keyboard));
priv = EEK_KEYBOARD_GET_PRIVATE(keyboard);
priv->num_lock_mask = num_lock_mask;
} }
/** /**
@ -843,12 +780,8 @@ eek_keyboard_set_num_lock_mask (EekKeyboard *keyboard,
EekModifierType EekModifierType
eek_keyboard_get_num_lock_mask (EekKeyboard *keyboard) eek_keyboard_get_num_lock_mask (EekKeyboard *keyboard)
{ {
EekKeyboardPrivate *priv; g_return_val_if_fail (EEK_IS_KEYBOARD(keyboard), 0);
return keyboard->priv->num_lock_mask;
g_assert (EEK_IS_KEYBOARD(keyboard));
priv = EEK_KEYBOARD_GET_PRIVATE(keyboard);
return priv->num_lock_mask;
} }
/** /**
@ -862,12 +795,8 @@ void
eek_keyboard_set_alt_gr_mask (EekKeyboard *keyboard, eek_keyboard_set_alt_gr_mask (EekKeyboard *keyboard,
EekModifierType alt_gr_mask) EekModifierType alt_gr_mask)
{ {
EekKeyboardPrivate *priv; g_return_if_fail (EEK_IS_KEYBOARD(keyboard));
keyboard->priv->alt_gr_mask = alt_gr_mask;
g_assert (EEK_IS_KEYBOARD(keyboard));
priv = EEK_KEYBOARD_GET_PRIVATE(keyboard);
priv->alt_gr_mask = alt_gr_mask;
} }
/** /**
@ -880,10 +809,36 @@ eek_keyboard_set_alt_gr_mask (EekKeyboard *keyboard,
EekModifierType EekModifierType
eek_keyboard_get_alt_gr_mask (EekKeyboard *keyboard) eek_keyboard_get_alt_gr_mask (EekKeyboard *keyboard)
{ {
EekKeyboardPrivate *priv; g_return_val_if_fail (EEK_IS_KEYBOARD(keyboard), 0);
return keyboard->priv->alt_gr_mask;
g_assert (EEK_IS_KEYBOARD(keyboard)); }
priv = EEK_KEYBOARD_GET_PRIVATE(keyboard);
/**
return priv->alt_gr_mask; * eek_keyboard_get_pressed_keys:
* @keyboard: an #EekKeyboard
*
* Get pressed keys.
* Returns: (transfer container) (element-type EekKey): A list of
* pressed keys.
*/
GList *
eek_keyboard_get_pressed_keys (EekKeyboard *keyboard)
{
g_return_val_if_fail (EEK_IS_KEYBOARD(keyboard), NULL);
return g_list_copy (keyboard->priv->pressed_keys);
}
/**
* eek_keyboard_get_locked_keys:
* @keyboard: an #EekKeyboard
*
* Get locked keys.
* Returns: (transfer container) (element-type EekModifierKey): A list
* of locked keys.
*/
GList *
eek_keyboard_get_locked_keys (EekKeyboard *keyboard)
{
g_return_val_if_fail (EEK_IS_KEYBOARD(keyboard), NULL);
return g_list_copy (keyboard->priv->locked_keys);
} }

View File

@ -63,6 +63,9 @@ struct _EekKeyboard
* keyboard by keycode * keyboard by keycode
* @key_pressed: class handler for #EekKeyboard::key-pressed signal * @key_pressed: class handler for #EekKeyboard::key-pressed signal
* @key_released: class handler for #EekKeyboard::key-released signal * @key_released: class handler for #EekKeyboard::key-released signal
* @key_locked: class handler for #EekKeyboard::key-locked signal
* @key_unlocked: class handler for #EekKeyboard::key-unlocked signal
* @key_cancelled: class handler for #EekKeyboard::key-cancelled signal
*/ */
struct _EekKeyboardClass struct _EekKeyboardClass
{ {
@ -89,10 +92,35 @@ struct _EekKeyboardClass
/* obsolete members moved to EekElement */ /* obsolete members moved to EekElement */
gpointer symbol_index_changed; gpointer symbol_index_changed;
/*< public >*/
/* signals */
void (* key_locked) (EekKeyboard *self,
EekKey *key);
void (* key_unlocked) (EekKeyboard *self,
EekKey *key);
void (* key_cancelled) (EekKeyboard *self,
EekKey *key);
/*< private >*/
/* padding */ /* padding */
gpointer pdummy[24]; gpointer pdummy[21];
}; };
/**
* EekModifierKey:
* @modifiers: an #EekModifierType which @key triggers
* @key: an #EekKey
*
* Entry which associates modifier mask to a key. This is returned by
* eek_keyboard_get_locked_keys().
*/
struct _EekModifierKey {
/*< public >*/
EekModifierType modifiers;
EekKey *key;
};
typedef struct _EekModifierKey EekModifierKey;
GType eek_keyboard_get_type GType eek_keyboard_get_type
(void) G_GNUC_CONST; (void) G_GNUC_CONST;
@ -109,32 +137,15 @@ void eek_keyboard_set_size
(EekKeyboard *keyboard, (EekKeyboard *keyboard,
gdouble width, gdouble width,
gdouble height); gdouble height);
#ifndef EEK_DISABLE_DEPRECATED
void eek_keyboard_set_symbol_index
(EekKeyboard *keyboard,
gint group,
gint level);
void eek_keyboard_get_symbol_index
(EekKeyboard *keyboard,
gint *group,
gint *level);
void eek_keyboard_set_group
(EekKeyboard *keyboard,
gint group);
void eek_keyboard_set_level
(EekKeyboard *keyboard,
gint level);
gint eek_keyboard_get_group
(EekKeyboard *keyboard);
gint eek_keyboard_get_level
(EekKeyboard *keyboard);
#endif /* EEK_DISABLE_DEPRECATED */
void eek_keyboard_set_modifier_behavior void eek_keyboard_set_modifier_behavior
(EekKeyboard *keyboard, (EekKeyboard *keyboard,
EekModifierBehavior modifier_behavior); EekModifierBehavior modifier_behavior);
EekModifierBehavior eek_keyboard_get_modifier_behavior EekModifierBehavior eek_keyboard_get_modifier_behavior
(EekKeyboard *keyboard); (EekKeyboard *keyboard);
void eek_keyboard_set_modifiers
(EekKeyboard *keyboard,
EekModifierType modifiers);
EekModifierType eek_keyboard_get_modifiers EekModifierType eek_keyboard_get_modifiers
(EekKeyboard *keyboard); (EekKeyboard *keyboard);
@ -145,13 +156,15 @@ EekKey *eek_keyboard_find_key_by_keycode
(EekKeyboard *keyboard, (EekKeyboard *keyboard,
guint keycode); guint keycode);
gulong eek_keyboard_add_outline guint eek_keyboard_add_outline
(EekKeyboard *keyboard, (EekKeyboard *keyboard,
EekOutline *outline); EekOutline *outline);
EekOutline *eek_keyboard_get_outline EekOutline *eek_keyboard_get_outline
(EekKeyboard *keyboard, (EekKeyboard *keyboard,
gulong oref); guint oref);
gsize eek_keyboard_get_n_outlines
(EekKeyboard *keyboard);
void eek_keyboard_set_num_lock_mask void eek_keyboard_set_num_lock_mask
(EekKeyboard *keyboard, (EekKeyboard *keyboard,
@ -165,5 +178,15 @@ void eek_keyboard_set_alt_gr_mask
EekModifierType eek_keyboard_get_alt_gr_mask EekModifierType eek_keyboard_get_alt_gr_mask
(EekKeyboard *keyboard); (EekKeyboard *keyboard);
GList *eek_keyboard_get_pressed_keys
(EekKeyboard *keyboard);
GList *eek_keyboard_get_locked_keys
(EekKeyboard *keyboard);
EekModifierKey *eek_modifier_key_copy
(EekModifierKey *modkey);
void eek_modifier_key_free
(EekModifierKey *modkey);
G_END_DECLS G_END_DECLS
#endif /* EEK_KEYBOARD_H */ #endif /* EEK_KEYBOARD_H */

View File

@ -208,10 +208,7 @@ eek_keysym_class_init (EekKeysymClass *klass)
static void static void
eek_keysym_init (EekKeysym *self) eek_keysym_init (EekKeysym *self)
{ {
EekKeysymPrivate *priv; self->priv = EEK_KEYSYM_GET_PRIVATE(self);
priv = self->priv = EEK_KEYSYM_GET_PRIVATE(self);
priv->xkeysym = EEK_INVALID_KEYSYM;
} }
/** /**

View File

@ -47,6 +47,12 @@ G_BEGIN_DECLS
typedef struct _EekKeysymClass EekKeysymClass; typedef struct _EekKeysymClass EekKeysymClass;
typedef struct _EekKeysymPrivate EekKeysymPrivate; typedef struct _EekKeysymPrivate EekKeysymPrivate;
/**
* EekKeysym:
*
* The #EekKeysym structure contains only private data and should only
* be accessed using the provided API.
*/
struct _EekKeysym { struct _EekKeysym {
/*< private >*/ /*< private >*/
EekSymbol parent; EekSymbol parent;
@ -65,7 +71,7 @@ guint eek_keysym_get_xkeysym (EekKeysym *keysym);
EekKeysym *eek_keysym_new_from_name (const gchar *name); EekKeysym *eek_keysym_new_from_name (const gchar *name);
EekKeysym *eek_keysym_new_with_modifier (guint xkeysym, EekKeysym *eek_keysym_new_with_modifier (guint xkeysym,
EekModifierType modifier); EekModifierType modifier_mask);
G_END_DECLS G_END_DECLS

View File

@ -23,6 +23,7 @@
#endif /* HAVE_CONFIG_H */ #endif /* HAVE_CONFIG_H */
#include <math.h> #include <math.h>
#include <string.h>
#include "eek-key.h" #include "eek-key.h"
#include "eek-section.h" #include "eek-section.h"
@ -87,7 +88,8 @@ static void eek_renderer_real_render_key_label (EekRenderer *self,
static void invalidate (EekRenderer *renderer); static void invalidate (EekRenderer *renderer);
static void render_key (EekRenderer *self, static void render_key (EekRenderer *self,
cairo_t *cr, cairo_t *cr,
EekKey *key); EekKey *key,
gboolean active);
static void on_symbol_index_changed (EekKeyboard *keyboard, static void on_symbol_index_changed (EekKeyboard *keyboard,
gint group, gint group,
gint level, gint level,
@ -117,7 +119,7 @@ create_keyboard_surface_key_callback (EekElement *element,
bounds.width * priv->scale, bounds.width * priv->scale,
bounds.height * priv->scale); bounds.height * priv->scale);
cairo_clip (data->cr); cairo_clip (data->cr);
render_key (data->renderer, data->cr, EEK_KEY(element)); render_key (data->renderer, data->cr, EEK_KEY(element), FALSE);
cairo_restore (data->cr); cairo_restore (data->cr);
} }
@ -197,14 +199,15 @@ create_keyboard_surface (EekRenderer *renderer)
static void static void
render_key_outline (EekRenderer *renderer, render_key_outline (EekRenderer *renderer,
cairo_t *cr, cairo_t *cr,
EekKey *key) EekKey *key,
gboolean active)
{ {
EekRendererPrivate *priv = EEK_RENDERER_GET_PRIVATE(renderer); EekRendererPrivate *priv = EEK_RENDERER_GET_PRIVATE(renderer);
EekOutline *outline; EekOutline *outline;
EekBounds bounds; EekBounds bounds;
gdouble scale; gdouble scale;
gint i; gint i;
gulong oref; guint oref;
EekThemeNode *theme_node; EekThemeNode *theme_node;
EekColor foreground, background, gradient_start, gradient_end, border_color; EekColor foreground, background, gradient_start, gradient_end, border_color;
EekGradientType gradient_type; EekGradientType gradient_type;
@ -212,13 +215,14 @@ render_key_outline (EekRenderer *renderer,
gint border_radius; gint border_radius;
oref = eek_key_get_oref (key); oref = eek_key_get_oref (key);
if (oref == 0) outline = eek_keyboard_get_outline (priv->keyboard, oref);
if (outline == NULL)
return; return;
if (eek_key_is_pressed (key)) theme_node = g_object_get_data (G_OBJECT(key),
theme_node = g_object_get_data (G_OBJECT(key), "theme-node-pressed"); active ?
else "theme-node-pressed" :
theme_node = g_object_get_data (G_OBJECT(key), "theme-node"); "theme-node");
if (theme_node) { if (theme_node) {
eek_theme_node_get_foreground_color (theme_node, &foreground); eek_theme_node_get_foreground_color (theme_node, &foreground);
eek_theme_node_get_background_color (theme_node, &background); eek_theme_node_get_background_color (theme_node, &background);
@ -247,10 +251,9 @@ render_key_outline (EekRenderer *renderer,
/* need to rescale so that the border fit inside the clipping /* need to rescale so that the border fit inside the clipping
region */ region */
eek_element_get_bounds (EEK_ELEMENT(key), &bounds); eek_element_get_bounds (EEK_ELEMENT(key), &bounds);
scale = MIN((bounds.width - border_width) / bounds.width, scale = MIN((bounds.width - border_width * 2) / bounds.width,
(bounds.height - border_width) / bounds.height); (bounds.height - border_width * 2) / bounds.height);
outline = eek_keyboard_get_outline (priv->keyboard, oref);
outline = eek_outline_copy (outline); outline = eek_outline_copy (outline);
for (i = 0; i < outline->num_points; i++) { for (i = 0; i < outline->num_points; i++) {
outline->points[i].x *= priv->scale * scale; outline->points[i].x *= priv->scale * scale;
@ -258,8 +261,8 @@ render_key_outline (EekRenderer *renderer,
} }
cairo_translate (cr, cairo_translate (cr,
border_width / 2 * priv->scale, border_width * priv->scale * scale,
border_width / 2 * priv->scale); border_width * priv->scale * scale);
if (gradient_type != EEK_GRADIENT_NONE) { if (gradient_type != EEK_GRADIENT_NONE) {
cairo_pattern_t *pat; cairo_pattern_t *pat;
@ -428,42 +431,54 @@ calculate_font_size (EekRenderer *renderer,
static void static void
render_key (EekRenderer *self, render_key (EekRenderer *self,
cairo_t *cr, cairo_t *cr,
EekKey *key) EekKey *key,
gboolean active)
{ {
EekRendererPrivate *priv = EEK_RENDERER_GET_PRIVATE(self); EekRendererPrivate *priv = EEK_RENDERER_GET_PRIVATE(self);
EekOutline *outline; EekOutline *outline;
cairo_surface_t *outline_surface; cairo_surface_t *outline_surface;
EekBounds bounds; EekBounds bounds;
gulong oref; guint oref;
EekSymbol *symbol; EekSymbol *symbol;
GHashTable *outline_surface_cache; GHashTable *outline_surface_cache;
PangoLayout *layout;
PangoRectangle extents = { 0, };
EekColor foreground;
eek_element_get_bounds (EEK_ELEMENT(key), &bounds);
oref = eek_key_get_oref (key); oref = eek_key_get_oref (key);
if (oref == 0) outline = eek_keyboard_get_outline (priv->keyboard, oref);
if (outline == NULL)
return; return;
if (eek_key_is_pressed (key)) /* render outline */
eek_element_get_bounds (EEK_ELEMENT(key), &bounds);
bounds.width *= priv->scale;
bounds.height *= priv->scale;
if (active)
outline_surface_cache = priv->active_outline_surface_cache; outline_surface_cache = priv->active_outline_surface_cache;
else else
outline_surface_cache = priv->outline_surface_cache; outline_surface_cache = priv->outline_surface_cache;
outline = eek_keyboard_get_outline (priv->keyboard, oref);
outline_surface = g_hash_table_lookup (outline_surface_cache, outline); outline_surface = g_hash_table_lookup (outline_surface_cache, outline);
if (!outline_surface) { if (!outline_surface) {
cairo_t *cr; cairo_t *cr;
outline_surface = outline_surface =
cairo_image_surface_create (CAIRO_FORMAT_ARGB32, cairo_image_surface_create (CAIRO_FORMAT_ARGB32,
bounds.width * priv->scale, bounds.width,
bounds.height * priv->scale); bounds.height);
cr = cairo_create (outline_surface); cr = cairo_create (outline_surface);
/* blank background */ /* blank background */
cairo_set_source_rgba (cr, 0.0, 0.0, 0.0, 0.0); cairo_set_source_rgba (cr, 0.0, 0.0, 0.0, 0.0);
cairo_paint (cr); cairo_paint (cr);
eek_renderer_render_key_outline (self, cr, key, 1.0, 0); cairo_save (cr);
eek_renderer_apply_transformation_for_key (self, cr, key, 1.0, FALSE);
render_key_outline (self, cr, key, active);
cairo_restore (cr);
cairo_destroy (cr); cairo_destroy (cr);
g_hash_table_insert (outline_surface_cache, g_hash_table_insert (outline_surface_cache,
@ -474,15 +489,50 @@ render_key (EekRenderer *self,
cairo_set_source_surface (cr, outline_surface, 0.0, 0.0); cairo_set_source_surface (cr, outline_surface, 0.0, 0.0);
cairo_paint (cr); cairo_paint (cr);
/* render icon (if any) */
symbol = eek_key_get_symbol_with_fallback (key, 0, 0); symbol = eek_key_get_symbol_with_fallback (key, 0, 0);
if (EEK_RENDERER_GET_CLASS(self)->render_key_icon && if (!symbol)
symbol && eek_symbol_get_icon_name (symbol)) { return;
eek_renderer_render_key_icon (self, cr, key, 1.0, 0);
} else {
PangoLayout *layout;
PangoRectangle extents = { 0, };
EekColor foreground;
if (eek_symbol_get_icon_name (symbol)) {
cairo_surface_t *icon_surface =
eek_renderer_get_icon_surface (self,
eek_symbol_get_icon_name (symbol),
MIN(bounds.width, bounds.height) * 0.7);
if (icon_surface) {
gint width = cairo_image_surface_get_width (icon_surface);
gint height = cairo_image_surface_get_height (icon_surface);
gdouble scale;
if (width < bounds.width && height < bounds.height)
scale = 1;
else {
if (height * bounds.width / width <= bounds.height)
scale = bounds.width / width;
else if (width * bounds.height / height <= bounds.width)
scale = bounds.height / height;
else {
if (width * bounds.height < height * bounds.width)
scale = width / bounds.width;
else
scale = height / bounds.height;
}
}
cairo_save (cr);
cairo_translate (cr,
(bounds.width - width * scale) / 2,
(bounds.height - height * scale) / 2);
cairo_rectangle (cr, 0, 0, width, height);
cairo_clip (cr);
cairo_set_source_surface (cr, icon_surface, 0.0, 0.0);
cairo_paint (cr);
cairo_restore (cr);
return;
}
}
/* render label */
layout = pango_cairo_create_layout (cr); layout = pango_cairo_create_layout (cr);
eek_renderer_render_key_label (self, layout, key); eek_renderer_render_key_label (self, layout, key);
pango_layout_get_extents (layout, NULL, &extents); pango_layout_get_extents (layout, NULL, &extents);
@ -490,8 +540,8 @@ render_key (EekRenderer *self,
cairo_save (cr); cairo_save (cr);
cairo_move_to cairo_move_to
(cr, (cr,
(bounds.width * priv->scale - extents.width / PANGO_SCALE) / 2, (bounds.width - extents.width / PANGO_SCALE) / 2,
(bounds.height * priv->scale - extents.height / PANGO_SCALE) / 2); (bounds.height - extents.height / PANGO_SCALE) / 2);
eek_renderer_get_foreground_color (self, EEK_ELEMENT(key), &foreground); eek_renderer_get_foreground_color (self, EEK_ELEMENT(key), &foreground);
cairo_set_source_rgba (cr, cairo_set_source_rgba (cr,
@ -504,7 +554,6 @@ render_key (EekRenderer *self,
cairo_restore (cr); cairo_restore (cr);
g_object_unref (layout); g_object_unref (layout);
} }
}
void void
eek_renderer_apply_transformation_for_key (EekRenderer *self, eek_renderer_apply_transformation_for_key (EekRenderer *self,
@ -564,6 +613,7 @@ eek_renderer_real_render_key_label (EekRenderer *self,
EekBounds bounds; EekBounds bounds;
const TextProperty *prop; const TextProperty *prop;
PangoFontDescription *font; PangoFontDescription *font;
PangoLayoutLine *line;
gdouble scale; gdouble scale;
symbol = eek_key_get_symbol_with_fallback (key, 0, 0); symbol = eek_key_get_symbol_with_fallback (key, 0, 0);
@ -610,6 +660,9 @@ eek_renderer_real_render_key_label (EekRenderer *self,
pango_font_description_free (font); pango_font_description_free (font);
pango_layout_set_text (layout, label, -1); pango_layout_set_text (layout, label, -1);
line = pango_layout_get_line (layout, 0);
if (line->resolved_dir == PANGO_DIRECTION_RTL)
pango_layout_set_alignment (layout, PANGO_ALIGN_RIGHT);
pango_layout_set_width (layout, pango_layout_set_width (layout,
PANGO_SCALE * bounds.width * priv->scale * scale); PANGO_SCALE * bounds.width * priv->scale * scale);
if (prop->ellipses) if (prop->ellipses)
@ -625,7 +678,7 @@ eek_renderer_real_render_key_outline (EekRenderer *self,
{ {
cairo_save (cr); cairo_save (cr);
eek_renderer_apply_transformation_for_key (self, cr, key, scale, rotate); eek_renderer_apply_transformation_for_key (self, cr, key, scale, rotate);
render_key_outline (self, cr, key); render_key_outline (self, cr, key, eek_key_is_pressed (key) || eek_key_is_locked (key));
cairo_restore (cr); cairo_restore (cr);
} }
@ -638,7 +691,7 @@ eek_renderer_real_render_key (EekRenderer *self,
{ {
cairo_save (cr); cairo_save (cr);
eek_renderer_apply_transformation_for_key (self, cr, key, scale, rotate); eek_renderer_apply_transformation_for_key (self, cr, key, scale, rotate);
render_key (self, cr, key); render_key (self, cr, key, eek_key_is_pressed (key) || eek_key_is_locked (key));
cairo_restore (cr); cairo_restore (cr);
} }
@ -685,9 +738,7 @@ eek_renderer_set_property (GObject *object,
g_object_ref (priv->pcontext); g_object_ref (priv->pcontext);
break; break;
default: default:
g_object_set_property (object, G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
g_param_spec_get_name (pspec),
value);
break; break;
} }
} }
@ -705,9 +756,7 @@ eek_renderer_get_property (GObject *object,
g_value_set_object (value, priv->keyboard); g_value_set_object (value, priv->keyboard);
break; break;
default: default:
g_object_get_property (object, G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
g_param_spec_get_name (pspec),
value);
break; break;
} }
} }
@ -817,17 +866,15 @@ eek_renderer_init (EekRenderer *self)
static void static void
invalidate (EekRenderer *renderer) invalidate (EekRenderer *renderer)
{ {
EekRendererPrivate *priv = EEK_RENDERER_GET_PRIVATE(renderer); if (renderer->priv->outline_surface_cache)
g_hash_table_remove_all (renderer->priv->outline_surface_cache);
if (priv->outline_surface_cache) if (renderer->priv->active_outline_surface_cache)
g_hash_table_remove_all (priv->outline_surface_cache); g_hash_table_remove_all (renderer->priv->active_outline_surface_cache);
if (priv->active_outline_surface_cache) if (renderer->priv->keyboard_surface) {
g_hash_table_remove_all (priv->active_outline_surface_cache); cairo_surface_destroy (renderer->priv->keyboard_surface);
renderer->priv->keyboard_surface = NULL;
if (priv->keyboard_surface) {
cairo_surface_destroy (priv->keyboard_surface);
priv->keyboard_surface = NULL;
} }
} }
@ -845,14 +892,10 @@ EekRenderer *
eek_renderer_new (EekKeyboard *keyboard, eek_renderer_new (EekKeyboard *keyboard,
PangoContext *pcontext) PangoContext *pcontext)
{ {
EekRenderer *renderer; return g_object_new (EEK_TYPE_RENDERER,
renderer = g_object_new (EEK_TYPE_RENDERER,
"keyboard", keyboard, "keyboard", keyboard,
"pango-context", pcontext, "pango-context", pcontext,
NULL); NULL);
return renderer;
} }
void void
@ -860,24 +903,30 @@ eek_renderer_set_allocation_size (EekRenderer *renderer,
gdouble width, gdouble width,
gdouble height) gdouble height)
{ {
EekRendererPrivate *priv;
EekBounds bounds; EekBounds bounds;
gdouble scale; gdouble scale;
g_return_if_fail (EEK_IS_RENDERER(renderer)); g_return_if_fail (EEK_IS_RENDERER(renderer));
g_return_if_fail (width > 0.0 && height > 0.0); g_return_if_fail (width > 0.0 && height > 0.0);
priv = EEK_RENDERER_GET_PRIVATE(renderer); renderer->priv->allocation_width = width;
renderer->priv->allocation_height = height;
priv->allocation_width = width; eek_element_get_bounds (EEK_ELEMENT(renderer->priv->keyboard), &bounds);
priv->allocation_height = height;
eek_element_get_bounds (EEK_ELEMENT(priv->keyboard), &bounds); if (bounds.height * width / bounds.width <= height)
scale = width > height ? height / bounds.height : scale = width / bounds.width;
width / bounds.width; else if (bounds.width * height / bounds.height <= width)
scale = height / bounds.height;
else {
if (bounds.width * height < bounds.height * width)
scale = bounds.width / width;
else
scale = bounds.height / height;
}
if (scale != priv->scale) { if (scale != renderer->priv->scale) {
priv->scale = scale; renderer->priv->scale = scale;
invalidate (renderer); invalidate (renderer);
} }
} }
@ -887,18 +936,15 @@ eek_renderer_get_size (EekRenderer *renderer,
gdouble *width, gdouble *width,
gdouble *height) gdouble *height)
{ {
EekRendererPrivate *priv;
EekBounds bounds; EekBounds bounds;
g_return_if_fail (EEK_IS_RENDERER(renderer)); g_return_if_fail (EEK_IS_RENDERER(renderer));
priv = EEK_RENDERER_GET_PRIVATE(renderer); eek_element_get_bounds (EEK_ELEMENT(renderer->priv->keyboard), &bounds);
eek_element_get_bounds (EEK_ELEMENT(priv->keyboard), &bounds);
if (width) if (width)
*width = bounds.width * priv->scale; *width = bounds.width * renderer->priv->scale;
if (height) if (height)
*height = bounds.height * priv->scale; *height = bounds.height * renderer->priv->scale;
} }
void void
@ -907,7 +953,6 @@ eek_renderer_get_key_bounds (EekRenderer *renderer,
EekBounds *bounds, EekBounds *bounds,
gboolean rotate) gboolean rotate)
{ {
EekRendererPrivate *priv;
EekElement *section; EekElement *section;
EekBounds section_bounds, keyboard_bounds; EekBounds section_bounds, keyboard_bounds;
gint angle = 0; gint angle = 0;
@ -918,21 +963,20 @@ eek_renderer_get_key_bounds (EekRenderer *renderer,
g_return_if_fail (EEK_IS_KEY(key)); g_return_if_fail (EEK_IS_KEY(key));
g_return_if_fail (bounds != NULL); g_return_if_fail (bounds != NULL);
priv = EEK_RENDERER_GET_PRIVATE(renderer);
section = eek_element_get_parent (EEK_ELEMENT(key)); section = eek_element_get_parent (EEK_ELEMENT(key));
eek_element_get_bounds (EEK_ELEMENT(key), bounds); eek_element_get_bounds (EEK_ELEMENT(key), bounds);
eek_element_get_bounds (section, &section_bounds); eek_element_get_bounds (section, &section_bounds);
eek_element_get_bounds (EEK_ELEMENT(priv->keyboard), &keyboard_bounds); eek_element_get_bounds (EEK_ELEMENT(renderer->priv->keyboard),
&keyboard_bounds);
if (!rotate) { if (!rotate) {
bounds->x += keyboard_bounds.x + section_bounds.x; bounds->x += keyboard_bounds.x + section_bounds.x;
bounds->y += keyboard_bounds.y + section_bounds.y; bounds->y += keyboard_bounds.y + section_bounds.y;
bounds->x *= priv->scale; bounds->x *= renderer->priv->scale;
bounds->y *= priv->scale; bounds->y *= renderer->priv->scale;
bounds->width *= priv->scale; bounds->width *= renderer->priv->scale;
bounds->height *= priv->scale; bounds->height *= renderer->priv->scale;
return; return;
} }
points[0].x = bounds->x; points[0].x = bounds->x;
@ -964,34 +1008,24 @@ eek_renderer_get_key_bounds (EekRenderer *renderer,
bounds->y = keyboard_bounds.y + section_bounds.y + min.y; bounds->y = keyboard_bounds.y + section_bounds.y + min.y;
bounds->width = (max.x - min.x); bounds->width = (max.x - min.x);
bounds->height = (max.y - min.y); bounds->height = (max.y - min.y);
bounds->x *= priv->scale; bounds->x *= renderer->priv->scale;
bounds->y *= priv->scale; bounds->y *= renderer->priv->scale;
bounds->width *= priv->scale; bounds->width *= renderer->priv->scale;
bounds->height *= priv->scale; bounds->height *= renderer->priv->scale;
} }
gdouble gdouble
eek_renderer_get_scale (EekRenderer *renderer) eek_renderer_get_scale (EekRenderer *renderer)
{ {
EekRendererPrivate *priv; g_return_val_if_fail (EEK_IS_RENDERER(renderer), 0);
return renderer->priv->scale;
g_assert (EEK_IS_RENDERER(renderer));
priv = EEK_RENDERER_GET_PRIVATE(renderer);
return priv->scale;
} }
PangoLayout * PangoLayout *
eek_renderer_create_pango_layout (EekRenderer *renderer) eek_renderer_create_pango_layout (EekRenderer *renderer)
{ {
EekRendererPrivate *priv; g_return_val_if_fail (EEK_IS_RENDERER(renderer), NULL);
return pango_layout_new (renderer->priv->pcontext);
g_assert (EEK_IS_RENDERER(renderer));
priv = EEK_RENDERER_GET_PRIVATE(renderer);
return pango_layout_new (priv->pcontext);
} }
void void
@ -1024,22 +1058,19 @@ eek_renderer_render_key_outline (EekRenderer *renderer,
rotate); rotate);
} }
void cairo_surface_t *
eek_renderer_render_key_icon (EekRenderer *renderer, eek_renderer_get_icon_surface (EekRenderer *renderer,
cairo_t *cr, const gchar *icon_name,
EekKey *key, gint size)
gdouble scale,
gboolean rotate)
{ {
g_return_if_fail (EEK_IS_RENDERER(renderer)); EekRendererClass *klass;
g_return_if_fail (EEK_IS_KEY(key));
g_return_if_fail (scale >= 0.0);
EEK_RENDERER_GET_CLASS(renderer)->render_key_icon (renderer, g_return_val_if_fail (EEK_IS_RENDERER(renderer), NULL);
cr,
key, klass = EEK_RENDERER_GET_CLASS(renderer);
scale, if (klass->get_icon_surface)
rotate); return klass->get_icon_surface (renderer, icon_name, size);
return NULL;
} }
void void
@ -1069,26 +1100,20 @@ void
eek_renderer_set_default_foreground_color (EekRenderer *renderer, eek_renderer_set_default_foreground_color (EekRenderer *renderer,
const EekColor *color) const EekColor *color)
{ {
EekRendererPrivate *priv;
g_return_if_fail (EEK_IS_RENDERER(renderer)); g_return_if_fail (EEK_IS_RENDERER(renderer));
g_return_if_fail (color); g_return_if_fail (color);
priv = EEK_RENDERER_GET_PRIVATE(renderer); memcpy (&renderer->priv->default_foreground_color, color, sizeof(EekColor));
priv->default_foreground_color = *color;
} }
void void
eek_renderer_set_default_background_color (EekRenderer *renderer, eek_renderer_set_default_background_color (EekRenderer *renderer,
const EekColor *color) const EekColor *color)
{ {
EekRendererPrivate *priv;
g_return_if_fail (EEK_IS_RENDERER(renderer)); g_return_if_fail (EEK_IS_RENDERER(renderer));
g_return_if_fail (color); g_return_if_fail (color);
priv = EEK_RENDERER_GET_PRIVATE(renderer); memcpy (&renderer->priv->default_background_color, color, sizeof(EekColor));
priv->default_background_color = *color;
} }
void void
@ -1096,19 +1121,17 @@ eek_renderer_get_foreground_color (EekRenderer *renderer,
EekElement *element, EekElement *element,
EekColor *color) EekColor *color)
{ {
EekRendererPrivate *priv;
EekThemeNode *theme_node; EekThemeNode *theme_node;
g_return_if_fail (EEK_IS_RENDERER(renderer)); g_return_if_fail (EEK_IS_RENDERER(renderer));
g_return_if_fail (color); g_return_if_fail (color);
priv = EEK_RENDERER_GET_PRIVATE(renderer);
theme_node = g_object_get_data (G_OBJECT(element), "theme-node"); theme_node = g_object_get_data (G_OBJECT(element), "theme-node");
if (theme_node) if (theme_node)
eek_theme_node_get_foreground_color (theme_node, color); eek_theme_node_get_foreground_color (theme_node, color);
else else
*color = priv->default_foreground_color; memcpy (color, &renderer->priv->default_foreground_color,
sizeof(EekColor));
} }
void void
@ -1116,19 +1139,17 @@ eek_renderer_get_background_color (EekRenderer *renderer,
EekElement *element, EekElement *element,
EekColor *color) EekColor *color)
{ {
EekRendererPrivate *priv;
EekThemeNode *theme_node; EekThemeNode *theme_node;
g_return_if_fail (EEK_IS_RENDERER(renderer)); g_return_if_fail (EEK_IS_RENDERER(renderer));
g_return_if_fail (color); g_return_if_fail (color);
priv = EEK_RENDERER_GET_PRIVATE(renderer);
theme_node = g_object_get_data (G_OBJECT(element), "theme-node"); theme_node = g_object_get_data (G_OBJECT(element), "theme-node");
if (theme_node) if (theme_node)
eek_theme_node_get_background_color (theme_node, color); eek_theme_node_get_background_color (theme_node, color);
else else
*color = priv->default_background_color; memcpy (color, &renderer->priv->default_background_color,
sizeof(EekColor));
} }
void void
@ -1175,13 +1196,10 @@ find_key_by_position_key_callback (EekElement *element,
{ {
FindKeyByPositionCallbackData *data = user_data; FindKeyByPositionCallbackData *data = user_data;
EekBounds bounds; EekBounds bounds;
EekRendererPrivate *priv;
EekPoint points[4]; EekPoint points[4];
gint i; gint i;
gboolean b1, b2, b3; gboolean b1, b2, b3;
priv = EEK_RENDERER_GET_PRIVATE(data->renderer);
eek_element_get_bounds (element, &bounds); eek_element_get_bounds (element, &bounds);
points[0].x = bounds.x; points[0].x = bounds.x;
@ -1197,8 +1215,8 @@ find_key_by_position_key_callback (EekElement *element,
eek_point_rotate (&points[i], data->angle); eek_point_rotate (&points[i], data->angle);
points[i].x += data->origin.x; points[i].x += data->origin.x;
points[i].y += data->origin.y; points[i].y += data->origin.y;
points[i].x *= priv->scale; points[i].x *= data->renderer->priv->scale;
points[i].y *= priv->scale; points[i].y *= data->renderer->priv->scale;
} }
b1 = sign (&data->point, &points[0], &points[1]) < 0.0; b1 = sign (&data->point, &points[0], &points[1]) < 0.0;
@ -1248,19 +1266,17 @@ eek_renderer_find_key_by_position (EekRenderer *renderer,
gdouble x, gdouble x,
gdouble y) gdouble y)
{ {
EekRendererPrivate *priv;
EekBounds bounds; EekBounds bounds;
FindKeyByPositionCallbackData data; FindKeyByPositionCallbackData data;
g_assert (EEK_IS_RENDERER(renderer)); g_return_val_if_fail (EEK_IS_RENDERER(renderer), NULL);
priv = EEK_RENDERER_GET_PRIVATE(renderer); eek_element_get_bounds (EEK_ELEMENT(renderer->priv->keyboard), &bounds);
eek_element_get_bounds (EEK_ELEMENT(priv->keyboard), &bounds);
if (x < bounds.x * priv->scale || if (x < bounds.x * renderer->priv->scale ||
y < bounds.y * priv->scale || y < bounds.y * renderer->priv->scale ||
x > bounds.width * priv->scale || x > bounds.width * renderer->priv->scale ||
y > bounds.height * priv->scale) y > bounds.height * renderer->priv->scale)
return NULL; return NULL;
data.point.x = x; data.point.x = x;
@ -1270,7 +1286,7 @@ eek_renderer_find_key_by_position (EekRenderer *renderer,
data.key = NULL; data.key = NULL;
data.renderer = renderer; data.renderer = renderer;
eek_container_find (EEK_CONTAINER(priv->keyboard), eek_container_find (EEK_CONTAINER(renderer->priv->keyboard),
find_key_by_position_section_callback, find_key_by_position_section_callback,
&data); &data);
return data.key; return data.key;
@ -1288,14 +1304,11 @@ create_theme_node_key_callback (EekElement *element,
gpointer user_data) gpointer user_data)
{ {
CreateThemeNodeData *data = user_data; CreateThemeNodeData *data = user_data;
EekRendererPrivate *priv;
EekThemeNode *theme_node; EekThemeNode *theme_node;
priv = EEK_RENDERER_GET_PRIVATE(data->renderer);
theme_node = eek_theme_node_new (data->context, theme_node = eek_theme_node_new (data->context,
data->parent, data->parent,
priv->theme, data->renderer->priv->theme,
EEK_TYPE_KEY, EEK_TYPE_KEY,
eek_element_get_name (element), eek_element_get_name (element),
"key", "key",
@ -1308,7 +1321,7 @@ create_theme_node_key_callback (EekElement *element,
theme_node = eek_theme_node_new (data->context, theme_node = eek_theme_node_new (data->context,
data->parent, data->parent,
priv->theme, data->renderer->priv->theme,
EEK_TYPE_KEY, EEK_TYPE_KEY,
eek_element_get_name (element), eek_element_get_name (element),
"key", "key",
@ -1325,14 +1338,11 @@ create_theme_node_section_callback (EekElement *element,
gpointer user_data) gpointer user_data)
{ {
CreateThemeNodeData *data = user_data; CreateThemeNodeData *data = user_data;
EekRendererPrivate *priv;
EekThemeNode *theme_node, *parent; EekThemeNode *theme_node, *parent;
priv = EEK_RENDERER_GET_PRIVATE(data->renderer);
theme_node = eek_theme_node_new (data->context, theme_node = eek_theme_node_new (data->context,
data->parent, data->parent,
priv->theme, data->renderer->priv->theme,
EEK_TYPE_SECTION, EEK_TYPE_SECTION,
eek_element_get_name (element), eek_element_get_name (element),
"section", "section",
@ -1355,31 +1365,28 @@ void
eek_renderer_set_theme (EekRenderer *renderer, eek_renderer_set_theme (EekRenderer *renderer,
EekTheme *theme) EekTheme *theme)
{ {
EekRendererPrivate *priv;
EekThemeContext *theme_context; EekThemeContext *theme_context;
EekThemeNode *theme_node; EekThemeNode *theme_node;
CreateThemeNodeData data; CreateThemeNodeData data;
g_assert (EEK_IS_RENDERER(renderer)); g_return_if_fail (EEK_IS_RENDERER(renderer));
g_assert (EEK_IS_THEME(theme)); g_return_if_fail (EEK_IS_THEME(theme));
g_return_if_fail (renderer->priv->keyboard);
priv = EEK_RENDERER_GET_PRIVATE(renderer); if (renderer->priv->theme)
g_assert (priv->keyboard); g_object_unref (renderer->priv->theme);
renderer->priv->theme = g_object_ref (theme);
if (priv->theme)
g_object_unref (priv->theme);
priv->theme = g_object_ref (theme);
theme_context = eek_theme_context_new (); theme_context = eek_theme_context_new ();
theme_node = eek_theme_node_new (theme_context, theme_node = eek_theme_node_new (theme_context,
NULL, NULL,
priv->theme, renderer->priv->theme,
EEK_TYPE_KEYBOARD, EEK_TYPE_KEYBOARD,
"keyboard", "keyboard",
"keyboard", "keyboard",
NULL, NULL,
NULL); NULL);
g_object_set_data_full (G_OBJECT(priv->keyboard), g_object_set_data_full (G_OBJECT(renderer->priv->keyboard),
"theme-node", "theme-node",
theme_node, theme_node,
(GDestroyNotify)g_object_unref); (GDestroyNotify)g_object_unref);
@ -1387,7 +1394,7 @@ eek_renderer_set_theme (EekRenderer *renderer,
data.context = theme_context; data.context = theme_context;
data.parent = theme_node; data.parent = theme_node;
data.renderer = renderer; data.renderer = renderer;
eek_container_foreach_child (EEK_CONTAINER(priv->keyboard), eek_container_foreach_child (EEK_CONTAINER(renderer->priv->keyboard),
create_theme_node_section_callback, create_theme_node_section_callback,
&data); &data);
} }

Some files were not shown because too many files have changed in this diff Show More