Compare commits

...

68 Commits

Author SHA1 Message Date
20c1f8cbe3 Update to 1.0.1. 2011-08-15 12:50:02 +09:00
f2ee3b4966 Add auto-hide-delay option.
Also fixes GSettings unref in client-main.c.
2011-08-15 12:17:07 +09:00
57a072746e Release dragged key when unmap. 2011-08-15 12:16:44 +09:00
497f21a5bd Remove unused local var. 2011-08-12 16:44:05 +09:00
099c242ad7 Update to 1.0.0. 2011-08-12 16:41:44 +09:00
109eff420c Check "start-fullscreen" GSettings key. 2011-08-12 16:40:45 +09:00
0896096a70 Fix --enable-* configure options. 2011-08-12 16:40:20 +09:00
2d2aea009e Rewrite 15c0a9da using cairo_pattern_set_extend. 2011-08-12 16:25:56 +09:00
0425b4e094 Make sure that IBusBus is connected when setting up DBus message filter. 2011-08-12 15:01:14 +09:00
15c0a9dadf Blank background around a large key when key release. 2011-08-12 15:00:46 +09:00
e09c563cd8 Don't close gdk default display. 2011-06-15 18:08:51 +09:00
218a4a50f6 Make sure to own IBusBus reference in client. 2011-06-15 18:03:40 +09:00
9ab228e8f0 Simplify XKB keycode replace logic. 2011-06-15 17:10:14 +09:00
b30db118f2 Use XkbGetMap instead of XkbGetKeyboard in client. 2011-06-15 15:50:06 +09:00
cccb4f45cd Fix modifier handling when sending keycode with XTest. 2011-06-15 12:53:11 +09:00
54c9d6e35d Use XkbChangeMap to reduce traffic between X server. 2011-06-15 12:26:57 +09:00
da7d11e387 Follow monitors-changed event. 2011-06-14 12:39:46 +09:00
d9073183a7 Borrow XKB keyboard mapping change logic from Caribou. 2011-06-14 12:29:54 +09:00
78480f7577 Make X dock support optional. 2011-06-14 07:14:45 +09:00
1dbf0d70da Add IBus to optional dependencies. 2011-06-14 04:54:41 +09:00
44ee2a9913 Simplify the last commit. 2011-06-14 04:54:28 +09:00
a3a5a51f74 Make the window as dock when fullscreen mode. 2011-06-14 04:23:42 +09:00
1ae4426ec8 Make sure XTest extension is available. 2011-06-13 18:52:06 +09:00
270760bd16 Fix configure output. 2011-06-13 18:37:51 +09:00
5bb20e44fb Place keyboard at the center of screen if fullscreen mode is enabled. 2011-06-13 18:29:06 +09:00
26a2ab725e Move focus-listener setting to dconf from command line option. 2011-06-13 18:28:32 +09:00
9d73b89a4e Use libXtst directly instead of via libfakekey. 2011-06-13 15:26:59 +09:00
606f335496 Unify focus listener configure options. 2011-06-13 14:54:10 +09:00
fe9a02e514 Keep a reference to GSettings handle until server-context is disposed. 2011-06-10 16:57:06 +09:00
f76a835e33 Implement IBus based activation. 2011-06-10 11:43:03 +09:00
e199add701 Don't check clutter-gtk if clutter is disabled. 2011-06-10 11:23:40 +09:00
a744096dd7 Fix URL in *.pc.in. 2011-05-27 17:37:25 +09:00
51a18849c0 Fix clutter-gtk check. 2011-04-28 17:27:59 +09:00
bd303ef10b Add guard to prevent eekboard/eekboard-*.h from being included directly. 2011-04-28 16:47:35 +09:00
1e9ec77b65 Add Vala language binding of libeekboard. 2011-04-28 14:57:56 +09:00
4b409de5ba Add guard to prevent individual headers from being included directly. 2011-04-28 13:03:21 +09:00
66cea3a0b5 Update vala binding API version. 2011-04-28 12:31:24 +09:00
0add617834 Autodetect fakekey, at-spi2-core, clutter, clutter-gtk, python, and vala. 2011-04-28 10:58:42 +09:00
70b0d95d9b Change D-Bus interface name and object path to fedorahosted ones. 2011-04-27 18:25:53 +09:00
cae9c89b64 Allow eekboard UI toolkit to be changed at runtime. 2011-04-27 17:54:20 +09:00
a9d9274e78 Add short label for Meta_{L,R}. 2011-04-22 17:07:44 +09:00
2211fb6b1e 0.90.7 released. 2011-04-22 15:12:05 +09:00
34569679f0 Ignore some files. 2011-04-22 14:44:44 +09:00
816e1f0d51 Fix Clutter build. 2011-04-22 14:41:36 +09:00
de62d74ac5 Fix GTK-DOC comments. 2011-04-22 14:41:29 +09:00
d71c79f268 Fix glib-mkenums error. 2011-04-21 16:24:19 +09:00
ee948cb2ae Update dependencies. 2011-04-19 15:44:12 +09:00
ba59a850d1 Fix compilation error when --disable-atspi. 2011-04-19 15:43:02 +09:00
b7999842a9 Display more information about build. 2011-04-19 15:41:15 +09:00
2dd0ae47db Add autostart desktop file. 2011-04-19 15:41:07 +09:00
926d9346e1 Use at-spi2 instead of at-spi1. 2011-04-19 15:12:01 +09:00
ac8764b9b7 Fix compiler warnings. 2011-04-19 11:56:00 +09:00
4cf3f24fbc Don't check GConf2 if CSPI-1.0 is disabled; disable CSPI-1.0 by default. 2011-04-19 11:29:58 +09:00
0691766a31 Don't include cspi/spi.h if CSPI-1.0 is disabled. 2011-04-19 10:20:37 +09:00
77c00a10da Replace the eekboard-desktop-client reference in desktop file with "eekboard".
https://bugzilla.redhat.com/show_bug.cgi?id=696523
2011-04-14 18:38:46 +09:00
8c407ae482 Use G_DEFINE_BOXED_TYPE. 2011-04-12 11:09:28 +09:00
8d2d612547 Use us-qwerty keyboard by default. 2011-03-28 14:48:07 +09:00
80dc26b7f4 Fix make distcheck. 2011-03-23 18:53:44 +09:00
fbe7b9ec1a Hard-code dynamic modifier masks for XML layout. 2011-03-23 17:59:43 +09:00
048fccd6e0 Use GEnumTypes. 2011-03-23 17:25:29 +09:00
638d41e0b6 Check keycode before passing it to fakekey_send_keyevent(). 2011-03-23 14:49:33 +09:00
4271eb6b3e Pick keyboard file in $(keyboarddir). 2011-03-22 18:23:04 +09:00
d25bfd8ba7 Update README. 2011-03-12 07:19:05 +09:00
0739fbf464 Fix packaging mistake of *.desktop file. 2011-03-11 18:17:41 +09:00
d1b38f8eb2 0.90.6 released. 2011-03-11 18:05:41 +09:00
e6d17fa4cb Fix the last commit. 2011-03-11 17:39:55 +09:00
d62b8b49a2 Fix the last commit. 2011-03-11 17:18:29 +09:00
149dd7dc8b Ignore some files. 2011-03-11 14:26:57 +09:00
85 changed files with 2684 additions and 882 deletions

12
.gitignore vendored
View File

@ -33,6 +33,7 @@ gtk-doc.make
eek/eek-special-keysym-entries.h eek/eek-special-keysym-entries.h
eek/eek-unicode-keysym-entries.h eek/eek-unicode-keysym-entries.h
eek/eek-xkeysym-keysym-entries.h eek/eek-xkeysym-keysym-entries.h
eek/eek-enumtypes.[ch]
eek/eek-marshalers.[ch] eek/eek-marshalers.[ch]
eek/*.pc eek/*.pc
eek/*.gir eek/*.gir
@ -43,12 +44,12 @@ eekboard/*.typelib
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-server src/eekboard-server
src/eekboard-client
src/eekboard-system-client
src/eekboard-xml 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-sections.txt !/docs/reference/eek/eek-sections.txt
docs/reference/eek/xml docs/reference/eek/xml
docs/reference/eek/html docs/reference/eek/html
@ -71,6 +72,11 @@ po/*.gmo
po/Makefile.in.in po/Makefile.in.in
po/POTFILES po/POTFILES
po/stamp-it po/stamp-it
po/.intltool-merge-cache
bindings/vala/*.vapi bindings/vala/*.vapi
py-compile py-compile
data/org.fedorahosted.eekboard.gschema.xml
data/eekboard-server.service
data/*.desktop
examples/eekboard-inscript/eekboard-inscript
examples/simple-client/simple-client

25
README
View File

@ -7,8 +7,8 @@ tools to implement desktop virtual keyboards.
** Dependencies ** Dependencies
REQUIRED: GLib2, GTK, GConf2, PangoCairo, libxklavier, libcroco REQUIRED: GLib2, GTK, PangoCairo, libxklavier, libcroco
OPTIONAL: fakekey, CSPI, Clutter, Clutter-Gtk, Vala, gobject-introspection OPTIONAL: libXtst, at-spi2-core, IBus, Clutter, Clutter-Gtk, Python, Vala, gobject-introspection
** Build from git repo ** Build from git repo
@ -24,7 +24,7 @@ OPTIONAL: fakekey, CSPI, Clutter, Clutter-Gtk, Vala, gobject-introspection
$ make $ make
$ sudo make install $ sudo make install
* How to test * Using command-line tools
eekboard currently includes 3 tools to implement your own virtual eekboard currently includes 3 tools to implement your own virtual
keyboard. keyboard.
@ -47,10 +47,15 @@ be started with:
$ eekboard $ eekboard
By default it renders current system keyboard layout. To read custom
keyboard layout, specify --keyboard option like:
$ eekboard --keyboard /usr/share/eekboard/keyboards/us-qwerty.xml
** eekboard-xml ** eekboard-xml
eekboard-xml is a tool to manipulate XML keyboard description used by eekboard-xml is a tool to manipulate XML keyboard description read by
eekboard-client tool and in the eekboard library. eekboard if --keyboard option is specified.
To dump the current system keyboard layout into an XML file: To dump the current system keyboard layout into an XML file:
@ -60,6 +65,14 @@ You can display the dumped layout with:
$ eekboard-xml --load keyboard.xml $ eekboard-xml --load keyboard.xml
* Documentation * 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 See file:docs/reference/eek/html/index.html

View File

@ -26,25 +26,49 @@ dist_vapi_DATA = \
MAINTAINERCLEANFILES = $(dist_vapi_DATA) MAINTAINERCLEANFILES = $(dist_vapi_DATA)
eek-$(EEK_API_VERSION).vapi: eek-$(EEK_API_VERSION).vapi:
vapigen --library eek-$(EEK_API_VERSION) \ $(VAPIGEN_V)$(VAPIGEN) \
--library eek-$(EEK_API_VERSION) \
--pkg gio-2.0 \
eek-$(EEK_API_VERSION)/eek-$(EEK_API_VERSION).gi eek-$(EEK_API_VERSION)/eek-$(EEK_API_VERSION).gi
eek-clutter-$(EEK_API_VERSION).vapi: eek-$(EEK_API_VERSION).vapi eek-clutter-$(EEK_API_VERSION).vapi: eek-$(EEK_API_VERSION).vapi
vapigen --vapidir=$(builddir) --library eek-clutter-$(EEK_API_VERSION) \ $(VAPIGEN_V)$(VAPIGEN) --vapidir=$(builddir) \
--pkg eek-$(EEK_API_VERSION) --pkg clutter-1.0 \ --library eek-clutter-$(EEK_API_VERSION) \
--pkg eek-$(EEK_API_VERSION) \
--pkg clutter-1.0 \
--pkg gio-2.0 \
--pkg atk \
eek-clutter-$(EEK_API_VERSION)/eek-clutter-$(EEK_API_VERSION).gi 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-$(EEK_API_VERSION).vapi
vapigen --vapidir=$(builddir) --library eek-gtk-$(EEK_API_VERSION) \ $(VAPIGEN_V)$(VAPIGEN) --vapidir=$(builddir) \
--pkg eek-$(EEK_API_VERSION) --pkg gtk+-2.0 \ --library eek-gtk-$(EEK_API_VERSION) \
--pkg eek-$(EEK_API_VERSION) \
--pkg gtk+-2.0 \
eek-gtk-$(EEK_API_VERSION)/eek-gtk-$(EEK_API_VERSION).gi eek-gtk-$(EEK_API_VERSION)/eek-gtk-$(EEK_API_VERSION).gi
eek-xkb-$(EEK_API_VERSION).vapi: eek-$(EEK_API_VERSION).vapi eek-xkb-$(EEK_API_VERSION).vapi: eek-$(EEK_API_VERSION).vapi
vapigen --vapidir=$(builddir) --library eek-xkb-$(EEK_API_VERSION) \ $(VAPIGEN_V)$(VAPIGEN) --vapidir=$(builddir) \
--library eek-xkb-$(EEK_API_VERSION) \
--pkg eek-$(EEK_API_VERSION) \ --pkg eek-$(EEK_API_VERSION) \
--pkg gio-2.0 \
eek-xkb-$(EEK_API_VERSION)/eek-xkb-$(EEK_API_VERSION).gi 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-xkb-$(EEK_API_VERSION).vapi
vapigen --vapidir=$(builddir) --library eek-xkl-$(EEK_API_VERSION) \ $(VAPIGEN_V)$(VAPIGEN) --vapidir=$(builddir) \
--pkg eek-$(EEK_API_VERSION) --pkg eek-xkb-$(EEK_API_VERSION) \ --library eek-xkl-$(EEK_API_VERSION) \
--pkg eek-$(EEK_API_VERSION) \
--pkg eek-xkb-$(EEK_API_VERSION) --pkg gio-2.0 \
eek-xkl-$(EEK_API_VERSION)/eek-xkl-$(EEK_API_VERSION).gi eek-xkl-$(EEK_API_VERSION)/eek-xkl-$(EEK_API_VERSION).gi
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
VAPIGEN_V = $(VAPIGEN_V_$(V))
VAPIGEN_V_ = $(VAPIGEN_V_$(AM_DEFAULT_VERBOSITY))
VAPIGEN_V_0 = @echo " VAPIG " $^;

View File

@ -1,9 +1,16 @@
include/eek-0.1/eek/eek-layout.h include/eek-0.90/eek/eek-container.h
include/eek-0.1/eek/eek-element.h include/eek-0.90/eek/eek-element.h
include/eek-0.1/eek/eek-container.h include/eek-0.90/eek/eek-enumtypes.h
include/eek-0.1/eek/eek-keyboard.h include/eek-0.90/eek/eek-keyboard.h
include/eek-0.1/eek/eek-section.h include/eek-0.90/eek/eek-key.h
include/eek-0.1/eek/eek-key.h include/eek-0.90/eek/eek-keysym.h
include/eek-0.1/eek/eek-types.h include/eek-0.90/eek/eek-layout.h
include/eek-0.1/eek/eek-keysym.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 lib/libeek.so

File diff suppressed because it is too large Load Diff

View File

@ -1,6 +1,2 @@
include/eek-0.1/eek/eek-clutter-keyboard.h include/eek-0.90/eek/eek-clutter-keyboard.h
include/eek-0.1/eek/eek-clutter-section.h
include/eek-0.1/eek/eek-clutter-key.h
include/eek-0.1/eek/eek-clutter-drawing-context.h
lib/libeek-clutter.so lib/libeek-clutter.so

View File

@ -1,85 +1,28 @@
<?xml version="1.0"?> <?xml version="1.0"?>
<api version="1.0"> <api version="1.0">
<namespace name="EekClutter"> <namespace name="EekClutter">
<object name="EekClutterDrawingContext" parent="GInitiallyUnowned" type-name="EekClutterDrawingContext" get-type="eek_clutter_drawing_context_get_type"> <object name="EekClutterKeyboard" parent="ClutterGroup" type-name="EekClutterKeyboard" get-type="eek_clutter_keyboard_get_type">
<method name="get_category_font" symbol="eek_clutter_drawing_context_get_category_font"> <implements>
<return-type type="PangoFontDescription*"/> <interface name="ClutterScriptable"/>
<parameters> <interface name="ClutterAnimatable"/>
<parameter name="context" type="EekClutterDrawingContext*"/> <interface name="AtkImplementor"/>
<parameter name="category" type="EekKeysymCategory"/> <interface name="ClutterContainer"/>
</parameters> </implements>
</method> <constructor name="new" symbol="eek_clutter_keyboard_new">
<method name="get_outline_texture" symbol="eek_clutter_drawing_context_get_outline_texture">
<return-type type="ClutterActor*"/> <return-type type="ClutterActor*"/>
<parameters> <parameters>
<parameter name="context" type="EekClutterDrawingContext*"/> <parameter name="keyboard" type="EekKeyboard*"/>
<parameter name="outline" type="EekOutline*"/>
</parameters>
</method>
<constructor name="new" symbol="eek_clutter_drawing_context_new">
<return-type type="EekClutterDrawingContext*"/>
</constructor>
<method name="set_category_font" symbol="eek_clutter_drawing_context_set_category_font">
<return-type type="void"/>
<parameters>
<parameter name="context" type="EekClutterDrawingContext*"/>
<parameter name="category" type="EekKeysymCategory"/>
<parameter name="fonts" type="PangoFontDescription*"/>
</parameters>
</method>
<method name="set_outline_texture" symbol="eek_clutter_drawing_context_set_outline_texture">
<return-type type="void"/>
<parameters>
<parameter name="context" type="EekClutterDrawingContext*"/>
<parameter name="outline" type="EekOutline*"/>
<parameter name="texture" type="ClutterActor*"/>
</parameters>
</method>
</object>
<object name="EekClutterKey" parent="EekKey" type-name="EekClutterKey" get-type="eek_clutter_key_get_type">
<method name="get_actor" symbol="eek_clutter_key_get_actor">
<return-type type="ClutterActor*"/>
<parameters>
<parameter name="key" type="EekClutterKey*"/>
</parameters>
</method>
<constructor name="new" symbol="eek_clutter_key_new">
<return-type type="EekKey*"/>
<parameters>
<parameter name="context" type="EekClutterDrawingContext*"/>
<parameter name="column" type="gint"/>
<parameter name="row" type="gint"/>
</parameters> </parameters>
</constructor> </constructor>
</object> <method name="set_theme" symbol="eek_clutter_keyboard_set_theme">
<object name="EekClutterKeyboard" parent="EekKeyboard" type-name="EekClutterKeyboard" get-type="eek_clutter_keyboard_get_type"> <return-type type="void"/>
<method name="get_actor" symbol="eek_clutter_keyboard_get_actor">
<return-type type="ClutterActor*"/>
<parameters> <parameters>
<parameter name="keyboard" type="EekClutterKeyboard*"/> <parameter name="keyboard" type="EekClutterKeyboard*"/>
<parameter name="theme" type="EekTheme*"/>
</parameters> </parameters>
</method> </method>
<constructor name="new" symbol="eek_clutter_keyboard_new"> <property name="keyboard" type="EekKeyboard*" readable="0" writable="1" construct="0" construct-only="1"/>
<return-type type="EekKeyboard*"/>
</constructor>
</object> </object>
<object name="EekClutterSection" parent="EekSection" type-name="EekClutterSection" get-type="eek_clutter_section_get_type">
<method name="get_actor" symbol="eek_clutter_section_get_actor">
<return-type type="ClutterActor*"/>
<parameters>
<parameter name="section" type="EekClutterSection*"/>
</parameters>
</method>
<constructor name="new" symbol="eek_clutter_section_new">
<return-type type="EekSection*"/>
<parameters>
<parameter name="context" type="EekClutterDrawingContext*"/>
</parameters>
</constructor>
</object>
<constant name="EEK_CLUTTER_DRAWING_CONTEXT_H" type="int" value="1"/>
<constant name="EEK_CLUTTER_KEYBOARD_H" type="int" value="1"/> <constant name="EEK_CLUTTER_KEYBOARD_H" type="int" value="1"/>
<constant name="EEK_CLUTTER_KEY_H" type="int" value="1"/>
<constant name="EEK_CLUTTER_SECTION_H" type="int" value="1"/>
</namespace> </namespace>
</api> </api>

View File

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

View File

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

View File

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

View File

@ -1,10 +1,7 @@
<?xml version="1.0"?> <?xml version="1.0"?>
<api version="1.0"> <api version="1.0">
<namespace name="EekXkb"> <namespace name="EekXkb">
<object name="EekXkbLayout" parent="GInitiallyUnowned" type-name="EekXkbLayout" get-type="eek_xkb_layout_get_type"> <object name="EekXkbLayout" parent="EekLayout" type-name="EekXkbLayout" get-type="eek_xkb_layout_get_type">
<implements>
<interface name="EekLayout"/>
</implements>
<method name="get_geometry" symbol="eek_xkb_layout_get_geometry"> <method name="get_geometry" symbol="eek_xkb_layout_get_geometry">
<return-type type="gchar*"/> <return-type type="gchar*"/>
<parameters> <parameters>
@ -49,6 +46,19 @@
</parameters> </parameters>
</method> </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"> <method name="set_symbols" symbol="eek_xkb_layout_set_symbols">
<return-type type="gboolean"/> <return-type type="gboolean"/>
<parameters> <parameters>

View File

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

View File

@ -2,9 +2,6 @@
<api version="1.0"> <api version="1.0">
<namespace name="EekXkl"> <namespace name="EekXkl">
<object name="EekXklLayout" parent="EekXkbLayout" type-name="EekXklLayout" get-type="eek_xkl_layout_get_type"> <object name="EekXklLayout" parent="EekXkbLayout" type-name="EekXklLayout" get-type="eek_xkl_layout_get_type">
<implements>
<interface name="EekLayout"/>
</implements>
<method name="disable_option" symbol="eek_xkl_layout_disable_option"> <method name="disable_option" symbol="eek_xkl_layout_disable_option">
<return-type type="gboolean"/> <return-type type="gboolean"/>
<parameters> <parameters>
@ -53,6 +50,25 @@
<constructor name="new" symbol="eek_xkl_layout_new"> <constructor name="new" symbol="eek_xkl_layout_new">
<return-type type="EekLayout*"/> <return-type type="EekLayout*"/>
</constructor> </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"> <method name="set_layouts" symbol="eek_xkl_layout_set_layouts">
<return-type type="gboolean"/> <return-type type="gboolean"/>
<parameters> <parameters>

View File

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

View File

@ -0,0 +1,194 @@
<?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

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

View File

@ -0,0 +1 @@
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], [0.90.4], [ueno@unixuser.org]) AC_INIT([eekboard], [1.0.1], [ueno@unixuser.org])
dnl Init automake dnl Init automake
AM_INIT_AUTOMAKE AM_INIT_AUTOMAKE
@ -85,18 +85,18 @@ AM_CONDITIONAL([HAVE_GTK_2],[test "$with_gtk" = "2.0"])
AM_CONDITIONAL([HAVE_GTK_3],[test "$with_gtk" = "3.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.25.4], , PKG_CHECK_MODULES([GLIB2], [glib-2.0 >= 2.26.0], ,
[AC_MSG_ERROR([GLib2 not found])]) [AC_MSG_ERROR([GLib2 not found])])
PKG_CHECK_MODULES([GIO2], [gio-2.0], , PKG_CHECK_MODULES([GIO2], [gio-2.0], ,
[AC_MSG_ERROR([Gio2 not found])]) [AC_MSG_ERROR([Gio2 not found])])
GLIB_GSETTINGS
PKG_CHECK_MODULES([PANGOCAIRO], [pangocairo], , PKG_CHECK_MODULES([PANGOCAIRO], [pangocairo], ,
[AC_MSG_ERROR([PangoCairo not found])]) [AC_MSG_ERROR([PangoCairo not found])])
PKG_CHECK_MODULES([GTK], [ 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([GCONF2], [gconf-2.0], ,
[AC_MSG_ERROR([GConf not found])])
PKG_CHECK_MODULES([XKB], [x11], , PKG_CHECK_MODULES([XKB], [x11], ,
[AC_MSG_ERROR([XKB support not found])]) [AC_MSG_ERROR([XKB support not found])])
PKG_CHECK_MODULES([LIBXKLAVIER], [libxklavier x11], , PKG_CHECK_MODULES([LIBXKLAVIER], [libxklavier x11], ,
@ -104,52 +104,102 @@ PKG_CHECK_MODULES([LIBXKLAVIER], [libxklavier x11], ,
PKG_CHECK_MODULES([LIBCROCO], [libcroco-0.6], , PKG_CHECK_MODULES([LIBCROCO], [libcroco-0.6], ,
[AC_MSG_ERROR([libcroco not found])]) [AC_MSG_ERROR([libcroco not found])])
dnl use libfakekey to generate key events dnl use XTest to generate key events
AC_MSG_CHECKING([whether you enable fakekey]) AC_MSG_CHECKING([whether you enable XTest])
AC_ARG_ENABLE(fakekey, AC_ARG_ENABLE(xtest,
AS_HELP_STRING([--enable-fakekey=no/yes], AS_HELP_STRING([--enable-xtest=no/yes],
[Enable fakekey default=yes]),, [Enable XTest default=yes]),
enable_fakekey=yes) enable_xtest=$enableval,
enable_xtest=yes)
if test x$enable_fakekey = xyes; then if test x$enable_xtest = xyes; then
PKG_CHECK_MODULES([FAKEKEY], [libfakekey], , PKG_CHECK_MODULES([XTEST], [xtst], , enable_xtest=no)
[AC_MSG_ERROR([fakekey not found])]) if test x$enable_xtest = xyes; then
AC_DEFINE([HAVE_FAKEKEY], [1], [Define if fakekey is found]) AC_DEFINE([HAVE_XTEST], [1], [Define if XTest is found])
fi fi
AM_CONDITIONAL(ENABLE_FAKEKEY, [test x$enable_fakekey = xyes])
AC_MSG_RESULT($enable_fakekey)
dnl use AT-SPI to capture focus/keystroke events
AC_MSG_CHECKING([whether you enable AT-SPI event handling])
AC_ARG_ENABLE(cspi,
AS_HELP_STRING([--enable-cspi=no/yes],
[Enable AT-SPI event handling default=yes]),,
enable_cspi=yes)
if test x$enable_cspi = xyes; then
PKG_CHECK_MODULES([CSPI], [cspi-1.0], ,
[AC_MSG_ERROR([AT-SPI C not found])])
AC_DEFINE([HAVE_CSPI], [1], [Define if CSPI is found])
fi fi
AC_MSG_RESULT($enable_cspi) AM_CONDITIONAL(ENABLE_XTEST, [test x$enable_xtest = xyes])
AM_CONDITIONAL(ENABLE_CSPI, [test x$enable_cspi = xyes]) AC_MSG_RESULT($enable_xtest)
dnl use X to mark the fullscreen window as dock
AC_MSG_CHECKING([whether you enable X dock])
AC_ARG_ENABLE(x-dock,
AS_HELP_STRING([--enable-x-dock=no/yes],
[Enable X dock default=yes]),
enable_x_dock=$enableval,
enable_x_dock=yes)
if test x$enable_x_dock = xyes; then
PKG_CHECK_MODULES([XDOCK], [x], , enable_x_dock=no)
if test x$enable_x_dock = xyes; then
AC_DEFINE([HAVE_XDOCK], [1], [Define if X dock is found])
fi
fi
AM_CONDITIONAL(ENABLE_XDOCK, [test x$enable_x_dock = xyes])
AC_MSG_RESULT($enable_x_dock)
focus_listeners=""
keystroke_listeners=""
focus_listeners=""
keystroke_listeners=""
dnl use AT-SPI 2 to capture focus/keystroke events
AC_MSG_CHECKING([whether you enable AT-SPI 2 event handling])
AC_ARG_ENABLE(atspi,
AS_HELP_STRING([--enable-atspi=no/yes],
[Enable AT-SPI 2 event handling default=yes]),
enable_atspi=$enableval,
enable_atspi=yes)
if test x$enable_atspi = xyes; then
PKG_CHECK_MODULES([ATSPI2], [atspi-2 dbus-glib-1], , enable_atspi=no)
if test x$enable_atspi = xyes; then
AC_DEFINE([HAVE_ATSPI], [1], [Define if AT-SPI 2 is found])
focus_listeners="atspi $focus_listeners"
keystroke_listeners="atspi $keystroke_listeners"
fi
fi
AC_MSG_RESULT($enable_atspi)
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
AC_DEFINE(ENABLE_FOCUS_LISTENER, [1], [Define if eekboard can follow focus changes])
fi
dnl Python language binding dnl Python language binding
AC_MSG_CHECKING([whether you enable Python language support]) AC_MSG_CHECKING([whether you enable Python language support])
AC_ARG_ENABLE(python, AC_ARG_ENABLE(python,
AS_HELP_STRING([--enable-python=no/yes], AS_HELP_STRING([--enable-python=no/yes],
[Enable Python language binding default=yes]),, [Enable Python language binding default=yes]),
enable_python=$enableval,
enable_python=yes) enable_python=yes)
AC_MSG_RESULT($enable_python)
AM_CONDITIONAL(ENABLE_PYTHON, [test x$enable_python = xyes]) 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" = x"yes"; then
# check python if test x$enable_python = xyes; then
AM_PATH_PYTHON([2.5]) AC_PATH_PROGS(PYTHON_CONFIG, [python$PYTHON_VERSION-config python-config])
AC_PATH_PROG(PYTHON_CONFIG, python$PYTHON_VERSION-config)
if test x"$PYTHON_CONFIG" = x""; then
AC_PATH_PROG(PYTHON_CONFIG, python-config)
fi
if test x"$PYTHON_CONFIG" != x""; then if test x"$PYTHON_CONFIG" != x""; then
PYTHON_CFLAGS=`$PYTHON_CONFIG --includes` PYTHON_CFLAGS=`$PYTHON_CONFIG --includes`
PYTHON_LIBS=`$PYTHON_CONFIG --libs` PYTHON_LIBS=`$PYTHON_CONFIG --libs`
@ -161,57 +211,85 @@ if test x"$enable_python" = x"yes"; then
AC_SUBST(PYTHON_CFLAGS) AC_SUBST(PYTHON_CFLAGS)
AC_SUBST(PYTHON_INCLUDES) AC_SUBST(PYTHON_INCLUDES)
AC_SUBST(PYTHON_LIBS) AC_SUBST(PYTHON_LIBS)
else
enable_python="no (disabled, use --enable-python to enable)"
fi fi
fi
AC_MSG_RESULT($enable_python)
AM_CONDITIONAL(ENABLE_PYTHON, [test x$enable_python = xyes])
GOBJECT_INTROSPECTION_CHECK([0.9.0])
dnl Vala langauge binding dnl Vala langauge binding
AC_MSG_CHECKING([whether you enable Vala language support]) AC_MSG_CHECKING([whether you enable Vala language support])
AC_ARG_ENABLE(vala, AC_ARG_ENABLE(vala,
AS_HELP_STRING([--enable-vala=no/yes], AS_HELP_STRING([--enable-vala=no/yes],
[Enable Vala language binding default=yes]),, [Enable Vala language binding default=yes]),
enable_vala=$enableval,
enable_vala=yes) enable_vala=yes)
if test x$enable_vala = xyes; then
if test "x$INTROSPECTION_SCANNER" = x; then
enable_vala=no
AC_MSG_WARN([GObject-Introspection must be enabled for Vala bindings])
fi
AM_PROG_VALAC([0.10.0])
have_vala=yes
AC_PATH_PROG(VALAC, valac, valac)
AC_SUBST(VALAC)
AC_SUBST(VALAFLAGS)
AC_PATH_PROG([VAPIGEN], [vapigen], [false])
if test "x$VAPIGEN" = "xfalse"; then
enable_vala=no
AC_MSG_WARN([vapigen not found. Was vala compiled with --enable-vapigen?])
fi
AC_SUBST(VAPIGEN)
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 standalone application dnl clutter
AC_MSG_CHECKING([whether you enable eekboard]) AC_MSG_CHECKING([whether you enable clutter])
AC_ARG_ENABLE(eekboard,
AS_HELP_STRING([--enable-eekboard=no/yes],
[Build standalone application "ekboard" default=yes]),,
enable_eekboard=yes)
AC_MSG_RESULT($enable_eekboard)
AM_CONDITIONAL(ENABLE_EEKBOARD, [test x$enable_eekboard = xyes])
dnl Clutter
AC_MSG_CHECKING([whether you enable Clutter])
AC_ARG_ENABLE(clutter, AC_ARG_ENABLE(clutter,
AS_HELP_STRING([--enable-clutter=no/yes], AS_HELP_STRING([--enable-clutter=no/yes],
[Enable Clutter user interface default=yes]),, [Enable clutter user interface default=no]),
enable_clutter=$enableval,
enable_clutter=no) enable_clutter=no)
AC_MSG_RESULT($enable_clutter)
if test x$enable_clutter = xyes; then if test x$enable_clutter = xyes; then
PKG_CHECK_MODULES([CLUTTER], [clutter-1.0], , PKG_CHECK_MODULES([CLUTTER], [clutter-1.0], , enable_clutter=no)
[AC_MSG_ERROR([Clutter not found -- install it or add --disable-clutter])]) if test x$enable_clutter = xyes; then
AC_DEFINE([HAVE_CLUTTER], [1], [Define if Clutter is found]) AC_DEFINE([HAVE_CLUTTER], [1], [Define if clutter is found])
have_clutter_gtk=0 fi
need_swap_event_workaround=0
PKG_CHECK_MODULES([CLUTTER_GTK], [clutter-gtk-1.0], [have_clutter_gtk=1],
[PKG_CHECK_MODULES([CLUTTER_GTK], [clutter-gtk-0.10 clutter-x11-1.0],
[have_clutter_gtk=1; need_swap_event_workaround=1])])
AC_DEFINE_UNQUOTED([HAVE_CLUTTER_GTK], $have_clutter_gtk,
[Define if Clutter-Gtk is found])
AC_DEFINE_UNQUOTED([NEED_SWAP_EVENT_WORKAROUND], $need_swap_event_workaround,
[Define if GLX_INTEL_swap_event work around is needed])
fi fi
AM_CONDITIONAL(ENABLE_CLUTTER, [test x$enable_clutter = xyes]) AM_CONDITIONAL(ENABLE_CLUTTER, [test x$enable_clutter = xyes])
AC_MSG_RESULT($enable_clutter)
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])
dnl to re-generate eek/*-keysym-labels.txt
AC_CHECK_PROGS([PYTHON], [python])
dnl define GETTEXT_* variables dnl define GETTEXT_* variables
GETTEXT_PACKAGE=$PACKAGE GETTEXT_PACKAGE=$PACKAGE
AC_SUBST(GETTEXT_PACKAGE) AC_SUBST(GETTEXT_PACKAGE)
@ -219,8 +297,6 @@ AC_DEFINE_UNQUOTED(GETTEXT_PACKAGE,"$GETTEXT_PACKAGE", [Define to the read-only
AM_GLIB_GNU_GETTEXT AM_GLIB_GNU_GETTEXT
AM_GLIB_DEFINE_LOCALEDIR(EEKBOARD_LOCALEDIR) AM_GLIB_DEFINE_LOCALEDIR(EEKBOARD_LOCALEDIR)
GOBJECT_INTROSPECTION_CHECK([0.9.0])
AC_CONFIG_HEADERS([config.h]) AC_CONFIG_HEADERS([config.h])
AC_CONFIG_FILES([Makefile AC_CONFIG_FILES([Makefile
eek/Makefile eek/Makefile
@ -263,6 +339,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
Build vala binding $enable_vala GTK version $with_gtk
Build Clutter UI $enable_clutter
Build Vala binding $enable_vala
Build Python binding $enable_python
Build document $enable_gtk_doc Build document $enable_gtk_doc
Focus listeners $focus_listeners
Keystroke listeners $keystroke_listeners
]) ])

View File

@ -1,2 +1,34 @@
SUBDIRS = icons themes keyboards SUBDIRS = icons themes keyboards
EXTRA_DIST = eekboard.desktop
@GSETTINGS_RULES@
@INTLTOOL_XML_NOMERGE_RULE@
gsettings_schemas_in_files = org.fedorahosted.eekboard.gschema.xml.in
gsettings_SCHEMAS = $(gsettings_schemas_in_files:.gschema.xml.in=.gschema.xml)
servicedir = $(datadir)/dbus-1/services
service_in_files = eekboard-server.service.in
service_DATA = $(service_in_files:.service.in=.service)
$(service_DATA): $(service_in_files) Makefile
$(AM_V_GEN) sed -e "s|\@bindir\@|$(bindir)|" $< > $@
desktopdir = $(datadir)/applications
desktop_in_files = eekboard.desktop.in
desktop_DATA = $(desktop_in_files:.desktop.in=.desktop)
if ENABLE_ATSPI
autostartdir = $(sysconfdir)/xdg/autostart
autostart_in_files = eekboard-autostart.desktop.in
autostart_DATA = $(autostart_in_files:.desktop.in=.desktop)
endif
@INTLTOOL_DESKTOP_RULE@
CLEANFILES = $(service_DATA) $(desktop_DATA) $(gsettings_SCHEMAS)
EXTRA_DIST = $(service_in_files) $(desktop_in_files) $(gsettings_schemas_in_files)
if ENABLE_ATSPI
CLEANFILES += $(autostart_DATA)
EXTRA_DIST += $(autostart_in_files)
endif

View File

@ -0,0 +1,6 @@
[Desktop Entry]
Name=Eekboard
Exec=eekboard -f
Type=Application
AutostartCondition=GSettings org.gnome.desktop.a11y.applications screen-keyboard-enabled
X-GNOME-AutoRestart=true

View File

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

View File

@ -2,7 +2,7 @@
Name=Eekboard Name=Eekboard
GenericName=Eekboard Virtual Keyboard GenericName=Eekboard Virtual Keyboard
Comment=Virtual Keyboard Comment=Virtual Keyboard
Exec=eekboard-desktop-client Exec=eekboard
Icon=eekboard Icon=eekboard
Terminal=false Terminal=false
Type=Application Type=Application

View File

@ -0,0 +1,30 @@
<?xml version="1.0"?>
<schemalist>
<schema id="org.fedorahosted.eekboard" path="/org/fedorahosted/eekboard/">
<key name="ui-toolkit" type="s">
<default>'gtk'</default>
<summary>GUI toolkit used to render keyboard</summary>
<description>The name of GUI toolkit (either 'gtk' or 'clutter') used to render keyboard on screen.</description>
</key>
<key name="focus-listener" type="s">
<default>'atspi'</default>
<summary>Use the given focus listener</summary>
<description>The name of the focus listener (either 'atspi' or 'ibus') used to detect focus events.</description>
</key>
<key name="auto-hide" type="b">
<default>true</default>
<summary>Hide keyboard automatically when focus is out</summary>
<description>If true, hide keyboard automatically when focus is out.</description>
</key>
<key name="auto-hide-delay" type="d">
<default>0.5</default>
<summary>Delay seconds before hiding keyboard</summary>
<description>Delay seconds before hiding keyboard. This is useful when focus listener is enabled.</description>
</key>
<key name="start-fullscreen" type="b">
<default>false</default>
<summary>Switch to fullscreen mode when startup</summary>
<description>If true, switch to fullscreen mode when startup.</description>
</key>
</schema>
</schemalist>

View File

@ -47,7 +47,7 @@ SCANGOBJ_OPTIONS=
# Extra options to supply to gtkdoc-scan. # Extra options to supply to gtkdoc-scan.
# e.g. SCAN_OPTIONS=--deprecated-guards="GTK_DISABLE_DEPRECATED" # e.g. SCAN_OPTIONS=--deprecated-guards="GTK_DISABLE_DEPRECATED"
SCAN_OPTIONS=--rebuild-types SCAN_OPTIONS=--rebuild-types --deprecated-guards="EEK_DISABLE_DEPRECATED"
# Extra options to supply to gtkdoc-mkdb. # Extra options to supply to gtkdoc-mkdb.
# e.g. MKDB_OPTIONS=--sgml-mode --output-format=xml # e.g. MKDB_OPTIONS=--sgml-mode --output-format=xml
@ -82,7 +82,8 @@ IGNORE_HFILES = \
eek-clutter-renderer.h \ eek-clutter-renderer.h \
eek-clutter-section.h \ eek-clutter-section.h \
eek-clutter-key.h \ eek-clutter-key.h \
eek-gtk-renderer.h eek-gtk-renderer.h \
eek-enumtypes.h
if !ENABLE_CLUTTER if !ENABLE_CLUTTER
IGNORE_HFILES += eek-clutter-keyboard.h eek-clutter.h IGNORE_HFILES += eek-clutter-keyboard.h eek-clutter.h
endif endif

View File

@ -1,9 +1,8 @@
<SECTION> <SECTION>
<FILE>eek-keyboard</FILE> <FILE>eek-keyboard</FILE>
<TITLE>EekKeyboard</TITLE> <TITLE>EekKeyboard</TITLE>
EekKeyboardClass
EekKeyboardPrivate
EekKeyboard EekKeyboard
EekKeyboardClass
eek_keyboard_new eek_keyboard_new
eek_keyboard_get_layout eek_keyboard_get_layout
eek_keyboard_get_size eek_keyboard_get_size
@ -21,6 +20,11 @@ eek_keyboard_create_section
eek_keyboard_find_key_by_keycode eek_keyboard_find_key_by_keycode
eek_keyboard_add_outline eek_keyboard_add_outline
eek_keyboard_get_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> <SUBSECTION Standard>
EEK_KEYBOARD EEK_KEYBOARD
EEK_IS_KEYBOARD EEK_IS_KEYBOARD
@ -34,8 +38,8 @@ EEK_KEYBOARD_GET_CLASS
<SECTION> <SECTION>
<FILE>eek-layout</FILE> <FILE>eek-layout</FILE>
<TITLE>EekLayout</TITLE> <TITLE>EekLayout</TITLE>
EekLayoutClass
EekLayout EekLayout
EekLayoutClass
<SUBSECTION Standard> <SUBSECTION Standard>
EEK_LAYOUT EEK_LAYOUT
EEK_IS_LAYOUT EEK_IS_LAYOUT
@ -51,8 +55,9 @@ EEK_LAYOUT_GET_CLASS
<TITLE>EekGtkKeyboard</TITLE> <TITLE>EekGtkKeyboard</TITLE>
EekGtkKeyboard EekGtkKeyboard
EekGtkKeyboardClass EekGtkKeyboardClass
EekGtkKeyboardPrivate
eek_gtk_keyboard_new eek_gtk_keyboard_new
eek_gtk_keyboard_set_theme
EekGtkKeyboardPrivate
<SUBSECTION Standard> <SUBSECTION Standard>
EEK_GTK_KEYBOARD EEK_GTK_KEYBOARD
EEK_IS_GTK_KEYBOARD EEK_IS_GTK_KEYBOARD
@ -63,12 +68,42 @@ EEK_IS_GTK_KEYBOARD_CLASS
EEK_GTK_KEYBOARD_GET_CLASS EEK_GTK_KEYBOARD_GET_CLASS
</SECTION> </SECTION>
<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> <SECTION>
<FILE>eek-section</FILE> <FILE>eek-section</FILE>
<TITLE>EekSection</TITLE> <TITLE>EekSection</TITLE>
EekSectionClass
EekSectionPrivate
EekSection EekSection
EekSectionClass
eek_section_set_angle eek_section_set_angle
eek_section_get_angle eek_section_get_angle
eek_section_get_n_rows eek_section_get_n_rows
@ -76,6 +111,7 @@ eek_section_add_row
eek_section_get_row eek_section_get_row
eek_section_create_key eek_section_create_key
eek_section_find_key_by_keycode eek_section_find_key_by_keycode
EekSectionPrivate
<SUBSECTION Standard> <SUBSECTION Standard>
EEK_SECTION EEK_SECTION
EEK_IS_SECTION EEK_IS_SECTION
@ -86,17 +122,39 @@ EEK_IS_SECTION_CLASS
EEK_SECTION_GET_CLASS EEK_SECTION_GET_CLASS
</SECTION> </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> <SECTION>
<FILE>eek-container</FILE> <FILE>eek-container</FILE>
<TITLE>EekContainer</TITLE> <TITLE>EekContainer</TITLE>
EekContainerClass
EekContainerPrivate
EekCallback EekCallback
EekCompareFunc EekCompareFunc
EekContainer EekContainer
EekContainerClass
eek_container_foreach_child eek_container_foreach_child
eek_container_find eek_container_find
eek_container_add_child eek_container_add_child
EekContainerPrivate
<SUBSECTION Standard> <SUBSECTION Standard>
EEK_CONTAINER EEK_CONTAINER
EEK_IS_CONTAINER EEK_IS_CONTAINER
@ -107,13 +165,30 @@ EEK_IS_CONTAINER_CLASS
EEK_CONTAINER_GET_CLASS EEK_CONTAINER_GET_CLASS
</SECTION> </SECTION>
<SECTION>
<FILE>eek-clutter-keyboard</FILE>
<TITLE>EekClutterKeyboard</TITLE>
EekClutterKeyboard
EekClutterKeyboardClass
eek_clutter_keyboard_new
eek_clutter_keyboard_set_theme
EekClutterKeyboardPrivate
<SUBSECTION Standard>
EEK_CLUTTER_KEYBOARD
EEK_IS_CLUTTER_KEYBOARD
EEK_TYPE_CLUTTER_KEYBOARD
eek_clutter_keyboard_get_type
EEK_CLUTTER_KEYBOARD_CLASS
EEK_IS_CLUTTER_KEYBOARD_CLASS
EEK_CLUTTER_KEYBOARD_GET_CLASS
</SECTION>
<SECTION> <SECTION>
<FILE>eek-symbol</FILE> <FILE>eek-symbol</FILE>
<TITLE>EekSymbol</TITLE> <TITLE>EekSymbol</TITLE>
EekSymbolCategory EekSymbolCategory
EekSymbolClass
EekSymbolPrivate
EekSymbol EekSymbol
EekSymbolClass
eek_symbol_new eek_symbol_new
eek_symbol_set_name eek_symbol_set_name
eek_symbol_get_name eek_symbol_get_name
@ -126,6 +201,7 @@ eek_symbol_set_modifier_mask
eek_symbol_is_modifier eek_symbol_is_modifier
eek_symbol_set_icon_name eek_symbol_set_icon_name
eek_symbol_get_icon_name eek_symbol_get_icon_name
EekSymbolPrivate
<SUBSECTION Standard> <SUBSECTION Standard>
EEK_SYMBOL EEK_SYMBOL
EEK_IS_SYMBOL EEK_IS_SYMBOL
@ -141,7 +217,6 @@ EEK_SYMBOL_GET_CLASS
<TITLE>EekXklLayout</TITLE> <TITLE>EekXklLayout</TITLE>
EekXklLayout EekXklLayout
EekXklLayoutClass EekXklLayoutClass
EekXklLayoutPrivate
eek_xkl_layout_new eek_xkl_layout_new
eek_xkl_layout_set_config eek_xkl_layout_set_config
eek_xkl_layout_set_config_full eek_xkl_layout_set_config_full
@ -156,6 +231,7 @@ eek_xkl_layout_get_layouts
eek_xkl_layout_get_variants eek_xkl_layout_get_variants
eek_xkl_layout_get_options eek_xkl_layout_get_options
eek_xkl_layout_get_option eek_xkl_layout_get_option
EekXklLayoutPrivate
<SUBSECTION Standard> <SUBSECTION Standard>
EEK_XKL_LAYOUT EEK_XKL_LAYOUT
EEK_IS_XKL_LAYOUT EEK_IS_XKL_LAYOUT
@ -171,7 +247,6 @@ EEK_XKL_LAYOUT_GET_CLASS
<TITLE>EekXkbLayout</TITLE> <TITLE>EekXkbLayout</TITLE>
EekXkbLayout EekXkbLayout
EekXkbLayoutClass EekXkbLayoutClass
EekXkbLayoutPrivate
eek_xkb_layout_new eek_xkb_layout_new
eek_xkb_layout_set_names eek_xkb_layout_set_names
eek_xkb_layout_set_names_full eek_xkb_layout_set_names_full
@ -182,6 +257,7 @@ eek_xkb_layout_set_symbols
eek_xkb_layout_get_keycodes eek_xkb_layout_get_keycodes
eek_xkb_layout_get_geometry eek_xkb_layout_get_geometry
eek_xkb_layout_get_symbols eek_xkb_layout_get_symbols
EekXkbLayoutPrivate
<SUBSECTION Standard> <SUBSECTION Standard>
EEK_XKB_LAYOUT EEK_XKB_LAYOUT
EEK_IS_XKB_LAYOUT EEK_IS_XKB_LAYOUT
@ -195,9 +271,8 @@ EEK_XKB_LAYOUT_GET_CLASS
<SECTION> <SECTION>
<FILE>eek-key</FILE> <FILE>eek-key</FILE>
<TITLE>EekKey</TITLE> <TITLE>EekKey</TITLE>
EekKeyClass
EekKeyPrivate
EekKey EekKey
EekKeyClass
eek_key_set_keycode eek_key_set_keycode
eek_key_get_keycode eek_key_get_keycode
eek_key_set_symbol_matrix eek_key_set_symbol_matrix
@ -210,6 +285,7 @@ eek_key_get_index
eek_key_set_oref eek_key_set_oref
eek_key_get_oref eek_key_get_oref
eek_key_is_pressed eek_key_is_pressed
EekKeyPrivate
<SUBSECTION Standard> <SUBSECTION Standard>
EEK_KEY EEK_KEY
EEK_IS_KEY EEK_IS_KEY
@ -223,7 +299,6 @@ EEK_KEY_GET_CLASS
<SECTION> <SECTION>
<FILE>eek-serializable</FILE> <FILE>eek-serializable</FILE>
<TITLE>EekSerializable</TITLE> <TITLE>EekSerializable</TITLE>
EekSerializable
EekSerializableIface EekSerializableIface
eek_serializable_serialize eek_serializable_serialize
eek_serializable_deserialize eek_serializable_deserialize
@ -238,9 +313,8 @@ EEK_SERIALIZABLE_GET_IFACE
<SECTION> <SECTION>
<FILE>eek-element</FILE> <FILE>eek-element</FILE>
<TITLE>EekElement</TITLE> <TITLE>EekElement</TITLE>
EekElementClass
EekElementPrivate
EekElement EekElement
EekElementClass
eek_element_set_parent eek_element_set_parent
eek_element_get_parent eek_element_get_parent
eek_element_set_name eek_element_set_name
@ -256,6 +330,7 @@ eek_element_set_group
eek_element_set_level eek_element_set_level
eek_element_get_group eek_element_get_group
eek_element_get_level eek_element_get_level
EekElementPrivate
<SUBSECTION Standard> <SUBSECTION Standard>
EEK_ELEMENT EEK_ELEMENT
EEK_IS_ELEMENT EEK_IS_ELEMENT
@ -271,10 +346,10 @@ EEK_ELEMENT_GET_CLASS
<TITLE>EekXmlLayout</TITLE> <TITLE>EekXmlLayout</TITLE>
EekXmlLayout EekXmlLayout
EekXmlLayoutClass EekXmlLayoutClass
EekXmlLayoutPrivate
eek_xml_layout_new eek_xml_layout_new
eek_xml_layout_set_source eek_xml_layout_set_source
eek_xml_layout_get_source eek_xml_layout_get_source
EekXmlLayoutPrivate
<SUBSECTION Standard> <SUBSECTION Standard>
EEK_XML_LAYOUT EEK_XML_LAYOUT
EEK_IS_XML_LAYOUT EEK_IS_XML_LAYOUT
@ -285,16 +360,33 @@ EEK_IS_XML_LAYOUT_CLASS
EEK_XML_LAYOUT_GET_CLASS EEK_XML_LAYOUT_GET_CLASS
</SECTION> </SECTION>
<SECTION>
<FILE>eek-theme</FILE>
eek_theme_new
eek_theme_load_stylesheet
eek_theme_unload_stylesheet
EekThemeClass
<SUBSECTION Standard>
EEK_THEME
EEK_IS_THEME
EEK_TYPE_THEME
eek_theme_get_type
EEK_THEME_CLASS
EEK_IS_THEME_CLASS
EEK_THEME_GET_CLASS
</SECTION>
<SECTION> <SECTION>
<FILE>eek-keysym</FILE> <FILE>eek-keysym</FILE>
<TITLE>EekKeysym</TITLE> <TITLE>EekKeysym</TITLE>
EEK_KEYSYM EEK_KEYSYM
EekKeysymClass
EekKeysymPrivate
EekKeysym EekKeysym
EekKeysymClass
eek_keysym_new eek_keysym_new
eek_keysym_get_xkeysym eek_keysym_get_xkeysym
eek_keysym_new_from_name eek_keysym_new_from_name
eek_keysym_new_with_modifier
EekKeysymPrivate
<SUBSECTION Standard> <SUBSECTION Standard>
EEK_INVALID_KEYSYM EEK_INVALID_KEYSYM
EEK_IS_KEYSYM EEK_IS_KEYSYM
@ -314,7 +406,6 @@ eek_keyboard_output
<SECTION> <SECTION>
<FILE>eek-types</FILE> <FILE>eek-types</FILE>
I_ I_
EEK_TYPE_SYMBOL_MATRIX
EEK_TYPE_POINT EEK_TYPE_POINT
EEK_TYPE_BOUNDS EEK_TYPE_BOUNDS
EEK_TYPE_OUTLINE EEK_TYPE_OUTLINE
@ -323,23 +414,40 @@ EekOrientation
EekModifierBehavior EekModifierBehavior
EekModifierType EekModifierType
EEK_INVALID_KEYCODE EEK_INVALID_KEYCODE
EekSymbolMatrix
EekPoint EekPoint
eek_point_get_type
eek_point_copy
eek_point_free
eek_point_rotate
EekBounds EekBounds
eek_bounds_get_type
eek_bounds_copy
eek_bounds_free
eek_bounds_long_side
EekOutline EekOutline
eek_outline_get_type
eek_outline_copy
eek_outline_free
EekColor 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_get_type
eek_symbol_matrix_new eek_symbol_matrix_new
eek_symbol_matrix_copy eek_symbol_matrix_copy
eek_symbol_matrix_free eek_symbol_matrix_free
eek_point_get_type eek_symbol_matrix_set_symbol
eek_point_rotate eek_symbol_matrix_get_symbol
eek_bounds_get_type
eek_bounds_long_side
eek_outline_get_type
eek_outline_copy
eek_outline_free
eek_color_get_type
eek_color_new
</SECTION> </SECTION>

View File

@ -88,13 +88,15 @@ libeek_marshalers_sources = \
BUILT_SOURCES = \ BUILT_SOURCES = \
$(libeek_keysym_sources) \ $(libeek_keysym_sources) \
$(libeek_enumtypes_sources) \
$(libeek_marshalers_sources) $(libeek_marshalers_sources)
libeek_la_SOURCES = \ libeek_la_SOURCES = \
$(libeek_sources) \ $(libeek_sources) \
$(srcdir)/eek-enumtypes.c \
$(srcdir)/eek-marshalers.c $(srcdir)/eek-marshalers.c
libeek_la_CFLAGS = $(GIO2_CFLAGS) $(PANGOCAIRO_CFLAGS) $(LIBCROCO_CFLAGS) libeek_la_CFLAGS = -DEEK_COMPILATION=1 $(GIO2_CFLAGS) $(PANGOCAIRO_CFLAGS) $(LIBCROCO_CFLAGS)
libeek_la_LIBADD = $(GIO2_LIBS) $(PANGOCAIRO_LIBS) $(LIBCROCO_LIBS) -lm libeek_la_LIBADD = $(GIO2_LIBS) $(PANGOCAIRO_LIBS) $(LIBCROCO_LIBS) -lm
if ENABLE_CLUTTER if ENABLE_CLUTTER
@ -114,7 +116,7 @@ libeek_clutter_sources = \
$(srcdir)/eek-clutter-renderer.c $(srcdir)/eek-clutter-renderer.c
libeek_clutter_la_SOURCES = $(libeek_clutter_sources) libeek_clutter_la_SOURCES = $(libeek_clutter_sources)
libeek_clutter_la_CFLAGS = $(CLUTTER_CFLAGS) libeek_clutter_la_CFLAGS = -DEEK_COMPILATION=1 $(CLUTTER_CFLAGS)
libeek_clutter_la_LIBADD = libeek.la $(CLUTTER_LIBS) libeek_clutter_la_LIBADD = libeek.la $(CLUTTER_LIBS)
endif endif
@ -128,7 +130,7 @@ 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 = $(GTK_CFLAGS) libeek_gtk_la_CFLAGS = -DEEK_COMPILATION=1 $(GTK_CFLAGS)
libeek_gtk_la_LIBADD = libeek.la $(GTK_LIBS) libeek_gtk_la_LIBADD = libeek.la $(GTK_LIBS)
libeek_xkb_public_headers = \ libeek_xkb_public_headers = \
@ -139,7 +141,7 @@ libeek_xkb_sources = \
$(srcdir)/eek-xkb-layout.c $(srcdir)/eek-xkb-layout.c
libeek_xkb_la_SOURCES = $(libeek_xkb_sources) libeek_xkb_la_SOURCES = $(libeek_xkb_sources)
libeek_xkb_la_CFLAGS = $(XKB_CFLAGS) $(GTK_CFLAGS) libeek_xkb_la_CFLAGS = -DEEK_COMPILATION=1 $(XKB_CFLAGS) $(GTK_CFLAGS)
libeek_xkb_la_LIBADD = libeek.la $(XKB_LIBS) $(GTK_LIBS) libeek_xkb_la_LIBADD = libeek.la $(XKB_LIBS) $(GTK_LIBS)
libeek_xkl_public_headers = \ libeek_xkl_public_headers = \
@ -150,12 +152,13 @@ libeek_xkl_sources = \
$(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 = $(LIBXKLAVIER_CFLAGS) $(GTK_CFLAGS) libeek_xkl_la_CFLAGS = -DEEK_COMPILATION=1 $(LIBXKLAVIER_CFLAGS) $(GTK_CFLAGS)
libeek_xkl_la_LIBADD = libeek-xkb.la $(LIBXKLAVIER_LIBS) $(GTK_LIBS) libeek_xkl_la_LIBADD = libeek-xkb.la $(LIBXKLAVIER_LIBS) $(GTK_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 \
$(libeek_clutter_public_headers) \ $(libeek_clutter_public_headers) \
$(libeek_gtk_public_headers) \ $(libeek_gtk_public_headers) \
$(libeek_xkb_public_headers) \ $(libeek_xkb_public_headers) \
@ -175,6 +178,16 @@ eek-unicode-keysym-entries.h: unicode-keysym-entries.txt
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 < $< > $@ $(PYTHON) ./gen-keysym-entries.py xkeysym_keysym_entries < $< > $@
eek-enumtypes.h: $(libeek_public_headers) eek-enumtypes.h.template
$(AM_V_GEN) $(GLIB_MKENUMS) --template eek-enumtypes.h.template \
$(libeek_public_headers) > eek-enumtypes.h.tmp && \
mv eek-enumtypes.h.tmp eek-enumtypes.h
eek-enumtypes.c: $(libeek_public_headers) eek-enumtypes.c.template
$(AM_V_GEN) $(GLIB_MKENUMS) --template eek-enumtypes.c.template \
$(libeek_public_headers) > eek-enumtypes.c.tmp && \
mv eek-enumtypes.c.tmp eek-enumtypes.c
# gen marshal # gen marshal
eek-marshalers.h: eek-marshalers.list eek-marshalers.h: eek-marshalers.list
$(AM_V_GEN) $(GLIB_GENMARSHAL) --prefix=_eek_marshal $(srcdir)/eek-marshalers.list --header --internal > $@.tmp && \ $(AM_V_GEN) $(GLIB_GENMARSHAL) --prefix=_eek_marshal $(srcdir)/eek-marshalers.list --header --internal > $@.tmp && \
@ -207,6 +220,8 @@ EXTRA_DIST = \
special-keysym-entries.txt \ special-keysym-entries.txt \
unicode-keysym-entries.txt \ unicode-keysym-entries.txt \
xkeysym-keysym-entries.txt \ xkeysym-keysym-entries.txt \
eek-enumtypes.h.template \
eek-enumtypes.c.template \
eek-marshalers.list eek-marshalers.list
-include $(INTROSPECTION_MAKEFILE) -include $(INTROSPECTION_MAKEFILE)
@ -221,7 +236,7 @@ Eek@EEK_LIBRARY_SUFFIX_U@_gir_SCANNERFLAGS = --strip-prefix=Eek --pkg=glib-2.0
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) 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_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@

View File

@ -23,8 +23,8 @@ includedir=@includedir@
Name: EEK Name: EEK
Description: A Library to Create Keyboard-like UI Description: A Library to Create Keyboard-like UI
URL: http://ueno.github.com/eekboard/ URL: http://fedorahosted.org/eekboard/
Version: @VERSION@ Version: @VERSION@
Requires: gobject-2.0 Requires: gobject-2.0 gio-2.0
Libs: -L${libdir} -leek Libs: -L${libdir} -leek
Cflags: -I${includedir}/eek-@EEK_API_VERSION@ Cflags: -I${includedir}/eek-@EEK_API_VERSION@

View File

@ -23,7 +23,7 @@ includedir=@includedir@
Name: libeek-clutter Name: libeek-clutter
Description: A Library to Create Keyboard-like UI (Clutter Support) Description: A Library to Create Keyboard-like UI (Clutter Support)
URL: http://ueno.github.com/eekboard/ URL: http://fedorahosted.org/eekboard/
Version: @VERSION@ Version: @VERSION@
Requires: eek-@EEK_API_VERSION@ clutter-1.0 Requires: eek-@EEK_API_VERSION@ clutter-1.0
Libs: -L${libdir} -leek-clutter Libs: -L${libdir} -leek-clutter

View File

@ -17,6 +17,11 @@
* 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 !defined(__EEK_H_INSIDE__) && !defined(EEK_COMPILATION)
#error "Only <eek/eek-clutter.h> can be included directly."
#endif
#ifndef EEK_CLUTTER_KEYBOARD_H #ifndef EEK_CLUTTER_KEYBOARD_H
#define EEK_CLUTTER_KEYBOARD_H 1 #define EEK_CLUTTER_KEYBOARD_H 1

View File

@ -249,7 +249,7 @@ eek_container_init (EekContainer *self)
/** /**
* eek_container_foreach_child: * eek_container_foreach_child:
* @container: an #EekContainer * @container: an #EekContainer
* @callback: an #EekCallback * @callback: (scope call): an #EekCallback
* @user_data: additional data passed to @callback * @user_data: additional data passed to @callback
* *
* Enumerate children of @container and run @callback with each child. * Enumerate children of @container and run @callback with each child.

View File

@ -17,6 +17,11 @@
* 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 !defined(__EEK_H_INSIDE__) && !defined(EEK_COMPILATION)
#error "Only <eek/eek.h> can be included directly."
#endif
#ifndef EEK_CONTAINER_H #ifndef EEK_CONTAINER_H
#define EEK_CONTAINER_H 1 #define EEK_CONTAINER_H 1
@ -34,6 +39,14 @@ G_BEGIN_DECLS
typedef struct _EekContainerClass EekContainerClass; typedef struct _EekContainerClass EekContainerClass;
typedef struct _EekContainerPrivate EekContainerPrivate; typedef struct _EekContainerPrivate EekContainerPrivate;
/**
* EekCallback:
* @element: an #EekElement
* @user_data: user-supplied data
*
* The type of the callback function used for iterating over the
* children of a container, see eek_container_foreach_child().
*/
typedef void (*EekCallback) (EekElement *element, gpointer user_data); typedef void (*EekCallback) (EekElement *element, gpointer user_data);
typedef gint (*EekCompareFunc) (EekElement *element, gpointer user_data); typedef gint (*EekCompareFunc) (EekElement *element, gpointer user_data);

View File

@ -17,6 +17,11 @@
* 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 !defined(__EEK_H_INSIDE__) && !defined(EEK_COMPILATION)
#error "Only <eek/eek.h> can be included directly."
#endif
#ifndef EEK_ELEMENT_H #ifndef EEK_ELEMENT_H
#define EEK_ELEMENT_H 1 #define EEK_ELEMENT_H 1

View File

@ -0,0 +1,36 @@
/*** BEGIN file-header ***/
#include "eek.h"
/*** END file-header ***/
/*** BEGIN file-production ***/
/* enumerations from "@filename@" */
/*** END file-production ***/
/*** BEGIN value-header ***/
GType
@enum_name@_get_type (void)
{
static volatile gsize g_define_type_id__volatile = 0;
if (g_once_init_enter (&g_define_type_id__volatile))
{
static const G@Type@Value values[] = {
/*** END value-header ***/
/*** BEGIN value-production ***/
{ @VALUENAME@, "@VALUENAME@", "@valuenick@" },
/*** END value-production ***/
/*** BEGIN value-tail ***/
{ 0, NULL, NULL }
};
GType g_define_type_id =
g_@type@_register_static (g_intern_static_string ("@EnumName@"), values);
g_once_init_leave (&g_define_type_id__volatile, g_define_type_id);
}
return g_define_type_id__volatile;
}
/*** END value-tail ***/

View File

@ -0,0 +1,29 @@
/*** BEGIN file-header ***/
#if !defined(__EEK_H_INSIDE__) && !defined(EEK_COMPILATION)
#error "Only <eek/eek.h> can be included directly."
#endif
#ifndef __EEK_ENUMTYPES_H__
#define __EEK_ENUMTYPES_H__
#include <glib-object.h>
G_BEGIN_DECLS
/*** END file-header ***/
/*** BEGIN file-production ***/
/* enumerations from "@filename@" */
/*** END file-production ***/
/*** BEGIN value-header ***/
GType @enum_name@_get_type (void) G_GNUC_CONST;
#define @ENUMPREFIX@_TYPE_@ENUMSHORT@ (@enum_name@_get_type ())
/*** END value-header ***/
/*** BEGIN file-tail ***/
G_END_DECLS
#endif /* __EEK_ENUMTYPES_H__ */
/*** END file-tail ***/

View File

@ -23,7 +23,7 @@ includedir=@includedir@
Name: libeek-gtk Name: libeek-gtk
Description: A Library to Create Keyboard-like UI (GTK Support) Description: A Library to Create Keyboard-like UI (GTK Support)
URL: http://ueno.github.com/eekboard/ URL: http://fedorahosted.org/eekboard/
Version: @VERSION@ Version: @VERSION@
Requires: eek-@EEK_API_VERSION@ gtk+-@GTK_API_VERSION@ Requires: eek-@EEK_API_VERSION@ gtk+-@GTK_API_VERSION@
Libs: -L${libdir} -leek-gtk Libs: -L${libdir} -leek-gtk

View File

@ -201,20 +201,32 @@ eek_gtk_keyboard_real_button_press_event (GtkWidget *self,
return TRUE; return TRUE;
} }
static gboolean static void
eek_gtk_keyboard_real_button_release_event (GtkWidget *self, clear_dragged_key (EekGtkKeyboard *keyboard)
GdkEventButton *event)
{ {
EekGtkKeyboardPrivate *priv = EEK_GTK_KEYBOARD_GET_PRIVATE(self); EekGtkKeyboardPrivate *priv = EEK_GTK_KEYBOARD_GET_PRIVATE(keyboard);
if (priv->dragged_key) { if (priv->dragged_key) {
g_signal_emit_by_name (priv->dragged_key, "released", priv->keyboard); g_signal_emit_by_name (priv->dragged_key, "released", priv->keyboard);
priv->dragged_key = NULL; priv->dragged_key = NULL;
} }
}
static gboolean
eek_gtk_keyboard_real_button_release_event (GtkWidget *self,
GdkEventButton *event)
{
clear_dragged_key (EEK_GTK_KEYBOARD(self));
return TRUE; return TRUE;
} }
static void
eek_gtk_keyboard_real_unmap (GtkWidget *self)
{
clear_dragged_key (EEK_GTK_KEYBOARD(self));
GTK_WIDGET_CLASS (eek_gtk_keyboard_parent_class)->unmap (self);
}
static void static void
eek_gtk_keyboard_set_keyboard (EekGtkKeyboard *self, eek_gtk_keyboard_set_keyboard (EekGtkKeyboard *self,
EekKeyboard *keyboard) EekKeyboard *keyboard)
@ -308,6 +320,7 @@ eek_gtk_keyboard_class_init (EekGtkKeyboardClass *klass)
sizeof (EekGtkKeyboardPrivate)); sizeof (EekGtkKeyboardPrivate));
widget_class->realize = eek_gtk_keyboard_real_realize; widget_class->realize = eek_gtk_keyboard_real_realize;
widget_class->unmap = eek_gtk_keyboard_real_unmap;
#if GTK_CHECK_VERSION (2, 91, 2) #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) */ #else /* GTK_CHECK_VERSION (2, 91, 2) */
@ -434,6 +447,7 @@ on_key_released (EekKeyboard *keyboard,
large_bounds.width, large_bounds.width,
large_bounds.height); large_bounds.height);
cairo_clip (cr); cairo_clip (cr);
eek_renderer_render_keyboard (priv->renderer, cr); eek_renderer_render_keyboard (priv->renderer, cr);
cairo_set_operator (cr, CAIRO_OPERATOR_CLEAR); cairo_set_operator (cr, CAIRO_OPERATOR_CLEAR);
cairo_destroy (cr); cairo_destroy (cr);

View File

@ -17,6 +17,11 @@
* 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 !defined(__EEK_H_INSIDE__) && !defined(EEK_COMPILATION)
#error "Only <eek/eek-gtk.h> can be included directly."
#endif
#ifndef EEK_GTK_KEYBOARD_H #ifndef EEK_GTK_KEYBOARD_H
#define EEK_GTK_KEYBOARD_H 1 #define EEK_GTK_KEYBOARD_H 1

View File

@ -557,9 +557,9 @@ eek_key_get_symbol_matrix (EekKey *key)
/** /**
* eek_key_get_symbol: * eek_key_get_symbol:
* @key: an #EekKey * @key: an #EekKey
* @returns: (transfer none): the current #EekSymbol or %NULL on failure
* *
* Get the current symbol of @key. * Get the current symbol of @key.
* Return value: (transfer none): the current #EekSymbol or %NULL on failure
*/ */
EekSymbol * EekSymbol *
eek_key_get_symbol (EekKey *key) eek_key_get_symbol (EekKey *key)
@ -572,9 +572,9 @@ eek_key_get_symbol (EekKey *key)
* @key: an #EekKey * @key: an #EekKey
* @fallback_group: fallback group index * @fallback_group: fallback group index
* @fallback_level: fallback level index * @fallback_level: fallback level index
* @returns: (transfer none): the current #EekSymbol or %NULL on failure
* *
* Get the current symbol of @key. * Get the current symbol of @key.
* Return value: (transfer none): the current #EekSymbol or %NULL on failure
*/ */
EekSymbol * EekSymbol *
eek_key_get_symbol_with_fallback (EekKey *key, eek_key_get_symbol_with_fallback (EekKey *key,
@ -628,9 +628,9 @@ eek_key_get_symbol_with_fallback (EekKey *key,
* @level: level index of the symbol matrix * @level: level index of the symbol matrix
* @fallback_group: fallback group index * @fallback_group: fallback group index
* @fallback_level: fallback level index * @fallback_level: fallback level index
* @returns: (transfer none): an #EekSymbol at (@group, @level), or %NULL
* *
* Get the symbol at (@group, @level) in the symbol matrix of @key. * Get the symbol at (@group, @level) in the symbol matrix of @key.
* Return value: (transfer none): an #EekSymbol at (@group, @level), or %NULL
*/ */
EekSymbol * EekSymbol *
eek_key_get_symbol_at_index (EekKey *key, eek_key_get_symbol_at_index (EekKey *key,

View File

@ -17,6 +17,11 @@
* 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 !defined(__EEK_H_INSIDE__) && !defined(EEK_COMPILATION)
#error "Only <eek/eek.h> can be included directly."
#endif
#ifndef EEK_KEY_H #ifndef EEK_KEY_H
#define EEK_KEY_H 1 #define EEK_KEY_H 1

View File

@ -36,6 +36,7 @@
#include "eek-key.h" #include "eek-key.h"
#include "eek-symbol.h" #include "eek-symbol.h"
#include "eek-serializable.h" #include "eek-serializable.h"
#include "eek-enumtypes.h"
enum { enum {
PROP_0, PROP_0,
@ -274,7 +275,7 @@ eek_keyboard_set_property (GObject *object,
break; break;
case PROP_MODIFIER_BEHAVIOR: case PROP_MODIFIER_BEHAVIOR:
eek_keyboard_set_modifier_behavior (EEK_KEYBOARD(object), eek_keyboard_set_modifier_behavior (EEK_KEYBOARD(object),
g_value_get_int (value)); g_value_get_enum (value));
break; break;
default: default:
g_object_set_property (object, g_object_set_property (object,
@ -297,7 +298,7 @@ eek_keyboard_get_property (GObject *object,
g_value_set_object (value, priv->layout); g_value_set_object (value, priv->layout);
break; break;
case PROP_MODIFIER_BEHAVIOR: case PROP_MODIFIER_BEHAVIOR:
g_value_set_int (value, g_value_set_enum (value,
eek_keyboard_get_modifier_behavior (EEK_KEYBOARD(object))); eek_keyboard_get_modifier_behavior (EEK_KEYBOARD(object)));
break; break;
default: default:
@ -465,10 +466,11 @@ eek_keyboard_class_init (EekKeyboardClass *klass)
* *
* The modifier handling mode of #EekKeyboard. * The modifier handling mode of #EekKeyboard.
*/ */
pspec = g_param_spec_int ("modifier-behavior", pspec = g_param_spec_enum ("modifier-behavior",
"Modifier behavior", "Modifier behavior",
"Modifier handling mode of the keyboard", "Modifier handling mode of the keyboard",
0, G_MAXINT, EEK_MODIFIER_BEHAVIOR_NONE, EEK_TYPE_MODIFIER_BEHAVIOR,
EEK_MODIFIER_BEHAVIOR_NONE,
G_PARAM_READWRITE); G_PARAM_READWRITE);
g_object_class_install_property (gobject_class, g_object_class_install_property (gobject_class,
PROP_MODIFIER_BEHAVIOR, PROP_MODIFIER_BEHAVIOR,
@ -658,9 +660,9 @@ eek_keyboard_create_section (EekKeyboard *keyboard)
* eek_keyboard_find_key_by_keycode: * eek_keyboard_find_key_by_keycode:
* @keyboard: an #EekKeyboard * @keyboard: an #EekKeyboard
* @keycode: a keycode * @keycode: a keycode
* @returns: (transfer none): #EekKey whose keycode is @keycode
* *
* Find an #EekKey whose keycode is @keycode. * Find an #EekKey whose keycode is @keycode.
* Return value: (transfer none): #EekKey whose keycode is @keycode
*/ */
EekKey * EekKey *
eek_keyboard_find_key_by_keycode (EekKeyboard *keyboard, eek_keyboard_find_key_by_keycode (EekKeyboard *keyboard,

View File

@ -17,6 +17,11 @@
* 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 !defined(__EEK_H_INSIDE__) && !defined(EEK_COMPILATION)
#error "Only <eek/eek.h> can be included directly."
#endif
#ifndef EEK_KEYBOARD_H #ifndef EEK_KEYBOARD_H
#define EEK_KEYBOARD_H 1 #define EEK_KEYBOARD_H 1
@ -104,6 +109,7 @@ 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 void eek_keyboard_set_symbol_index
(EekKeyboard *keyboard, (EekKeyboard *keyboard,
gint group, gint group,
@ -112,7 +118,6 @@ void eek_keyboard_get_symbol_index
(EekKeyboard *keyboard, (EekKeyboard *keyboard,
gint *group, gint *group,
gint *level); gint *level);
void eek_keyboard_set_group void eek_keyboard_set_group
(EekKeyboard *keyboard, (EekKeyboard *keyboard,
gint group); gint group);
@ -123,6 +128,7 @@ gint eek_keyboard_get_group
(EekKeyboard *keyboard); (EekKeyboard *keyboard);
gint eek_keyboard_get_level gint eek_keyboard_get_level
(EekKeyboard *keyboard); (EekKeyboard *keyboard);
#endif /* EEK_DISABLE_DEPRECATED */
void eek_keyboard_set_modifier_behavior void eek_keyboard_set_modifier_behavior
(EekKeyboard *keyboard, (EekKeyboard *keyboard,

View File

@ -223,7 +223,8 @@ eek_keysym_init (EekKeysym *self)
* modifier @modifier_mask. * modifier @modifier_mask.
*/ */
EekKeysym * EekKeysym *
eek_keysym_new_with_modifier (guint xkeysym, EekModifierType modifier_mask) eek_keysym_new_with_modifier (guint xkeysym,
EekModifierType modifier_mask)
{ {
EekKeysym *keysym; EekKeysym *keysym;
EekKeysymPrivate *priv; EekKeysymPrivate *priv;

View File

@ -17,6 +17,11 @@
* 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 !defined(__EEK_H_INSIDE__) && !defined(EEK_COMPILATION)
#error "Only <eek/eek.h> can be included directly."
#endif
#ifndef EEK_KEYSYM_H #ifndef EEK_KEYSYM_H
#define EEK_KEYSYM_H 1 #define EEK_KEYSYM_H 1

View File

@ -18,6 +18,10 @@
* 02110-1301 USA * 02110-1301 USA
*/ */
#if !defined(__EEK_H_INSIDE__) && !defined(EEK_COMPILATION)
#error "Only <eek/eek.h> can be included directly."
#endif
#ifndef EEK_LAYOUT_H #ifndef EEK_LAYOUT_H
#define EEK_LAYOUT_H 1 #define EEK_LAYOUT_H 1

View File

@ -482,7 +482,6 @@ render_key (EekRenderer *self,
PangoLayout *layout; PangoLayout *layout;
PangoRectangle extents = { 0, }; PangoRectangle extents = { 0, };
EekColor foreground; EekColor foreground;
EekThemeNode *theme_node;
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);
@ -494,11 +493,6 @@ render_key (EekRenderer *self,
(bounds.width * priv->scale - extents.width / PANGO_SCALE) / 2, (bounds.width * priv->scale - extents.width / PANGO_SCALE) / 2,
(bounds.height * priv->scale - extents.height / PANGO_SCALE) / 2); (bounds.height * priv->scale - extents.height / PANGO_SCALE) / 2);
if (eek_key_is_pressed (key))
theme_node = g_object_get_data (G_OBJECT(key), "theme-node-pressed");
else
theme_node = g_object_get_data (G_OBJECT(key), "theme-node");
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,
foreground.red, foreground.red,
@ -570,7 +564,7 @@ eek_renderer_real_render_key_label (EekRenderer *self,
EekBounds bounds; EekBounds bounds;
const TextProperty *prop; const TextProperty *prop;
PangoFontDescription *font; PangoFontDescription *font;
gdouble size, scale; gdouble scale;
symbol = eek_key_get_symbol_with_fallback (key, 0, 0); symbol = eek_key_get_symbol_with_fallback (key, 0, 0);
if (!symbol) if (!symbol)
@ -653,6 +647,7 @@ eek_renderer_real_render_keyboard (EekRenderer *self,
cairo_t *cr) cairo_t *cr)
{ {
EekRendererPrivate *priv = EEK_RENDERER_GET_PRIVATE(self); EekRendererPrivate *priv = EEK_RENDERER_GET_PRIVATE(self);
cairo_pattern_t *source;
g_return_if_fail (priv->keyboard); g_return_if_fail (priv->keyboard);
g_return_if_fail (priv->allocation_width > 0.0); g_return_if_fail (priv->allocation_width > 0.0);
@ -662,6 +657,8 @@ eek_renderer_real_render_keyboard (EekRenderer *self,
priv->keyboard_surface = create_keyboard_surface (self); priv->keyboard_surface = create_keyboard_surface (self);
cairo_set_source_surface (cr, priv->keyboard_surface, 0.0, 0.0); cairo_set_source_surface (cr, priv->keyboard_surface, 0.0, 0.0);
source = cairo_get_source (cr);
cairo_pattern_set_extend (source, CAIRO_EXTEND_PAD);
cairo_paint (cr); cairo_paint (cr);
} }
@ -1141,7 +1138,6 @@ eek_renderer_get_background_gradient (EekRenderer *renderer,
EekColor *start, EekColor *start,
EekColor *end) EekColor *end)
{ {
EekRendererPrivate *priv;
EekThemeNode *theme_node; EekThemeNode *theme_node;
g_return_if_fail (EEK_IS_RENDERER(renderer)); g_return_if_fail (EEK_IS_RENDERER(renderer));
@ -1150,8 +1146,6 @@ eek_renderer_get_background_gradient (EekRenderer *renderer,
g_return_if_fail (start); g_return_if_fail (start);
g_return_if_fail (end); g_return_if_fail (end);
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_gradient (theme_node, type, start, end); eek_theme_node_get_background_gradient (theme_node, type, start, end);
@ -1234,11 +1228,8 @@ find_key_by_position_section_callback (EekElement *element,
{ {
FindKeyByPositionCallbackData *data = user_data; FindKeyByPositionCallbackData *data = user_data;
EekBounds bounds; EekBounds bounds;
EekRendererPrivate *priv;
EekPoint origin; EekPoint origin;
priv = EEK_RENDERER_GET_PRIVATE(data->renderer);
origin = data->origin; origin = data->origin;
eek_element_get_bounds (element, &bounds); eek_element_get_bounds (element, &bounds);
data->origin.x += bounds.x; data->origin.x += bounds.x;

View File

@ -17,6 +17,11 @@
* 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 !defined(__EEK_H_INSIDE__) && !defined(EEK_COMPILATION)
#error "Only <eek/eek.h> can be included directly."
#endif
#ifndef EEK_SECTION_H #ifndef EEK_SECTION_H
#define EEK_SECTION_H 1 #define EEK_SECTION_H 1
@ -54,6 +59,8 @@ struct _EekSection
* @create_key: virtual function for creating key in the section * @create_key: virtual function for creating key in the section
* @find_key_by_keycode: virtual function for accessing a key in the * @find_key_by_keycode: virtual function for accessing a key in the
* section by keycode * section by keycode
* @key_pressed: class handler for #EekSection::key-pressed signal
* @key_released: class handler for #EekSection::key-released signal
*/ */
struct _EekSectionClass struct _EekSectionClass
{ {

View File

@ -16,6 +16,10 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
#if !defined(__EEK_H_INSIDE__) && !defined(EEK_COMPILATION)
#error "Only <eek/eek.h> can be included directly."
#endif
#ifndef EEK_SERIALIZABLE_H #ifndef EEK_SERIALIZABLE_H
#define EEK_SERIALIZABLE_H 1 #define EEK_SERIALIZABLE_H 1

View File

@ -39,6 +39,7 @@ struct _EekSymbolMatrix
EekSymbol **data; EekSymbol **data;
}; };
#define EEK_TYPE_SYMBOL_MATRIX (eek_symbol_matrix_get_type ())
GType eek_symbol_matrix_get_type (void) G_GNUC_CONST; GType eek_symbol_matrix_get_type (void) G_GNUC_CONST;
EekSymbolMatrix *eek_symbol_matrix_new (gint num_groups, EekSymbolMatrix *eek_symbol_matrix_new (gint num_groups,
gint num_levels); gint num_levels);

View File

@ -31,6 +31,7 @@
#include "eek-symbol.h" #include "eek-symbol.h"
#include "eek-serializable.h" #include "eek-serializable.h"
#include "eek-enumtypes.h"
enum { enum {
PROP_0, PROP_0,
@ -110,11 +111,11 @@ eek_symbol_set_property (GObject *object,
eek_symbol_set_label (EEK_SYMBOL(object), g_value_get_string (value)); eek_symbol_set_label (EEK_SYMBOL(object), g_value_get_string (value));
break; break;
case PROP_CATEGORY: case PROP_CATEGORY:
eek_symbol_set_category (EEK_SYMBOL(object), g_value_get_uint (value)); eek_symbol_set_category (EEK_SYMBOL(object), g_value_get_enum (value));
break; break;
case PROP_MODIFIER_MASK: case PROP_MODIFIER_MASK:
eek_symbol_set_modifier_mask (EEK_SYMBOL(object), eek_symbol_set_modifier_mask (EEK_SYMBOL(object),
g_value_get_uint (value)); g_value_get_flags (value));
break; break;
case PROP_ICON_NAME: case PROP_ICON_NAME:
eek_symbol_set_icon_name (EEK_SYMBOL(object), eek_symbol_set_icon_name (EEK_SYMBOL(object),
@ -142,10 +143,10 @@ eek_symbol_get_property (GObject *object,
g_value_set_string (value, eek_symbol_get_label (EEK_SYMBOL(object))); g_value_set_string (value, eek_symbol_get_label (EEK_SYMBOL(object)));
break; break;
case PROP_CATEGORY: case PROP_CATEGORY:
g_value_set_uint (value, eek_symbol_get_category (EEK_SYMBOL(object))); g_value_set_enum (value, eek_symbol_get_category (EEK_SYMBOL(object)));
break; break;
case PROP_MODIFIER_MASK: case PROP_MODIFIER_MASK:
g_value_set_uint (value, g_value_set_flags (value,
eek_symbol_get_modifier_mask (EEK_SYMBOL(object))); eek_symbol_get_modifier_mask (EEK_SYMBOL(object)));
break; break;
case PROP_ICON_NAME: case PROP_ICON_NAME:
@ -197,17 +198,19 @@ eek_symbol_class_init (EekSymbolClass *klass)
G_PARAM_CONSTRUCT | G_PARAM_READWRITE); G_PARAM_CONSTRUCT | G_PARAM_READWRITE);
g_object_class_install_property (gobject_class, PROP_LABEL, pspec); g_object_class_install_property (gobject_class, PROP_LABEL, pspec);
pspec = g_param_spec_uint ("category", pspec = g_param_spec_enum ("category",
"Category", "Category",
"Category of the symbol", "Category of the symbol",
0, G_MAXUINT, 0, EEK_TYPE_SYMBOL_CATEGORY,
EEK_SYMBOL_CATEGORY_UNKNOWN,
G_PARAM_CONSTRUCT | G_PARAM_READWRITE); G_PARAM_CONSTRUCT | G_PARAM_READWRITE);
g_object_class_install_property (gobject_class, PROP_CATEGORY, pspec); g_object_class_install_property (gobject_class, PROP_CATEGORY, pspec);
pspec = g_param_spec_uint ("modifier-mask", pspec = g_param_spec_flags ("modifier-mask",
"Modifier mask", "Modifier mask",
"Modifier mask of the symbol", "Modifier mask of the symbol",
0, G_MAXUINT, 0, EEK_TYPE_MODIFIER_TYPE,
0,
G_PARAM_CONSTRUCT | G_PARAM_READWRITE); G_PARAM_CONSTRUCT | G_PARAM_READWRITE);
g_object_class_install_property (gobject_class, PROP_MODIFIER_MASK, pspec); g_object_class_install_property (gobject_class, PROP_MODIFIER_MASK, pspec);
@ -361,8 +364,9 @@ eek_symbol_get_category (EekSymbol *symbol)
/** /**
* eek_symbol_set_modifier_mask: * eek_symbol_set_modifier_mask:
* @symbol: an #EekSymbol * @symbol: an #EekSymbol
* @mask: an #EekModifierType
* *
* Set modifier mask @symbol can trigger. * Set modifier mask that @symbol can trigger.
*/ */
void void
eek_symbol_set_modifier_mask (EekSymbol *symbol, eek_symbol_set_modifier_mask (EekSymbol *symbol,
@ -380,7 +384,7 @@ eek_symbol_set_modifier_mask (EekSymbol *symbol,
* eek_symbol_get_modifier_mask: * eek_symbol_get_modifier_mask:
* @symbol: an #EekSymbol * @symbol: an #EekSymbol
* *
* Get modifier mask @symbol can trigger. * Get modifier mask that @symbol can trigger.
*/ */
EekModifierType EekModifierType
eek_symbol_get_modifier_mask (EekSymbol *symbol) eek_symbol_get_modifier_mask (EekSymbol *symbol)

View File

@ -17,6 +17,11 @@
* 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 !defined(__EEK_H_INSIDE__) && !defined(EEK_COMPILATION)
#error "Only <eek/eek.h> can be included directly."
#endif
#ifndef EEK_SYMBOL_H #ifndef EEK_SYMBOL_H
#define EEK_SYMBOL_H 1 #define EEK_SYMBOL_H 1
@ -36,6 +41,7 @@ G_BEGIN_DECLS
* @EEK_SYMBOL_CATEGORY_USER3: reserved for future use * @EEK_SYMBOL_CATEGORY_USER3: reserved for future use
* @EEK_SYMBOL_CATEGORY_USER4: reserved for future use * @EEK_SYMBOL_CATEGORY_USER4: reserved for future use
* @EEK_SYMBOL_CATEGORY_UNKNOWN: used for error reporting * @EEK_SYMBOL_CATEGORY_UNKNOWN: used for error reporting
* @EEK_SYMBOL_CATEGORY_LAST: the last symbol category
* *
* Category of the key symbols. * Category of the key symbols.
*/ */
@ -49,7 +55,6 @@ typedef enum {
EEK_SYMBOL_CATEGORY_USER3, EEK_SYMBOL_CATEGORY_USER3,
EEK_SYMBOL_CATEGORY_USER4, EEK_SYMBOL_CATEGORY_USER4,
EEK_SYMBOL_CATEGORY_UNKNOWN, EEK_SYMBOL_CATEGORY_UNKNOWN,
/*< private >*/
EEK_SYMBOL_CATEGORY_LAST = EEK_SYMBOL_CATEGORY_UNKNOWN EEK_SYMBOL_CATEGORY_LAST = EEK_SYMBOL_CATEGORY_UNKNOWN
} EekSymbolCategory; } EekSymbolCategory;

View File

@ -121,7 +121,8 @@ eek_theme_context_changed (EekThemeContext *context)
/** /**
* eek_theme_context_set_theme: * eek_theme_context_set_theme:
* @context: a #EekThemeContext * @context: an #EekThemeContext
* @theme: an #EekTheme
* *
* Sets the default set of theme stylesheets for the context. This theme will * Sets the default set of theme stylesheets for the context. This theme will
* be used for the root node and for nodes descending from it, unless some other * be used for the root node and for nodes descending from it, unless some other

View File

@ -28,7 +28,7 @@
G_BEGIN_DECLS G_BEGIN_DECLS
/** /**
* SECTION:EekThemeContext * SECTION:eek-theme-context
* @short_description: holds global information about a tree of styled objects * @short_description: holds global information about a tree of styled objects
* *
* #EekThemeContext is responsible for managing information global to * #EekThemeContext is responsible for managing information global to

View File

@ -26,12 +26,12 @@
G_BEGIN_DECLS G_BEGIN_DECLS
/** /**
* SECTION:EekThemeNode * SECTION:eek-theme-node
* @short_description: style information for one node in a tree of * @short_description: style information for one node in a tree of
* themed objects * themed objects
* *
* A #EekThemeNode represents the CSS style information (the set of * The #EekThemeNode class represents the CSS style information (the
* CSS properties) for one node in a tree of themed objects. In * set of CSS properties) for one node in a tree of themed objects. In
* typical usage, it represents the style information for a single * typical usage, it represents the style information for a single
* #EekElement. A #EekThemeNode is immutable: attributes such as the * #EekElement. A #EekThemeNode is immutable: attributes such as the
* CSS classes for the node are passed in at construction. If the * CSS classes for the node are passed in at construction. If the

View File

@ -1,4 +1,9 @@
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */ /* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
#if !defined(__EEK_H_INSIDE__) && !defined(EEK_COMPILATION)
#error "Only <eek/eek.h> can be included directly."
#endif
#ifndef __EEK_THEME_H__ #ifndef __EEK_THEME_H__
#define __EEK_THEME_H__ #define __EEK_THEME_H__

View File

@ -33,31 +33,20 @@
#include "eek-types.h" #include "eek-types.h"
/* EekPoint */ /* EekPoint */
static EekPoint * G_DEFINE_BOXED_TYPE(EekPoint, eek_point, eek_point_copy, eek_point_free);
EekPoint *
eek_point_copy (const EekPoint *point) eek_point_copy (const EekPoint *point)
{ {
return g_slice_dup (EekPoint, point); return g_slice_dup (EekPoint, point);
} }
static void void
eek_point_free (EekPoint *point) eek_point_free (EekPoint *point)
{ {
g_slice_free (EekPoint, point); g_slice_free (EekPoint, point);
} }
GType
eek_point_get_type (void)
{
static GType our_type = 0;
if (our_type == 0)
our_type =
g_boxed_type_register_static ("EekPoint",
(GBoxedCopyFunc)eek_point_copy,
(GBoxedFreeFunc)eek_point_free);
return our_type;
}
void void
eek_point_rotate (EekPoint *point, gint angle) eek_point_rotate (EekPoint *point, gint angle)
{ {
@ -71,32 +60,24 @@ eek_point_rotate (EekPoint *point, gint angle)
} }
/* EekBounds */ /* EekBounds */
static EekBounds * G_DEFINE_BOXED_TYPE(EekBounds, eek_bounds, eek_bounds_copy, eek_bounds_free);
EekBounds *
eek_bounds_copy (const EekBounds *bounds) eek_bounds_copy (const EekBounds *bounds)
{ {
return g_slice_dup (EekBounds, bounds); return g_slice_dup (EekBounds, bounds);
} }
static void void
eek_bounds_free (EekBounds *bounds) eek_bounds_free (EekBounds *bounds)
{ {
g_slice_free (EekBounds, bounds); g_slice_free (EekBounds, bounds);
} }
GType
eek_bounds_get_type (void)
{
static GType our_type = 0;
if (our_type == 0)
our_type =
g_boxed_type_register_static ("EekBounds",
(GBoxedCopyFunc)eek_bounds_copy,
(GBoxedFreeFunc)eek_bounds_free);
return our_type;
}
/* EekOutline */ /* EekOutline */
G_DEFINE_BOXED_TYPE(EekOutline, eek_outline,
eek_outline_copy, eek_outline_free);
EekOutline * EekOutline *
eek_outline_copy (const EekOutline *outline) eek_outline_copy (const EekOutline *outline)
{ {
@ -115,20 +96,9 @@ eek_outline_free (EekOutline *outline)
g_slice_free (EekOutline, outline); g_slice_free (EekOutline, outline);
} }
GType
eek_outline_get_type (void)
{
static GType our_type = 0;
if (our_type == 0)
our_type =
g_boxed_type_register_static ("EekOutline",
(GBoxedCopyFunc)eek_outline_copy,
(GBoxedFreeFunc)eek_outline_free);
return our_type;
}
/* EekColor */ /* EekColor */
G_DEFINE_BOXED_TYPE(EekColor, eek_color, eek_color_copy, eek_color_free);
EekColor * EekColor *
eek_color_copy (const EekColor *color) eek_color_copy (const EekColor *color)
{ {
@ -141,19 +111,6 @@ eek_color_free (EekColor *color)
g_slice_free (EekColor, color); g_slice_free (EekColor, color);
} }
GType
eek_color_get_type (void)
{
static GType our_type = 0;
if (our_type == 0)
our_type =
g_boxed_type_register_static ("EekColor",
(GBoxedCopyFunc)eek_color_copy,
(GBoxedFreeFunc)eek_color_free);
return our_type;
}
EekColor * EekColor *
eek_color_new (gdouble red, eek_color_new (gdouble red,
gdouble green, gdouble green,

View File

@ -17,6 +17,11 @@
* 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 !defined(__EEK_H_INSIDE__) && !defined(EEK_COMPILATION)
#error "Only <eek/eek.h> can be included directly."
#endif
#ifndef EEK_TYPES_H #ifndef EEK_TYPES_H
#define EEK_TYPES_H 1 #define EEK_TYPES_H 1
@ -26,7 +31,6 @@ G_BEGIN_DECLS
#define I_(string) g_intern_static_string (string) #define I_(string) g_intern_static_string (string)
#define EEK_TYPE_SYMBOL_MATRIX (eek_symbol_matrix_get_type ())
#define EEK_TYPE_POINT (eek_point_get_type ()) #define EEK_TYPE_POINT (eek_point_get_type ())
#define EEK_TYPE_BOUNDS (eek_bounds_get_type ()) #define EEK_TYPE_BOUNDS (eek_bounds_get_type ())
#define EEK_TYPE_OUTLINE (eek_outline_get_type ()) #define EEK_TYPE_OUTLINE (eek_outline_get_type ())
@ -141,7 +145,6 @@ typedef struct _EekThemeContext EekThemeContext;
typedef struct _EekThemeNode EekThemeNode; typedef struct _EekThemeNode EekThemeNode;
typedef struct _EekSymbolMatrix EekSymbolMatrix; typedef struct _EekSymbolMatrix EekSymbolMatrix;
typedef struct _EekPoint EekPoint;
typedef struct _EekBounds EekBounds; typedef struct _EekBounds EekBounds;
typedef struct _EekOutline EekOutline; typedef struct _EekOutline EekOutline;
typedef struct _EekColor EekColor; typedef struct _EekColor EekColor;
@ -153,6 +156,7 @@ typedef struct _EekColor EekColor;
* *
* 2D vertex * 2D vertex
*/ */
typedef struct _EekPoint EekPoint;
struct _EekPoint struct _EekPoint
{ {
gdouble x; gdouble x;
@ -160,6 +164,8 @@ struct _EekPoint
}; };
GType eek_point_get_type (void) G_GNUC_CONST; GType eek_point_get_type (void) G_GNUC_CONST;
EekPoint *eek_point_copy (const EekPoint *point);
void eek_point_free (EekPoint *point);
void eek_point_rotate (EekPoint *point, void eek_point_rotate (EekPoint *point,
gint angle); gint angle);
@ -174,7 +180,6 @@ void eek_point_rotate (EekPoint *point,
*/ */
struct _EekBounds struct _EekBounds
{ {
/*< public >*/
gdouble x; gdouble x;
gdouble y; gdouble y;
gdouble width; gdouble width;
@ -182,6 +187,8 @@ struct _EekBounds
}; };
GType eek_bounds_get_type (void) G_GNUC_CONST; GType eek_bounds_get_type (void) G_GNUC_CONST;
EekBounds *eek_bounds_copy (const EekBounds *bounds);
void eek_bounds_free (EekBounds *bounds);
G_INLINE_FUNC gdouble G_INLINE_FUNC gdouble
eek_bounds_long_side (EekBounds *bounds) eek_bounds_long_side (EekBounds *bounds)

View File

@ -23,7 +23,7 @@ includedir=@includedir@
Name: libeek-xkb Name: libeek-xkb
Description: A Library to Create Keyboard-like UI (XKB Support) Description: A Library to Create Keyboard-like UI (XKB Support)
URL: http://ueno.github.com/eekboard/ URL: http://fedorahosted.org/eekboard/
Version: @VERSION@ Version: @VERSION@
Requires: eek-@EEK_API_VERSION@ gtk+-x11-@GTK_API_VERSION@ Requires: eek-@EEK_API_VERSION@ gtk+-x11-@GTK_API_VERSION@
Libs: -L${libdir} -leek-xkb Libs: -L${libdir} -leek-xkb

View File

@ -127,7 +127,7 @@ create_key (EekXkbLayout *layout,
EekSymbolMatrix *matrix = NULL; EekSymbolMatrix *matrix = NULL;
gchar name[XkbKeyNameLength + 1]; gchar name[XkbKeyNameLength + 1];
KeyCode keycode; KeyCode keycode;
gint num_groups, num_levels, num_symbols; gint num_groups, num_levels;
gulong oref; gulong oref;
xkbgeometry = priv->xkb->geom; xkbgeometry = priv->xkb->geom;
@ -199,7 +199,6 @@ create_key (EekXkbLayout *layout,
num_groups = XkbKeyNumGroups (priv->xkb, keycode); num_groups = XkbKeyNumGroups (priv->xkb, keycode);
num_levels = XkbKeyGroupsWidth (priv->xkb, keycode); num_levels = XkbKeyGroupsWidth (priv->xkb, keycode);
num_symbols = num_groups * num_levels;
matrix = eek_symbol_matrix_new (num_groups, num_levels); matrix = eek_symbol_matrix_new (num_groups, num_levels);
for (i = 0; i < num_groups; i++) for (i = 0; i < num_groups; i++)
for (j = 0; j < num_levels; j++) { for (j = 0; j < num_levels; j++) {

View File

@ -17,6 +17,11 @@
* 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 !defined(__EEK_H_INSIDE__) && !defined(EEK_COMPILATION)
#error "Only <eek/eek-xkb.h> can be included directly."
#endif
#ifndef EEK_XKB_LAYOUT_H #ifndef EEK_XKB_LAYOUT_H
#define EEK_XKB_LAYOUT_H 1 #define EEK_XKB_LAYOUT_H 1

View File

@ -23,7 +23,7 @@ includedir=@includedir@
Name: libeek-xkl Name: libeek-xkl
Description: A Library to Create Keyboard-like UI (Libxklavier Support) Description: A Library to Create Keyboard-like UI (Libxklavier Support)
URL: http://ueno.github.com/eekboard/ URL: http://fedorahosted.org/eekboard/
Version: @VERSION@ Version: @VERSION@
Requires: eek-xkb-@EEK_API_VERSION@ libxklavier Requires: eek-xkb-@EEK_API_VERSION@ libxklavier
Libs: -L${libdir} -leek-xkl Libs: -L${libdir} -leek-xkl

View File

@ -17,6 +17,11 @@
* 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 !defined(__EEK_H_INSIDE__) && !defined(EEK_COMPILATION)
#error "Only <eek/eek-xkl.h> can be included directly."
#endif
#ifndef EEK_XKL_LAYOUT_H #ifndef EEK_XKL_LAYOUT_H
#define EEK_XKL_LAYOUT_H 1 #define EEK_XKL_LAYOUT_H 1

View File

@ -590,6 +590,10 @@ eek_xml_layout_real_create_keyboard (EekLayout *self,
if (data.oref_outline_hash) if (data.oref_outline_hash)
g_hash_table_destroy (data.oref_outline_hash); g_hash_table_destroy (data.oref_outline_hash);
/* use pre-defined modifier mask here */
eek_keyboard_set_num_lock_mask (data.keyboard, EEK_MOD2_MASK);
eek_keyboard_set_alt_gr_mask (data.keyboard, EEK_MOD5_MASK);
return data.keyboard; return data.keyboard;
} }

View File

@ -16,6 +16,10 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
#if !defined(__EEK_H_INSIDE__) && !defined(EEK_COMPILATION)
#error "Only <eek/eek.h> can be included directly."
#endif
#ifndef EEK_XML_LAYOUT_H #ifndef EEK_XML_LAYOUT_H
#define EEK_XML_LAYOUT_H 1 #define EEK_XML_LAYOUT_H 1

View File

@ -16,6 +16,10 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
#if !defined(__EEK_H_INSIDE__) && !defined(EEK_COMPILATION)
#error "Only <eek/eek.h> can be included directly."
#endif
#ifndef EEK_XML_H #ifndef EEK_XML_H
#define EEK_XML_H 1 #define EEK_XML_H 1

View File

@ -20,6 +20,8 @@
#ifndef EEK_H #ifndef EEK_H
#define EEK_H 1 #define EEK_H 1
#define __EEK_H_INSIDE__ 1
#include "eek-keyboard.h" #include "eek-keyboard.h"
#include "eek-section.h" #include "eek-section.h"
#include "eek-key.h" #include "eek-key.h"

View File

@ -47,6 +47,8 @@
0xFFE5 "⇪" EEK_SYMBOL_CATEGORY_KEYNAME 0xFFE5 "⇪" EEK_SYMBOL_CATEGORY_KEYNAME
0xFFE9 "Alt" EEK_SYMBOL_CATEGORY_KEYNAME 0xFFE9 "Alt" EEK_SYMBOL_CATEGORY_KEYNAME
0xFFEA "Alt" EEK_SYMBOL_CATEGORY_KEYNAME 0xFFEA "Alt" EEK_SYMBOL_CATEGORY_KEYNAME
0xFFE7 "Meta" EEK_SYMBOL_CATEGORY_KEYNAME
0xFFE8 "Meta" EEK_SYMBOL_CATEGORY_KEYNAME
0xFFEB "Super" EEK_SYMBOL_CATEGORY_KEYNAME 0xFFEB "Super" EEK_SYMBOL_CATEGORY_KEYNAME
0xFFEC "Super" EEK_SYMBOL_CATEGORY_KEYNAME 0xFFEC "Super" EEK_SYMBOL_CATEGORY_KEYNAME
0xFFED "Hyper" EEK_SYMBOL_CATEGORY_KEYNAME 0xFFED "Hyper" EEK_SYMBOL_CATEGORY_KEYNAME

View File

@ -27,7 +27,7 @@ libeekboard_sources = \
eekboard-context.c eekboard-context.c
libeekboard_la_SOURCES = $(libeekboard_sources) libeekboard_la_SOURCES = $(libeekboard_sources)
libeekboard_la_CFLAGS = -I$(top_srcdir) $(GIO2_CFLAGS) libeekboard_la_CFLAGS = -DEEKBOARD_COMPILATION=1 -I$(top_srcdir) $(GIO2_CFLAGS)
libeekboard_la_LIBADD = $(top_builddir)/eek/libeek.la $(GIO2_LIBS) libeekboard_la_LIBADD = $(top_builddir)/eek/libeek.la $(GIO2_LIBS)
eekboarddir = $(includedir)/eekboard-$(EEK_API_VERSION)/eekboard eekboarddir = $(includedir)/eekboard-$(EEK_API_VERSION)/eekboard

View File

@ -25,6 +25,6 @@ Name: Eekboard
Description: A Library to Create Keyboard-like UI Description: A Library to Create Keyboard-like UI
URL: http://ueno.github.com/eekboard/ URL: http://ueno.github.com/eekboard/
Version: @VERSION@ Version: @VERSION@
Requires: gobject-2.0 Requires: eek-@EEK_API_VERSION@
Libs: -L${libdir} -leek Libs: -L${libdir} -leek
Cflags: -I${includedir}/eekboard-@EEK_API_VERSION@ Cflags: -I${includedir}/eekboard-@EEK_API_VERSION@

View File

@ -368,9 +368,9 @@ eekboard_context_new (GDBusConnection *connection,
g_initable_new (EEKBOARD_TYPE_CONTEXT, g_initable_new (EEKBOARD_TYPE_CONTEXT,
cancellable, cancellable,
&error, &error,
"g-name", "com.redhat.Eekboard.Server", "g-name", "org.fedorahosted.Eekboard.Server",
"g-connection", connection, "g-connection", connection,
"g-interface-name", "com.redhat.Eekboard.Context", "g-interface-name", "org.fedorahosted.Eekboard.Context",
"g-object-path", object_path, "g-object-path", object_path,
NULL); NULL);
if (initable != NULL) { if (initable != NULL) {

View File

@ -15,6 +15,11 @@
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
#if !defined(__EEKBOARD_H_INSIDE__) && !defined(EEKBOARD_COMPILATION)
#error "Only <eekboard/eekboard.h> can be included directly."
#endif
#ifndef EEKBOARD_CONTEXT_H #ifndef EEKBOARD_CONTEXT_H
#define EEKBOARD_CONTEXT_H 1 #define EEKBOARD_CONTEXT_H 1

View File

@ -143,9 +143,9 @@ eekboard_eekboard_new (GDBusConnection *connection,
cancellable, cancellable,
&error, &error,
"g-connection", connection, "g-connection", connection,
"g-name", "com.redhat.Eekboard.Server", "g-name", "org.fedorahosted.Eekboard.Server",
"g-interface-name", "com.redhat.Eekboard.Server", "g-interface-name", "org.fedorahosted.Eekboard.Server",
"g-object-path", "/com/redhat/Eekboard/Server", "g-object-path", "/org/fedorahosted/Eekboard/Server",
NULL); NULL);
if (initable != NULL) { if (initable != NULL) {
EekboardEekboard *eekboard = EEKBOARD_EEKBOARD (initable); EekboardEekboard *eekboard = EEKBOARD_EEKBOARD (initable);

View File

@ -15,6 +15,11 @@
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
#if !defined(__EEKBOARD_H_INSIDE__) && !defined(EEKBOARD_COMPILATION)
#error "Only <eekboard/eekboard.h> can be included directly."
#endif
#ifndef EEKBOARD_EEKBOARD_H #ifndef EEKBOARD_EEKBOARD_H
#define EEKBOARD_EEKBOARD_H 1 #define EEKBOARD_EEKBOARD_H 1

View File

@ -18,6 +18,8 @@
#ifndef EEKBOARD_H #ifndef EEKBOARD_H
#define EEKBOARD_H 1 #define EEKBOARD_H 1
#define __EEKBOARD_H_INSIDE__ 1
#include "eekboard/eekboard-eekboard.h" #include "eekboard/eekboard-eekboard.h"
#include "eekboard/eekboard-context.h" #include "eekboard/eekboard-context.h"

View File

@ -18,7 +18,8 @@
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
# 02110-1301 USA # 02110-1301 USA
import gobject, gtk, eekboard, virtkey import eekboard
import gobject, gtk, virtkey
import sys, os.path, re import sys, os.path, re
KEYCODE_TABLE = { KEYCODE_TABLE = {
@ -33,6 +34,36 @@ KEYCODE_TABLE = {
MARK_UPPER = '~!@#$%^&*()_+{}|:"<>?' MARK_UPPER = '~!@#$%^&*()_+{}|:"<>?'
MARK_LOWER = '`1234567890-=[]\\;\',./' MARK_LOWER = '`1234567890-=[]\\;\',./'
INSCRIPT_MAPS = (
"as-inscript",
"bn-inscript",
"gu-inscript",
"hi-inscript",
"kn-inscript",
"ml-inscript",
"mr-inscript",
"or-inscript",
"pa-inscript",
"sd-inscript",
"ta-inscript",
"te-inscript",
"kn-inscript2",
"kok-inscript2-deva",
"mai-inscript2",
"ml-inscript2",
"mni-inscript2-beng",
"mni-inscript2-mtei",
"mr-inscript2",
"ne-inscript2-deva",
"or-inscript2",
"pa-inscript2-guru",
"sa-inscript2",
"sat-inscript2-deva",
"sat-inscript2-olck",
"sd-inscript2-deva",
"ta-inscript2",
"te-inscript2")
class MapFile(object): class MapFile(object):
MAPENTRY_PATTERN = re.compile(r'\A\s*\((?:\((.*?)\)|"(.*?)")\s*"(.*?)"\)') MAPENTRY_PATTERN = re.compile(r'\A\s*\((?:\((.*?)\)|"(.*?)")\s*"(.*?)"\)')

View File

@ -19,14 +19,25 @@
import inscript import inscript
import gtk import gtk
from optparse import OptionParser from optparse import OptionParser
import sys, os import sys, os, os.path, glob
parser = OptionParser() parser = OptionParser()
parser.add_option("-n", "--name=LANGCODE", dest="langcode", parser.add_option("-n", "--name=LANGCODE", dest="langcode",
help="Specify language code to LANGCODE", help="Specify language code to LANGCODE",
metavar="LANGCODE") metavar="LANGCODE")
parser.add_option("-l", "--list", dest="list", default=False,
action="store_true",
help="List available language codes")
(options, args) = parser.parse_args() (options, args) = parser.parse_args()
if options.list:
pat = os.path.join(os.getenv("M17N_DIR"), "*.mim")
for fname in sorted(glob.glob(pat)):
mname = os.path.basename(fname[:-4])
if mname in inscript.INSCRIPT_MAPS:
print mname
exit(0)
if options.langcode is None: if options.langcode is None:
print >> sys.stderr, "Specify language code with -n" print >> sys.stderr, "Specify language code with -n"
exit(1) exit(1)

View File

@ -16,7 +16,6 @@
# 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_EEKBOARD
bin_PROGRAMS = \ bin_PROGRAMS = \
eekboard \ eekboard \
eekboard-server \ eekboard-server \
@ -28,9 +27,9 @@ eekboard_CFLAGS = \
-I$(top_srcdir) \ -I$(top_srcdir) \
$(GIO2_CFLAGS) \ $(GIO2_CFLAGS) \
$(GTK_CFLAGS) \ $(GTK_CFLAGS) \
$(GCONF2_CFLAGS) \
$(XKB_CFLAGS) \ $(XKB_CFLAGS) \
$(LIBXKLAVIER_CFLAGS) $(LIBXKLAVIER_CFLAGS) \
-DKEYBOARDDIR=\"$(pkgdatadir)/keyboards\"
eekboard_LDADD = \ eekboard_LDADD = \
$(builddir)/libxklutil.la \ $(builddir)/libxklutil.la \
@ -39,22 +38,28 @@ eekboard_LDADD = \
$(top_builddir)/eek/libeek-xkl.la \ $(top_builddir)/eek/libeek-xkl.la \
$(GIO2_LIBS) \ $(GIO2_LIBS) \
$(GTK_LIBS) \ $(GTK_LIBS) \
$(GCONF2_LIBS) \
$(XKB_LIBS) \ $(XKB_LIBS) \
$(LIBXKLAVIER_LIBS) $(LIBXKLAVIER_LIBS)
if ENABLE_FAKEKEY if ENABLE_XTEST
eekboard_CFLAGS += \ eekboard_CFLAGS += \
$(FAKEKEY_CFLAGS) $(XTEST_CFLAGS)
eekboard_LDADD += \ eekboard_LDADD += \
$(FAKEKEY_LIBS) $(XTEST_LIBS)
endif endif
if ENABLE_CSPI if ENABLE_ATSPI
eekboard_CFLAGS += \ eekboard_CFLAGS += \
$(CSPI_CFLAGS) $(ATSPI2_CFLAGS)
eekboard_LDADD += \ eekboard_LDADD += \
$(CSPI_LIBS) $(ATSPI2_LIBS)
endif
if ENABLE_IBUS
eekboard_CFLAGS += \
$(IBUS_CFLAGS)
eekboard_LDADD += \
$(IBUS_LIBS)
endif endif
eekboard_headers = client.h eekboard_headers = client.h
@ -73,9 +78,14 @@ eekboard_server_LDADD = \
$(GIO2_LIBS) \ $(GIO2_LIBS) \
$(GTK_LIBS) $(GTK_LIBS)
if ENABLE_CLUTTER if ENABLE_CLUTTER_GTK
eekboard_server_CFLAGS += $(CLUTTER_CFLAGS) $(CLUTTER_GTK_CFLAGS) eekboard_server_CFLAGS += $(CLUTTER_GTK_CFLAGS)
eekboard_server_LDADD += $(CLUTTER_LIBS) $(top_builddir)/eek/libeek-clutter.la $(CLUTTER_GTK_LIBS) eekboard_server_LDADD += $(top_builddir)/eek/libeek-clutter.la $(CLUTTER_GTK_LIBS)
endif
if ENABLE_XDOCK
eekboard_server_CFLAGS += $(XDOCK_CFLAGS)
eekboard_server_LDADD += $(XDOCK_LIBS)
endif endif
eekboard_server_headers = server-server.h server-context.h eekboard_server_headers = server-server.h server-context.h
@ -117,14 +127,3 @@ noinst_HEADERS = \
$(eekboard_server_headers) \ $(eekboard_server_headers) \
$(eekboard_xml_headers) \ $(eekboard_xml_headers) \
$(libxklutil_la_headers) $(libxklutil_la_headers)
EXTRA_DIST = $(service_in_files)
DISTCLEANFILES = $(service_DATA)
servicedir = $(datadir)/dbus-1/services
service_in_files = eekboard-server.service.in
service_DATA = $(service_in_files:.service.in=.service)
$(service_DATA): $(service_in_files) Makefile
$(AM_V_GEN) sed -e "s|\@bindir\@|$(bindir)|" $< > $@
endif

View File

@ -20,21 +20,29 @@
#endif /* HAVE_CONFIG_H */ #endif /* HAVE_CONFIG_H */
#include <stdlib.h> #include <stdlib.h>
#include <cspi/spi.h> #ifdef HAVE_ATSPI
#include <dbus/dbus.h>
#include <atspi/atspi.h>
#endif /* HAVE_ATSPI */
#ifdef HAVE_IBUS
#include <ibus.h>
#endif /* HAVE_IBUS */
#include <gtk/gtk.h> #include <gtk/gtk.h>
#include <glib/gi18n.h> #include <glib/gi18n.h>
#include <gconf/gconf-client.h>
#include "eekboard/eekboard.h" #include "eekboard/eekboard.h"
#include "client.h" #include "client.h"
#define DEFAULT_LAYOUT "us-qwerty"
static gboolean opt_system = FALSE; static gboolean opt_system = FALSE;
static gboolean opt_session = FALSE; static gboolean opt_session = FALSE;
static gchar *opt_address = NULL; static gchar *opt_address = NULL;
#ifdef HAVE_CSPI static gboolean opt_use_system_layout = FALSE;
static gboolean opt_focus = FALSE; static gboolean opt_focus = FALSE;
static gboolean opt_keystroke = FALSE; static gboolean opt_keystroke = FALSE;
#endif /* HAVE_CSPI */
static gchar *opt_keyboard = NULL;
static gchar *opt_model = NULL; static gchar *opt_model = NULL;
static gchar *opt_layouts = NULL; static gchar *opt_layouts = NULL;
@ -49,12 +57,18 @@ static const GOptionEntry options[] = {
N_("Connect to the session bus")}, N_("Connect to the session bus")},
{"address", 'a', 0, G_OPTION_ARG_STRING, &opt_address, {"address", 'a', 0, G_OPTION_ARG_STRING, &opt_address,
N_("Connect to the given D-Bus address")}, N_("Connect to the given D-Bus address")},
#ifdef HAVE_CSPI {"use-system-layout", 'x', 0, G_OPTION_ARG_NONE, &opt_use_system_layout,
N_("Use system keyboard layout")},
#if ENABLE_FOCUS_LISTENER
{"listen-focus", 'f', 0, G_OPTION_ARG_NONE, &opt_focus, {"listen-focus", 'f', 0, G_OPTION_ARG_NONE, &opt_focus,
N_("Listen focus change events with AT-SPI")}, N_("Listen focus change events")},
#endif /* ENABLE_FOCUS_LISTENER */
#ifdef HAVE_ATSPI
{"listen-keystroke", 's', 0, G_OPTION_ARG_NONE, &opt_keystroke, {"listen-keystroke", 's', 0, G_OPTION_ARG_NONE, &opt_keystroke,
N_("Listen keystroke events with AT-SPI")}, N_("Listen keystroke events with AT-SPI")},
#endif /* HAVE_CSPI */ #endif /* HAVE_ATSPI */
{"keyboard", 'k', 0, G_OPTION_ARG_STRING, &opt_keyboard,
N_("Specify keyboard")},
{"model", '\0', 0, G_OPTION_ARG_STRING, &opt_model, {"model", '\0', 0, G_OPTION_ARG_STRING, &opt_model,
N_("Specify model")}, N_("Specify model")},
{"layouts", '\0', 0, G_OPTION_ARG_STRING, &opt_layouts, {"layouts", '\0', 0, G_OPTION_ARG_STRING, &opt_layouts,
@ -99,6 +113,12 @@ on_destroyed (EekboardEekboard *eekboard,
g_main_loop_quit (loop); g_main_loop_quit (loop);
} }
enum {
FOCUS_NONE,
FOCUS_ATSPI,
FOCUS_IBUS
};
int int
main (int argc, char **argv) main (int argc, char **argv)
{ {
@ -108,9 +128,10 @@ main (int argc, char **argv)
GBusType bus_type; GBusType bus_type;
GDBusConnection *connection; GDBusConnection *connection;
GError *error; GError *error;
GConfClient *gconfc;
GOptionContext *option_context; GOptionContext *option_context;
GMainLoop *loop; GMainLoop *loop;
gint focus;
GSettings *settings;
if (!gtk_init_check (&argc, &argv)) { if (!gtk_init_check (&argc, &argv)) {
g_printerr ("Can't init GTK\n"); g_printerr ("Can't init GTK\n");
@ -159,64 +180,128 @@ main (int argc, char **argv)
} }
client = eekboard_client_new (connection); client = eekboard_client_new (connection);
g_object_unref (connection);
if (client == NULL) { if (client == NULL) {
g_printerr ("Can't create a client\n"); g_printerr ("Can't create a client\n");
exit (1); exit (1);
} }
gconfc = gconf_client_get_default (); settings = g_settings_new ("org.fedorahosted.eekboard");
focus = FOCUS_NONE;
if (opt_focus) {
gchar *focus_listener = g_settings_get_string (settings,
"focus-listener");
#ifdef HAVE_CSPI if (g_strcmp0 (focus_listener, "atspi") == 0)
error = NULL; focus = FOCUS_ATSPI;
if (opt_focus || opt_keystroke) { else if (g_strcmp0 (focus_listener, "ibus") == 0)
if (gconf_client_get_bool (gconfc, focus = FOCUS_IBUS;
"/desktop/gnome/interface/accessibility", else {
&error) || g_printerr ("Unknown focus listener \"%s\". "
gconf_client_get_bool (gconfc, "Try \"atspi\" or \"ibus\"\n", focus_listener);
"/desktop/gnome/interface/accessibility2", g_object_unref (client);
&error)) { exit (1);
if (SPI_init () != 0) { }
g_printerr ("Can't init CSPI\n"); }
#ifdef HAVE_ATSPI
if (focus == FOCUS_ATSPI || opt_keystroke) {
GSettings *desktop_settings =
g_settings_new ("org.gnome.desktop.interface");
gboolean accessibility_enabled =
g_settings_get_boolean (settings, "toolkit-accessibility");
g_object_unref (desktop_settings);
if (accessibility_enabled) {
if (atspi_init () != 0) {
g_printerr ("Can't init AT-SPI 2\n");
g_object_unref (client);
exit (1); exit (1);
} }
if (opt_focus && if (focus == FOCUS_ATSPI &&
!eekboard_client_enable_cspi_focus (client)) { !eekboard_client_enable_atspi_focus (client)) {
g_printerr ("Can't register focus change event listeners\n"); g_printerr ("Can't register AT-SPI focus change event listeners\n");
g_object_unref (client);
exit (1); exit (1);
} }
if (opt_keystroke && if (opt_keystroke &&
!eekboard_client_enable_cspi_keystroke (client)) { !eekboard_client_enable_atspi_keystroke (client)) {
g_printerr ("Can't register keystroke event listeners\n"); g_printerr ("Can't register AT-SPI keystroke event listeners\n");
g_object_unref (client);
exit (1); exit (1);
} }
} else { } else {
g_printerr ("Desktop accessibility support is disabled\n"); g_printerr ("Desktop accessibility support is disabled\n");
g_object_unref (client);
exit (1); exit (1);
} }
} }
#endif /* HAVE_CSPI */ #endif /* HAVE_ATSPI */
if (opt_model || opt_layouts || opt_options) { #ifdef HAVE_IBUS
if (!eekboard_client_set_xkl_config (client, if (focus == FOCUS_IBUS) {
ibus_init ();
if (focus == FOCUS_IBUS &&
!eekboard_client_enable_ibus_focus (client)) {
g_printerr ("Can't register IBus focus change event listeners\n");
g_object_unref (client);
exit (1);
}
}
#endif /* HAVE_IBUS */
if (opt_use_system_layout && (opt_keyboard || opt_model || opt_layouts || opt_options)) {
g_printerr ("Can't use --use-system-layout option with keyboard options\n");
g_object_unref (client);
exit (1);
}
if (!eekboard_client_enable_xkl (client)) {
g_printerr ("Can't register xklavier event listeners\n");
g_object_unref (client);
exit (1);
}
if (opt_use_system_layout || opt_model || opt_layouts || opt_options) {
if (!eekboard_client_load_keyboard_from_xkl (client,
opt_model, opt_model,
opt_layouts, opt_layouts,
opt_options)) { opt_options)) {
g_printerr ("Can't set xklavier config\n"); g_printerr ("Can't load keyboard from xklavier config\n");
g_object_unref (client);
exit (1); exit (1);
} }
} else if (!eekboard_client_enable_xkl (client)) { } else {
g_printerr ("Can't register xklavier event listeners\n"); gchar *file;
gboolean success;
if (!opt_keyboard)
opt_keyboard = DEFAULT_LAYOUT;
if (g_str_has_suffix (opt_keyboard, ".xml"))
file = g_strdup (opt_keyboard);
else
file = g_strdup_printf ("%s/%s.xml", KEYBOARDDIR, opt_keyboard);
success = eekboard_client_load_keyboard_from_file (client, file);
g_free (file);
if (!success) {
g_printerr ("Can't load keyboard file %s\n", file);
g_object_unref (client);
exit (1); exit (1);
} }
}
#ifdef HAVE_FAKEKEY #ifdef HAVE_XTEST
if (!eekboard_client_enable_fakekey (client)) { if (!eekboard_client_enable_xtest (client)) {
g_printerr ("Can't init fakekey\n"); g_printerr ("Can't init xtest\n");
g_object_unref (client);
exit (1); exit (1);
} }
#endif /* HAVE_FAKEKEY */ #endif /* HAVE_XTEST */
loop = g_main_loop_new (NULL, FALSE); loop = g_main_loop_new (NULL, FALSE);
if (!opt_focus) { if (!opt_focus) {
@ -228,7 +313,8 @@ main (int argc, char **argv)
g_object_unref (context); g_object_unref (context);
} }
if (opt_fullscreen) { if (opt_fullscreen ||
g_settings_get_boolean (settings, "start-fullscreen")) {
g_object_get (client, "context", &context, NULL); g_object_get (client, "context", &context, NULL);
eekboard_context_set_fullscreen (context, TRUE, NULL); eekboard_context_set_fullscreen (context, TRUE, NULL);
g_object_unref (context); g_object_unref (context);
@ -240,6 +326,8 @@ main (int argc, char **argv)
g_main_loop_run (loop); g_main_loop_run (loop);
g_main_loop_unref (loop); g_main_loop_unref (loop);
g_object_unref (client);
g_object_unref (settings);
return 0; return 0;
} }

File diff suppressed because it is too large Load Diff

View File

@ -33,7 +33,12 @@ typedef struct _EekboardClient EekboardClient;
EekboardClient * eekboard_client_new (GDBusConnection *connection); EekboardClient * eekboard_client_new (GDBusConnection *connection);
gboolean eekboard_client_set_xkl_config (EekboardClient *client, gboolean eekboard_client_load_keyboard_from_file
(EekboardClient *client,
const gchar *file);
gboolean eekboard_client_load_keyboard_from_xkl
(EekboardClient *client,
const gchar *model, const gchar *model,
const gchar *layouts, const gchar *layouts,
const gchar *options); const gchar *options);
@ -41,18 +46,23 @@ gboolean eekboard_client_set_xkl_config (EekboardClient *client,
gboolean eekboard_client_enable_xkl (EekboardClient *client); gboolean eekboard_client_enable_xkl (EekboardClient *client);
void eekboard_client_disable_xkl (EekboardClient *client); void eekboard_client_disable_xkl (EekboardClient *client);
gboolean eekboard_client_enable_cspi_focus gboolean eekboard_client_enable_atspi_focus
(EekboardClient *client); (EekboardClient *client);
void eekboard_client_disable_cspi_focus void eekboard_client_disable_atspi_focus
(EekboardClient *client); (EekboardClient *client);
gboolean eekboard_client_enable_cspi_keystroke gboolean eekboard_client_enable_atspi_keystroke
(EekboardClient *client); (EekboardClient *client);
void eekboard_client_disable_cspi_keystroke void eekboard_client_disable_atspi_keystroke
(EekboardClient *client); (EekboardClient *client);
gboolean eekboard_client_enable_fakekey (EekboardClient *client); gboolean eekboard_client_enable_xtest (EekboardClient *client);
void eekboard_client_disable_fakekey (EekboardClient *client); void eekboard_client_disable_xtest (EekboardClient *client);
gboolean eekboard_client_enable_ibus_focus
(EekboardClient *client);
void eekboard_client_disable_ibus_focus
(EekboardClient *client);
G_END_DECLS G_END_DECLS
#endif /* EEKBOARD_CLIENT_H */ #endif /* EEKBOARD_CLIENT_H */

View File

@ -22,30 +22,34 @@
#include <gtk/gtk.h> #include <gtk/gtk.h>
#include <glib/gi18n.h> #include <glib/gi18n.h>
#include <X11/Xatom.h>
#include <gdk/gdkx.h>
#include "eek/eek.h" #include "eek/eek.h"
#if HAVE_CLUTTER_GTK #if HAVE_CLUTTER_GTK
#include <clutter-gtk/clutter-gtk.h> #include <clutter-gtk/clutter-gtk.h>
#include "eek/eek-clutter.h" #include "eek/eek-clutter.h"
#else /* HAVE_CLUTTER_GTK */ #endif
#include "eek/eek-gtk.h" #include "eek/eek-gtk.h"
#endif /* !HAVE_CLUTTER_GTK */
#include "server-context.h" #include "server-context.h"
#define CSW 640 #define CSW 640
#define CSH 480 #define CSH 480
#define DEFAULT_THEME (THEMEDIR "/default.css")
enum { enum {
PROP_0, PROP_0,
PROP_OBJECT_PATH, PROP_OBJECT_PATH,
PROP_CONNECTION, PROP_CONNECTION,
PROP_UI_TOOLKIT,
PROP_LAST PROP_LAST
}; };
static const gchar introspection_xml[] = static const gchar introspection_xml[] =
"<node>" "<node>"
" <interface name='com.redhat.Eekboard.Context'>" " <interface name='org.fedorahosted.Eekboard.Context'>"
" <method name='AddKeyboard'>" " <method name='AddKeyboard'>"
" <arg direction='in' type='v' name='keyboard'/>" " <arg direction='in' type='v' name='keyboard'/>"
" <arg direction='out' type='u' name='keyboard_id'/>" " <arg direction='out' type='u' name='keyboard_id'/>"
@ -85,6 +89,12 @@ static const gchar introspection_xml[] =
" </interface>" " </interface>"
"</node>"; "</node>";
typedef enum {
UI_TOOLKIT_GTK,
UI_TOOLKIT_CLUTTER,
UI_TOOLKIT_DEFAULT = UI_TOOLKIT_GTK
} ServerContextUIToolkitType;
typedef struct _ServerContextClass ServerContextClass; typedef struct _ServerContextClass ServerContextClass;
struct _ServerContext { struct _ServerContext {
@ -109,6 +119,9 @@ struct _ServerContext {
gulong key_pressed_handler; gulong key_pressed_handler;
gulong key_released_handler; gulong key_released_handler;
gulong notify_visible_handler; gulong notify_visible_handler;
GSettings *settings;
ServerContextUIToolkitType ui_toolkit;
}; };
struct _ServerContextClass { struct _ServerContextClass {
@ -141,7 +154,10 @@ on_allocation_changed (ClutterActor *stage,
ClutterAllocationFlags flags, ClutterAllocationFlags flags,
gpointer user_data) gpointer user_data)
{ {
ClutterActor *actor = user_data; ClutterActor *actor =
clutter_container_find_child_by_name (CLUTTER_CONTAINER(stage),
"keyboard");
clutter_actor_set_size (actor, clutter_actor_set_size (actor,
box->x2 - box->x1, box->x2 - box->x1,
box->y2 - box->y1); box->y2 - box->y1);
@ -181,7 +197,58 @@ on_notify_visible (GObject *object, GParamSpec *spec, gpointer user_data)
} }
static void static void
on_realize (GtkWidget *widget, on_realize_set_dock (GtkWidget *widget,
gpointer user_data)
{
#ifdef HAVE_XDOCK
GdkWindow *window = gtk_widget_get_window (widget);
Atom atoms[2] = { None, None };
gint x, y, width, height, depth;
long vals[12];
/* set window type to dock */
atoms[0] = XInternAtom (GDK_WINDOW_XDISPLAY (window),
"_NET_WM_WINDOW_TYPE_DOCK", False);
XChangeProperty (GDK_WINDOW_XDISPLAY (window),
GDK_WINDOW_XID (window),
XInternAtom (GDK_WINDOW_XDISPLAY (window),
"_NET_WM_WINDOW_TYPE", False),
XA_ATOM, 32, PropModeReplace,
(guchar *)atoms,
1);
/* set bottom strut */
#if GTK_CHECK_VERSION(3,0,0)
gdk_window_get_geometry (window, &x, &y, &width, &height);
#else
gdk_window_get_geometry (window, &x, &y, &width, &height, &depth);
#endif /* GTK_CHECK_VERSION(3,0,0) */
vals[0] = 0;
vals[1] = 0;
vals[2] = 0;
vals[3] = height;
vals[4] = 0;
vals[5] = 0;
vals[6] = 0;
vals[7] = 0;
vals[8] = 0;
vals[9] = 0;
vals[10] = x;
vals[11] = x + width;
XChangeProperty (GDK_WINDOW_XDISPLAY (window),
GDK_WINDOW_XID (window),
XInternAtom (GDK_WINDOW_XDISPLAY (window),
"_NET_WM_STRUT_PARTIAL", False),
XA_CARDINAL, 32, PropModeReplace,
(guchar *)vals, 12);
#endif /* HAVE_XDOCK */
}
static void
on_realize_set_non_maximizable (GtkWidget *widget,
gpointer user_data) gpointer user_data)
{ {
ServerContext *context = user_data; ServerContext *context = user_data;
@ -196,8 +263,6 @@ on_realize (GtkWidget *widget,
GDK_FUNC_CLOSE); GDK_FUNC_CLOSE);
} }
#define DEFAULT_THEME (THEMEDIR "/default.css")
static void static void
set_geometry (ServerContext *context) set_geometry (ServerContext *context)
{ {
@ -213,17 +278,36 @@ set_geometry (ServerContext *context)
gdk_screen_get_monitor_geometry (screen, monitor, &rect); gdk_screen_get_monitor_geometry (screen, monitor, &rect);
eek_element_get_bounds (EEK_ELEMENT(context->keyboard), &bounds); eek_element_get_bounds (EEK_ELEMENT(context->keyboard), &bounds);
g_signal_handlers_disconnect_by_func (context->window,
on_realize_set_dock,
context);
g_signal_handlers_disconnect_by_func (context->window,
on_realize_set_non_maximizable,
context);
if (context->fullscreen) { if (context->fullscreen) {
gint width = rect.width, height = rect.height / 2;
if (width * bounds.height > height * bounds.width)
width = (height / bounds.height) * bounds.width;
else
height = (width / bounds.width) * bounds.height;
gtk_widget_set_size_request (context->widget, width, height);
gtk_window_move (GTK_WINDOW(context->window),
(rect.width - width) / 2,
rect.height - height);
gtk_window_set_decorated (GTK_WINDOW(context->window), FALSE); gtk_window_set_decorated (GTK_WINDOW(context->window), FALSE);
gtk_window_set_resizable (GTK_WINDOW(context->window), FALSE); gtk_window_set_resizable (GTK_WINDOW(context->window), FALSE);
gtk_widget_set_size_request (context->widget,
rect.width,
rect.height / 2);
gtk_window_move (GTK_WINDOW(context->window),
0,
rect.height / 2);
gtk_window_set_opacity (GTK_WINDOW(context->window), 0.8); gtk_window_set_opacity (GTK_WINDOW(context->window), 0.8);
g_signal_connect_after (context->window, "realize",
G_CALLBACK(on_realize_set_dock),
context);
} else { } else {
if (context->ui_toolkit == UI_TOOLKIT_CLUTTER) {
#if HAVE_CLUTTER_GTK #if HAVE_CLUTTER_GTK
ClutterActor *stage = ClutterActor *stage =
gtk_clutter_embed_get_stage (GTK_CLUTTER_EMBED(context->widget)); gtk_clutter_embed_get_stage (GTK_CLUTTER_EMBED(context->widget));
@ -234,15 +318,20 @@ set_geometry (ServerContext *context)
g_signal_connect (stage, g_signal_connect (stage,
"allocation-changed", "allocation-changed",
G_CALLBACK(on_allocation_changed), G_CALLBACK(on_allocation_changed),
actor); NULL);
#else #else
g_return_if_reached ();
#endif
}
gtk_widget_set_size_request (context->widget, gtk_widget_set_size_request (context->widget,
bounds.width, bounds.width,
bounds.height); bounds.height);
#endif
gtk_window_move (GTK_WINDOW(context->window), gtk_window_move (GTK_WINDOW(context->window),
MAX(rect.width - 20 - bounds.width, 0), MAX(rect.width - 20 - bounds.width, 0),
MAX(rect.height - 40 - bounds.height, 0)); MAX(rect.height - 40 - bounds.height, 0));
g_signal_connect_after (context->window, "realize",
G_CALLBACK(on_realize_set_non_maximizable),
context);
} }
} }
@ -261,20 +350,26 @@ update_widget (ServerContext *context)
theme = eek_theme_new (DEFAULT_THEME, NULL, NULL); theme = eek_theme_new (DEFAULT_THEME, NULL, NULL);
eek_element_get_bounds (EEK_ELEMENT(context->keyboard), &bounds); eek_element_get_bounds (EEK_ELEMENT(context->keyboard), &bounds);
if (context->ui_toolkit == UI_TOOLKIT_CLUTTER) {
#if HAVE_CLUTTER_GTK #if HAVE_CLUTTER_GTK
context->widget = gtk_clutter_embed_new (); context->widget = gtk_clutter_embed_new ();
stage = gtk_clutter_embed_get_stage (GTK_CLUTTER_EMBED(context->widget)); stage = gtk_clutter_embed_get_stage (GTK_CLUTTER_EMBED(context->widget));
actor = eek_clutter_keyboard_new (context->keyboard); actor = eek_clutter_keyboard_new (context->keyboard);
clutter_actor_set_name (actor, "keyboard");
if (theme) if (theme)
eek_clutter_keyboard_set_theme (EEK_CLUTTER_KEYBOARD(actor), theme); eek_clutter_keyboard_set_theme (EEK_CLUTTER_KEYBOARD(actor), theme);
clutter_container_add_actor (CLUTTER_CONTAINER(stage), actor); clutter_container_add_actor (CLUTTER_CONTAINER(stage), actor);
clutter_stage_set_color (CLUTTER_STAGE(stage), &stage_color); clutter_stage_set_color (CLUTTER_STAGE(stage), &stage_color);
#else #else
g_return_if_reached ();
#endif
} else {
context->widget = eek_gtk_keyboard_new (context->keyboard); context->widget = eek_gtk_keyboard_new (context->keyboard);
if (theme) if (theme)
eek_gtk_keyboard_set_theme (EEK_GTK_KEYBOARD(context->widget), theme); eek_gtk_keyboard_set_theme (EEK_GTK_KEYBOARD(context->widget),
#endif theme);
}
if (!context->window) { if (!context->window) {
context->window = gtk_window_new (GTK_WINDOW_TOPLEVEL); context->window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
@ -292,13 +387,9 @@ update_widget (ServerContext *context)
_("Keyboard")); _("Keyboard"));
gtk_window_set_icon_name (GTK_WINDOW(context->window), "eekboard"); gtk_window_set_icon_name (GTK_WINDOW(context->window), "eekboard");
gtk_window_set_keep_above (GTK_WINDOW(context->window), TRUE); gtk_window_set_keep_above (GTK_WINDOW(context->window), TRUE);
g_signal_connect (context->window, "realize",
G_CALLBACK(on_realize), context);
set_geometry (context);
} }
gtk_container_add (GTK_CONTAINER(context->window), context->widget); gtk_container_add (GTK_CONTAINER(context->window), context->widget);
set_geometry (context);
} }
static void static void
@ -309,6 +400,7 @@ server_context_set_property (GObject *object,
{ {
ServerContext *context = SERVER_CONTEXT(object); ServerContext *context = SERVER_CONTEXT(object);
GDBusConnection *connection; GDBusConnection *connection;
const gchar *ui_toolkit;
switch (prop_id) { switch (prop_id) {
case PROP_OBJECT_PATH: case PROP_OBJECT_PATH:
@ -322,6 +414,17 @@ server_context_set_property (GObject *object,
g_object_unref (context->connection); g_object_unref (context->connection);
context->connection = g_object_ref (connection); context->connection = g_object_ref (connection);
break; break;
case PROP_UI_TOOLKIT:
ui_toolkit = g_value_get_string (value);
if (g_strcmp0 (ui_toolkit, "gtk") == 0)
context->ui_toolkit = UI_TOOLKIT_GTK;
#if HAVE_CLUTTER_GTK
else if (g_strcmp0 (ui_toolkit, "clutter") == 0)
context->ui_toolkit = UI_TOOLKIT_CLUTTER;
#endif /* HAVE_CLUTTER_GTK */
else
g_warning ("unknown UI toolkit %s", ui_toolkit);
break;
default: default:
g_object_set_property (object, g_object_set_property (object,
g_param_spec_get_name (pspec), g_param_spec_get_name (pspec),
@ -366,6 +469,11 @@ server_context_dispose (GObject *object)
context->introspection_data = NULL; context->introspection_data = NULL;
} }
if (context->settings) {
g_object_unref (context->settings);
context->settings = NULL;
}
G_OBJECT_CLASS (server_context_parent_class)->dispose (object); G_OBJECT_CLASS (server_context_parent_class)->dispose (object);
} }
@ -427,11 +535,30 @@ server_context_class_init (ServerContextClass *klass)
g_object_class_install_property (gobject_class, g_object_class_install_property (gobject_class,
PROP_CONNECTION, PROP_CONNECTION,
pspec); pspec);
pspec = g_param_spec_string ("ui-toolkit",
"UI toolkit",
"UI toolkit",
NULL,
G_PARAM_WRITABLE);
g_object_class_install_property (gobject_class,
PROP_UI_TOOLKIT,
pspec);
}
static void
on_monitors_changed (GdkScreen *screen,
gpointer user_data)
{
ServerContext *context = user_data;
if (context->window)
set_geometry (context);
} }
static void static void
server_context_init (ServerContext *context) server_context_init (ServerContext *context)
{ {
GdkScreen *screen;
GError *error; GError *error;
context->connection = NULL; context->connection = NULL;
@ -456,6 +583,19 @@ server_context_init (ServerContext *context)
context->window = NULL; context->window = NULL;
context->key_pressed_handler = 0; context->key_pressed_handler = 0;
context->key_released_handler = 0; context->key_released_handler = 0;
context->ui_toolkit = UI_TOOLKIT_DEFAULT;
context->settings = g_settings_new ("org.fedorahosted.eekboard");
g_settings_bind (context->settings, "ui-toolkit",
context, "ui-toolkit",
G_SETTINGS_BIND_GET);
screen = gdk_screen_get_default ();
g_signal_connect (screen,
"monitors-changed",
G_CALLBACK(on_monitors_changed),
context);
} }
static void static void

View File

@ -22,8 +22,8 @@
G_BEGIN_DECLS G_BEGIN_DECLS
#define SERVER_CONTEXT_PATH "/com/redhat/Eekboard/Context_%d" #define SERVER_CONTEXT_PATH "/org/fedorahosted/Eekboard/Context_%d"
#define SERVER_CONTEXT_INTERFACE "com.redhat.Eekboard.Context" #define SERVER_CONTEXT_INTERFACE "org.fedorahosted.Eekboard.Context"
#define SERVER_TYPE_CONTEXT (server_context_get_type()) #define SERVER_TYPE_CONTEXT (server_context_get_type())
#define SERVER_CONTEXT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), SERVER_TYPE_CONTEXT, ServerContext)) #define SERVER_CONTEXT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), SERVER_TYPE_CONTEXT, ServerContext))

View File

@ -40,7 +40,7 @@ static guint signals[LAST_SIGNAL] = { 0, };
static const gchar introspection_xml[] = static const gchar introspection_xml[] =
"<node>" "<node>"
" <interface name='com.redhat.Eekboard.Server'>" " <interface name='org.fedorahosted.Eekboard.Server'>"
" <method name='CreateContext'>" " <method name='CreateContext'>"
" <arg direction='in' type='s' name='client_name'/>" " <arg direction='in' type='s' name='client_name'/>"
" <arg direction='out' type='s' name='object_path'/>" " <arg direction='out' type='s' name='object_path'/>"

View File

@ -22,8 +22,8 @@
G_BEGIN_DECLS G_BEGIN_DECLS
#define SERVER_SERVER_PATH "/com/redhat/Eekboard/Server" #define SERVER_SERVER_PATH "/org/fedorahosted/Eekboard/Server"
#define SERVER_SERVER_INTERFACE "com.redhat.Eekboard.Server" #define SERVER_SERVER_INTERFACE "org.fedorahosted.Eekboard.Server"
#define SERVER_TYPE_SERVER (server_server_get_type()) #define SERVER_TYPE_SERVER (server_server_get_type())
#define SERVER_SERVER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), SERVER_TYPE_SERVER, ServerServer)) #define SERVER_SERVER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), SERVER_TYPE_SERVER, ServerServer))

View File

@ -26,7 +26,7 @@
#include <gdk/gdkx.h> #include <gdk/gdkx.h>
#include <glib/gi18n.h> #include <glib/gi18n.h>
#include "eek/eek-xml.h" #include "eek/eek.h"
#include "eek/eek-xkl.h" #include "eek/eek-xkl.h"
#if HAVE_CLUTTER_GTK #if HAVE_CLUTTER_GTK

View File

@ -25,7 +25,7 @@
#include "config.h" #include "config.h"
#endif /* HAVE_CONFIG_H */ #endif /* HAVE_CONFIG_H */
#include "eek/eek-xml.h" #include "eek/eek.h"
#include "eek/eek-xkl.h" #include "eek/eek-xkl.h"
static void static void