Compare commits

...

63 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
82 changed files with 2569 additions and 885 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.6], [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 fi
AM_CONDITIONAL(ENABLE_FAKEKEY, [test x$enable_fakekey = xyes]) AM_CONDITIONAL(ENABLE_XTEST, [test x$enable_xtest = xyes])
AC_MSG_RESULT($enable_fakekey) AC_MSG_RESULT($enable_xtest)
dnl use AT-SPI to capture focus/keystroke events dnl use X to mark the fullscreen window as dock
AC_MSG_CHECKING([whether you enable AT-SPI event handling]) AC_MSG_CHECKING([whether you enable X dock])
AC_ARG_ENABLE(cspi, AC_ARG_ENABLE(x-dock,
AS_HELP_STRING([--enable-cspi=no/yes], AS_HELP_STRING([--enable-x-dock=no/yes],
[Enable AT-SPI event handling default=yes]),, [Enable X dock default=yes]),
enable_cspi=yes) enable_x_dock=$enableval,
enable_x_dock=yes)
if test x$enable_cspi = xyes; then if test x$enable_x_dock = xyes; then
PKG_CHECK_MODULES([CSPI], [cspi-1.0], , PKG_CHECK_MODULES([XDOCK], [x], , enable_x_dock=no)
[AC_MSG_ERROR([AT-SPI C not found])]) if test x$enable_x_dock = xyes; then
AC_DEFINE([HAVE_CSPI], [1], [Define if CSPI is found]) 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 fi
AC_MSG_RESULT($enable_cspi)
AM_CONDITIONAL(ENABLE_CSPI, [test x$enable_cspi = xyes])
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 fi
enable_python="no (disabled, use --enable-python to enable)"
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,9 +1,34 @@
SUBDIRS = icons themes keyboards SUBDIRS = icons themes keyboards
@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 desktopdir = $(datadir)/applications
desktop_in_files = eekboard.desktop.in desktop_in_files = eekboard.desktop.in
desktop_DATA = $(desktop_in_files:.desktop.in=.desktop) 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@ @INTLTOOL_DESKTOP_RULE@
CLEANFILES = $(desktop_DATA) CLEANFILES = $(service_DATA) $(desktop_DATA) $(gsettings_SCHEMAS)
EXTRA_DIST = $(desktop_in_files) 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

@ -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

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

@ -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,27 @@
#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_keyboard = NULL;
@ -51,14 +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, {"keyboard", 'k', 0, G_OPTION_ARG_STRING, &opt_keyboard,
N_("Specify keyboard file")}, 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,
@ -103,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)
{ {
@ -112,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");
@ -163,74 +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_keyboard && (opt_model || opt_layouts || opt_options)) { #ifdef HAVE_IBUS
g_printerr ("Can't use --keyboard option with xklavier options\n"); 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); exit (1);
} }
if (opt_keyboard) { if (!eekboard_client_enable_xkl (client)) {
if (!eekboard_client_load_keyboard_from_file (client, opt_keyboard)) { g_printerr ("Can't register xklavier event listeners\n");
g_printerr ("Can't load keyboard\n"); g_object_unref (client);
exit (1); exit (1);
} }
} else if (opt_model || opt_layouts || opt_options) {
if (!eekboard_client_set_xkl_config (client, 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) {
@ -242,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);
@ -254,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;
} }

View File

@ -21,15 +21,21 @@
#include <libxklavier/xklavier.h> #include <libxklavier/xklavier.h>
#ifdef HAVE_CSPI #ifdef HAVE_ATSPI
#include <cspi/spi.h> #include <dbus/dbus.h>
#endif /* HAVE_CSPI */ #include <atspi/atspi.h>
#endif /* HAVE_ATSPI */
#include <gdk/gdkx.h> #include <gdk/gdkx.h>
#ifdef HAVE_FAKEKEY #ifdef HAVE_XTEST
#include <fakekey/fakekey.h> #include <X11/extensions/XTest.h>
#endif /* HAVE_FAKEKEY */ #include <X11/XKBlib.h>
#endif /* HAVE_XTEST */
#ifdef HAVE_IBUS
#include <ibus.h>
#endif /* HAVE_IBUS */
#include "eek/eek.h" #include "eek/eek.h"
#include "eek/eek-xkl.h" #include "eek/eek-xkl.h"
@ -37,6 +43,8 @@
#include "client.h" #include "client.h"
#include "xklutil.h" #include "xklutil.h"
#include <string.h>
#define CSW 640 #define CSW 640
#define CSH 480 #define CSH 480
@ -57,9 +65,10 @@ struct _EekboardClient {
EekboardContext *context; EekboardContext *context;
EekKeyboard *keyboard; EekKeyboard *keyboard;
GdkDisplay *display;
XklEngine *xkl_engine; XklEngine *xkl_engine;
XklConfigRegistry *xkl_config_registry; XklConfigRegistry *xkl_config_registry;
gboolean use_xkl_layout;
gint group;
gulong xkl_config_changed_handler; gulong xkl_config_changed_handler;
gulong xkl_state_changed_handler; gulong xkl_state_changed_handler;
@ -67,15 +76,25 @@ struct _EekboardClient {
gulong key_pressed_handler; gulong key_pressed_handler;
gulong key_released_handler; gulong key_released_handler;
#ifdef HAVE_CSPI gboolean follows_focus;
Accessible *acc; guint hide_keyboard_timeout_id;
AccessibleEventListener *focus_listener;
AccessibleEventListener *keystroke_listener;
#endif /* HAVE_CSPI */
#ifdef HAVE_FAKEKEY #ifdef HAVE_ATSPI
FakeKey *fakekey; AtspiAccessible *acc;
#endif /* HAVE_FAKEKEY */ AtspiDeviceListener *keystroke_listener;
#endif /* HAVE_ATSPI */
#ifdef HAVE_IBUS
IBusBus *ibus_bus;
guint ibus_focus_message_filter;
#endif /* HAVE_IBUS */
#ifdef HAVE_XTEST
KeyCode modifier_keycodes[8];
XkbDescRec *xkb;
#endif /* HAVE_XTEST */
GSettings *settings;
}; };
struct _EekboardClientClass { struct _EekboardClientClass {
@ -87,33 +106,34 @@ G_DEFINE_TYPE (EekboardClient, eekboard_client, G_TYPE_OBJECT);
static GdkFilterReturn filter_xkl_event (GdkXEvent *xev, static GdkFilterReturn filter_xkl_event (GdkXEvent *xev,
GdkEvent *event, GdkEvent *event,
gpointer user_data); gpointer user_data);
static void on_xkl_config_changed static void on_xkl_config_changed (XklEngine *xklengine,
(XklEngine *xklengine,
gpointer user_data); gpointer user_data);
static void on_xkl_state_changed static void on_xkl_state_changed (XklEngine *xklengine,
(XklEngine *xklengine,
XklEngineStateChange type, XklEngineStateChange type,
gint value, gint value,
gboolean restore, gboolean restore,
gpointer user_data); gpointer user_data);
#ifdef HAVE_CSPI #ifdef HAVE_ATSPI
static SPIBoolean focus_listener_cb (const AccessibleEvent *event, static void focus_listener_cb (const AtspiEvent *event,
void *user_data); void *user_data);
static SPIBoolean keystroke_listener_cb static gboolean keystroke_listener_cb (const AtspiDeviceEvent *stroke,
(const AccessibleKeystroke *stroke,
void *user_data); void *user_data);
#endif /* HAVE_CSPI */ #endif /* HAVE_ATSPI */
static gboolean set_keyboard (EekboardClient *client, static gboolean set_keyboard (EekboardClient *client,
gboolean show, gboolean show,
EekLayout *layout); EekLayout *layout);
static gboolean set_xkl_keyboard (EekboardClient *client, static gboolean set_keyboard_from_xkl (EekboardClient *client,
gboolean show, gboolean show,
const gchar *model, const gchar *model,
const gchar *layouts, const gchar *layouts,
const gchar *options); const gchar *options);
#ifdef HAVE_XTEST
static void update_modifier_keycodes
(EekboardClient *client);
#endif /* HAVE_XTEST */
static void static void
eekboard_client_set_property (GObject *object, eekboard_client_set_property (GObject *object,
@ -181,14 +201,22 @@ eekboard_client_dispose (GObject *object)
eekboard_client_disable_xkl (client); eekboard_client_disable_xkl (client);
#ifdef HAVE_CSPI #ifdef HAVE_ATSPI
eekboard_client_disable_cspi_focus (client); eekboard_client_disable_atspi_focus (client);
eekboard_client_disable_cspi_keystroke (client); eekboard_client_disable_atspi_keystroke (client);
#endif /* HAVE_CSPI */ #endif /* HAVE_ATSPI */
#ifdef HAVE_FAKEKEY #ifdef HAVE_IBUS
eekboard_client_disable_fakekey (client); eekboard_client_disable_ibus_focus (client);
#endif /* HAVE_FAKEKEY */ if (client->ibus_bus) {
g_object_unref (client->ibus_bus);
client->ibus_bus = NULL;
}
#endif /* HAVE_IBUS */
#ifdef HAVE_XTEST
eekboard_client_disable_xtest (client);
#endif /* HAVE_XTEST */
if (client->context) { if (client->context) {
if (client->eekboard) { if (client->eekboard) {
@ -209,15 +237,9 @@ eekboard_client_dispose (GObject *object)
client->keyboard = NULL; client->keyboard = NULL;
} }
#ifdef HAVE_FAKEKEY if (client->settings) {
if (client->fakekey) { g_object_unref (client->settings);
client->fakekey = NULL; client->settings = NULL;
}
#endif /* HAVE_FAKEKEY */
if (client->display) {
gdk_display_close (client->display);
client->display = NULL;
} }
G_OBJECT_CLASS (eekboard_client_parent_class)->dispose (object); G_OBJECT_CLASS (eekboard_client_parent_class)->dispose (object);
@ -266,7 +288,6 @@ eekboard_client_init (EekboardClient *client)
{ {
client->eekboard = NULL; client->eekboard = NULL;
client->context = NULL; client->context = NULL;
client->display = NULL;
client->xkl_engine = NULL; client->xkl_engine = NULL;
client->xkl_config_registry = NULL; client->xkl_config_registry = NULL;
client->keyboard = NULL; client->keyboard = NULL;
@ -274,47 +295,52 @@ eekboard_client_init (EekboardClient *client)
client->key_released_handler = 0; client->key_released_handler = 0;
client->xkl_config_changed_handler = 0; client->xkl_config_changed_handler = 0;
client->xkl_state_changed_handler = 0; client->xkl_state_changed_handler = 0;
#ifdef HAVE_CSPI #if ENABLE_FOCUS_LISTENER
client->focus_listener = NULL; client->follows_focus = FALSE;
client->hide_keyboard_timeout_id = 0;
#endif /* ENABLE_FOCUS_LISTENER */
#ifdef HAVE_ATSPI
client->keystroke_listener = NULL; client->keystroke_listener = NULL;
#endif /* HAVE_CSPI */ #endif /* HAVE_ATSPI */
#ifdef HAVE_FAKEKEY #ifdef HAVE_IBUS
client->fakekey = NULL; client->ibus_bus = NULL;
#endif /* HAVE_FAKEKEY */ client->ibus_focus_message_filter = 0;
#endif /* HAVE_IBUS */
client->settings = g_settings_new ("org.fedorahosted.eekboard");
} }
gboolean gboolean
eekboard_client_set_xkl_config (EekboardClient *client, 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)
{ {
#ifdef HAVE_CSPI client->use_xkl_layout = TRUE;
return set_xkl_keyboard (client,
client->focus_listener ? FALSE : TRUE, #if ENABLE_FOCUS_LISTENER
return set_keyboard_from_xkl (client,
!client->follows_focus,
model, model,
layouts, layouts,
options); options);
#else #else /* ENABLE_FOCUS_LISTENER */
return set_xkl_keyboard (client, return set_keyboard_from_xkl (client,
TRUE, TRUE,
model, model,
layouts, layouts,
options); options);
#endif #endif /* !ENABLE_FOCUS_LISTENER */
} }
gboolean gboolean
eekboard_client_enable_xkl (EekboardClient *client) eekboard_client_enable_xkl (EekboardClient *client)
{ {
if (!client->display) { GdkDisplay *display = gdk_display_get_default ();
client->display = gdk_display_get_default (); g_assert (display);
}
g_assert (client->display);
if (!client->xkl_engine) { if (!client->xkl_engine) {
client->xkl_engine = client->xkl_engine =
xkl_engine_get_instance (GDK_DISPLAY_XDISPLAY (client->display)); xkl_engine_get_instance (GDK_DISPLAY_XDISPLAY (display));
} }
g_assert (client->xkl_engine); g_assert (client->xkl_engine);
@ -338,22 +364,18 @@ eekboard_client_enable_xkl (EekboardClient *client)
(GdkFilterFunc) filter_xkl_event, (GdkFilterFunc) filter_xkl_event,
client); client);
client->use_xkl_layout = FALSE;
xkl_engine_start_listen (client->xkl_engine, XKLL_TRACK_KEYBOARD_STATE); xkl_engine_start_listen (client->xkl_engine, XKLL_TRACK_KEYBOARD_STATE);
#ifdef HAVE_CSPI return TRUE;
return set_xkl_keyboard (client,
client->focus_listener ? FALSE : TRUE,
NULL,
NULL,
NULL);
#else
return set_xkl_keyboard (client, TRUE, NULL, NULL, NULL);
#endif
} }
void void
eekboard_client_disable_xkl (EekboardClient *client) eekboard_client_disable_xkl (EekboardClient *client)
{ {
client->use_xkl_layout = FALSE;
if (client->xkl_engine) if (client->xkl_engine)
xkl_engine_stop_listen (client->xkl_engine, XKLL_TRACK_KEYBOARD_STATE); xkl_engine_stop_listen (client->xkl_engine, XKLL_TRACK_KEYBOARD_STATE);
if (g_signal_handler_is_connected (client->xkl_engine, if (g_signal_handler_is_connected (client->xkl_engine,
@ -366,93 +388,150 @@ eekboard_client_disable_xkl (EekboardClient *client)
client->xkl_state_changed_handler); client->xkl_state_changed_handler);
} }
#ifdef HAVE_CSPI #ifdef HAVE_ATSPI
gboolean gboolean
eekboard_client_enable_cspi_focus (EekboardClient *client) eekboard_client_enable_atspi_focus (EekboardClient *client)
{ {
client->focus_listener = SPI_createAccessibleEventListener GError *error;
((AccessibleEventListenerCB)focus_listener_cb,
client);
if (!SPI_registerGlobalEventListener (client->focus_listener, error = NULL;
"object:state-changed:focused")) if (!atspi_event_listener_register_from_callback
((AtspiEventListenerCB)focus_listener_cb,
client,
NULL,
"object:state-changed:focused",
&error))
return FALSE; return FALSE;
if (!SPI_registerGlobalEventListener (client->focus_listener, error = NULL;
"focus:")) if (!atspi_event_listener_register_from_callback
((AtspiEventListenerCB)focus_listener_cb,
client,
NULL,
"focus:",
&error))
return FALSE; return FALSE;
client->follows_focus = TRUE;
return TRUE; return TRUE;
} }
void void
eekboard_client_disable_cspi_focus (EekboardClient *client) eekboard_client_disable_atspi_focus (EekboardClient *client)
{ {
if (client->focus_listener) { GError *error;
SPI_deregisterGlobalEventListenerAll (client->focus_listener);
AccessibleEventListener_unref (client->focus_listener); client->follows_focus = FALSE;
client->focus_listener = NULL;
} error = NULL;
atspi_event_listener_deregister_from_callback
((AtspiEventListenerCB)focus_listener_cb,
client,
"object:state-changed:focused",
&error);
error = NULL;
atspi_event_listener_deregister_from_callback
((AtspiEventListenerCB)focus_listener_cb,
client,
"focus:",
&error);
} }
gboolean gboolean
eekboard_client_enable_cspi_keystroke (EekboardClient *client) eekboard_client_enable_atspi_keystroke (EekboardClient *client)
{ {
GError *error;
client->keystroke_listener = client->keystroke_listener =
SPI_createAccessibleKeystrokeListener (keystroke_listener_cb, atspi_device_listener_new ((AtspiDeviceListenerCB)keystroke_listener_cb,
NULL,
client); client);
if (!SPI_registerAccessibleKeystrokeListener error = NULL;
if (!atspi_register_keystroke_listener
(client->keystroke_listener, (client->keystroke_listener,
SPI_KEYSET_ALL_KEYS, NULL,
0, 0,
SPI_KEY_PRESSED | ATSPI_KEY_PRESSED,
SPI_KEY_RELEASED, ATSPI_KEYLISTENER_NOSYNC,
SPI_KEYLISTENER_NOSYNC)) &error))
return FALSE;
error = NULL;
if (!atspi_register_keystroke_listener
(client->keystroke_listener,
NULL,
0,
ATSPI_KEY_RELEASED,
ATSPI_KEYLISTENER_NOSYNC,
&error))
return FALSE; return FALSE;
return TRUE; return TRUE;
} }
void void
eekboard_client_disable_cspi_keystroke (EekboardClient *client) eekboard_client_disable_atspi_keystroke (EekboardClient *client)
{ {
if (client->keystroke_listener) { if (client->keystroke_listener) {
SPI_deregisterAccessibleKeystrokeListener (client->keystroke_listener, GError *error;
0);
AccessibleKeystrokeListener_unref (client->keystroke_listener); error = NULL;
atspi_deregister_keystroke_listener (client->keystroke_listener,
NULL,
0,
ATSPI_KEY_PRESSED,
&error);
error = NULL;
atspi_deregister_keystroke_listener (client->keystroke_listener,
NULL,
0,
ATSPI_KEY_RELEASED,
&error);
g_object_unref (client->keystroke_listener);
client->keystroke_listener = NULL; client->keystroke_listener = NULL;
} }
} }
static SPIBoolean static void
focus_listener_cb (const AccessibleEvent *event, focus_listener_cb (const AtspiEvent *event,
void *user_data) void *user_data)
{ {
EekboardClient *client = user_data; EekboardClient *client = user_data;
Accessible *accessible = event->source; AtspiAccessible *accessible = event->source;
AccessibleStateSet *state_set = Accessible_getStateSet (accessible); AtspiStateSet *state_set = atspi_accessible_get_state_set (accessible);
AccessibleRole role = Accessible_getRole (accessible); AtspiRole role;
GError *error;
if (AccessibleStateSet_contains (state_set, SPI_STATE_EDITABLE) || error = NULL;
role == SPI_ROLE_TERMINAL) { role = atspi_accessible_get_role (accessible, &error);
if (error)
return;
if (atspi_state_set_contains (state_set, ATSPI_STATE_EDITABLE) ||
role == ATSPI_ROLE_TERMINAL) {
switch (role) { switch (role) {
case SPI_ROLE_TEXT: case ATSPI_ROLE_TEXT:
case SPI_ROLE_PARAGRAPH: case ATSPI_ROLE_PARAGRAPH:
case SPI_ROLE_PASSWORD_TEXT: case ATSPI_ROLE_PASSWORD_TEXT:
case SPI_ROLE_TERMINAL: case ATSPI_ROLE_TERMINAL:
if (strncmp (event->type, "focus", 5) == 0 || event->detail1 == 1) { if (strncmp (event->type, "focus", 5) == 0 || event->detail1 == 1) {
client->acc = accessible; client->acc = accessible;
eekboard_context_show_keyboard (client->context, NULL); eekboard_context_show_keyboard (client->context, NULL);
} else if (event->detail1 == 0 && accessible == client->acc) { } else if (g_settings_get_boolean (client->settings, "auto-hide") &&
event->detail1 == 0 && accessible == client->acc) {
client->acc = NULL; client->acc = NULL;
eekboard_context_hide_keyboard (client->context, NULL); eekboard_context_hide_keyboard (client->context, NULL);
} }
break; break;
case SPI_ROLE_ENTRY: case ATSPI_ROLE_ENTRY:
if (strncmp (event->type, "focus", 5) == 0 || event->detail1 == 1) { if (strncmp (event->type, "focus", 5) == 0 || event->detail1 == 1) {
client->acc = accessible; client->acc = accessible;
eekboard_context_show_keyboard (client->context, NULL); eekboard_context_show_keyboard (client->context, NULL);
} else if (event->detail1 == 0) { } else if (g_settings_get_boolean (client->settings, "auto-hide") &&
event->detail1 == 0) {
client->acc = NULL; client->acc = NULL;
eekboard_context_hide_keyboard (client->context, NULL); eekboard_context_hide_keyboard (client->context, NULL);
} }
@ -464,12 +543,10 @@ focus_listener_cb (const AccessibleEvent *event,
} else { } else {
eekboard_context_hide_keyboard (client->context, NULL); eekboard_context_hide_keyboard (client->context, NULL);
} }
return FALSE;
} }
static SPIBoolean static gboolean
keystroke_listener_cb (const AccessibleKeystroke *stroke, keystroke_listener_cb (const AtspiDeviceEvent *stroke,
void *user_data) void *user_data)
{ {
EekboardClient *client = user_data; EekboardClient *client = user_data;
@ -478,22 +555,144 @@ keystroke_listener_cb (const AccessibleKeystroke *stroke,
/* Ignore modifiers since the keystroke listener does not called /* Ignore modifiers since the keystroke listener does not called
when a modifier key is released. */ when a modifier key is released. */
key = eek_keyboard_find_key_by_keycode (client->keyboard, key = eek_keyboard_find_key_by_keycode (client->keyboard,
stroke->keycode); stroke->hw_code);
if (key) { if (key) {
EekSymbol *symbol = eek_key_get_symbol_with_fallback (key, 0, 0); EekSymbol *symbol = eek_key_get_symbol_with_fallback (key, 0, 0);
if (symbol && eek_symbol_is_modifier (symbol)) if (symbol && eek_symbol_is_modifier (symbol))
return FALSE; return FALSE;
} }
if (stroke->type == SPI_KEY_PRESSED) { if (stroke->type == ATSPI_KEY_PRESSED) {
eekboard_context_press_key (client->context, stroke->keycode, NULL); eekboard_context_press_key (client->context, stroke->hw_code, NULL);
} else { } else {
eekboard_context_release_key (client->context, stroke->keycode, NULL); eekboard_context_release_key (client->context, stroke->hw_code, NULL);
} }
return TRUE; return TRUE;
} }
#endif /* HAVE_CSPI */ #endif /* HAVE_ATSPI */
#ifdef HAVE_IBUS
static void
add_match_rule (GDBusConnection *connection,
const gchar *match_rule)
{
GError *error;
GDBusMessage *message;
message = g_dbus_message_new_method_call ("org.freedesktop.DBus", /* name */
"/org/freedesktop/DBus", /* path */
"org.freedesktop.DBus", /* interface */
"AddMatch");
g_dbus_message_set_body (message, g_variant_new ("(s)", match_rule));
error = NULL;
g_dbus_connection_send_message (connection,
message,
G_DBUS_SEND_MESSAGE_FLAGS_NONE,
NULL,
&error);
g_object_unref (message);
}
static gboolean
on_hide_keyboard_timeout (EekboardClient *client)
{
eekboard_context_hide_keyboard (client->context, NULL);
client->hide_keyboard_timeout_id = 0;
return FALSE;
}
static GDBusMessage *
focus_message_filter (GDBusConnection *connection,
GDBusMessage *message,
gboolean incoming,
gpointer user_data)
{
EekboardClient *client = user_data;
if (incoming &&
g_strcmp0 (g_dbus_message_get_interface (message),
IBUS_INTERFACE_INPUT_CONTEXT) == 0) {
const gchar *member = g_dbus_message_get_member (message);
if (g_strcmp0 (member, "FocusIn") == 0) {
if (client->hide_keyboard_timeout_id > 0) {
g_source_remove (client->hide_keyboard_timeout_id);
client->hide_keyboard_timeout_id = 0;
}
eekboard_context_show_keyboard (client->context, NULL);
} else if (g_settings_get_boolean (client->settings, "auto-hide") &&
g_strcmp0 (member, "FocusOut") == 0) {
gdouble delay = g_settings_get_double (client->settings,
"auto-hide-delay");
client->hide_keyboard_timeout_id =
g_timeout_add ((guint)(delay * 1000),
(GSourceFunc)on_hide_keyboard_timeout,
client);
}
}
return message;
}
static void
_ibus_connect_focus_handlers (IBusBus *bus, gpointer user_data)
{
EekboardClient *client = user_data;
GDBusConnection *connection;
connection = ibus_bus_get_connection (bus);
add_match_rule (connection,
"type='method_call',"
"interface='" IBUS_INTERFACE_INPUT_CONTEXT "',"
"member='FocusIn'");
add_match_rule (connection,
"type='method_call',"
"interface='" IBUS_INTERFACE_INPUT_CONTEXT "',"
"member='FocusOut'");
client->ibus_focus_message_filter =
g_dbus_connection_add_filter (connection,
focus_message_filter,
client,
NULL);
}
gboolean
eekboard_client_enable_ibus_focus (EekboardClient *client)
{
if (!client->ibus_bus) {
client->ibus_bus = ibus_bus_new ();
g_object_ref (client->ibus_bus);
g_signal_connect (client->ibus_bus, "connected",
G_CALLBACK(_ibus_connect_focus_handlers),
client);
}
if (ibus_bus_is_connected (client->ibus_bus))
_ibus_connect_focus_handlers (client->ibus_bus, client);
client->follows_focus = TRUE;
return TRUE;
}
void
eekboard_client_disable_ibus_focus (EekboardClient *client)
{
GDBusConnection *connection;
client->follows_focus = FALSE;
if (client->ibus_bus) {
if (client->ibus_focus_message_filter != 0) {
connection = ibus_bus_get_connection (client->ibus_bus);
g_dbus_connection_remove_filter (connection,
client->ibus_focus_message_filter);
}
g_object_unref (client->ibus_bus);
client->ibus_bus = NULL;
}
}
#endif /* HAVE_ATSPI */
EekboardClient * EekboardClient *
eekboard_client_new (GDBusConnection *connection) eekboard_client_new (GDBusConnection *connection)
@ -525,13 +724,14 @@ on_xkl_config_changed (XklEngine *xklengine,
EekboardClient *client = user_data; EekboardClient *client = user_data;
gboolean retval; gboolean retval;
retval = set_xkl_keyboard (client, FALSE, NULL, NULL, NULL); if (client->use_xkl_layout) {
retval = set_keyboard_from_xkl (client, FALSE, NULL, NULL, NULL);
g_return_if_fail (retval); g_return_if_fail (retval);
}
#ifdef HAVE_FAKEKEY #ifdef HAVE_XTEST
if (client->fakekey) update_modifier_keycodes (client);
fakekey_reload_keysyms (client->fakekey); #endif /* HAVE_XTEST */
#endif /* HAVE_FAKEKEY */
} }
static gboolean static gboolean
@ -561,7 +761,7 @@ set_keyboard (EekboardClient *client,
} }
static gboolean static gboolean
set_xkl_keyboard (EekboardClient *client, set_keyboard_from_xkl (EekboardClient *client,
gboolean show, gboolean show,
const gchar *model, const gchar *model,
const gchar *layouts, const gchar *layouts,
@ -628,29 +828,182 @@ on_xkl_state_changed (XklEngine *xklengine,
EekboardClient *client = user_data; EekboardClient *client = user_data;
if (type == GROUP_CHANGED && client->keyboard) { if (type == GROUP_CHANGED && client->keyboard) {
if (client->use_xkl_layout) {
gint group = eek_element_get_group (EEK_ELEMENT(client->keyboard)); gint group = eek_element_get_group (EEK_ELEMENT(client->keyboard));
if (group != value) { if (group != value) {
eekboard_context_set_group (client->context, value, NULL); eekboard_context_set_group (client->context, value, NULL);
} }
} }
client->group = value;
}
} }
#ifdef HAVE_FAKEKEY #ifdef HAVE_XTEST
G_INLINE_FUNC FakeKeyModifier /* The following functions for keyboard mapping change are direct
get_fakekey_modifiers (EekModifierType modifiers) translation of the code in Caribou (in libcaribou/xadapter.vala):
- get_replaced_keycode (Caribou: get_reserved_keycode)
- replace_keycode
- get_keycode_from_gdk_keymap (Caribou: best_keycode_keyval_match)
*/
static guint
get_replaced_keycode (EekboardClient *client)
{ {
FakeKeyModifier retval = 0; GdkDisplay *display = gdk_display_get_default ();
Display *xdisplay = GDK_DISPLAY_XDISPLAY (display);
gint i;
if (modifiers & EEK_SHIFT_MASK) for (i = client->xkb->max_key_code; i >= client->xkb->min_key_code; --i)
retval |= FAKEKEYMOD_SHIFT; if (client->xkb->map->key_sym_map[i].kt_index[0] == XkbOneLevelIndex &&
if (modifiers & EEK_CONTROL_MASK) XKeycodeToKeysym (xdisplay, i, 0) != 0)
retval |= FAKEKEYMOD_CONTROL; return i;
if (modifiers & EEK_MOD1_MASK)
retval |= FAKEKEYMOD_ALT;
if (modifiers & EEK_META_MASK)
retval |= FAKEKEYMOD_META;
return retval; return XKeysymToKeycode (xdisplay, 0x0023); /* XK_numbersign */
}
/* Replace keysym assigned to KEYCODE to KEYSYM. Both args are used
as in-out. If KEYCODE points to 0, this function picks a keycode
from the current map and replace the associated keysym to KEYSYM.
In that case, the replaced keycode is stored in KEYCODE and the old
keysym is stored in KEYSYM. If otherwise (KEYCODE points to
non-zero keycode), it simply changes the current map with the
specified KEYCODE and KEYSYM. */
static gboolean
replace_keycode (EekboardClient *client,
guint *keycode,
guint *keysym)
{
GdkDisplay *display = gdk_display_get_default ();
Display *xdisplay = GDK_DISPLAY_XDISPLAY (display);
guint offset;
XkbMapChangesRec changes;
guint replaced_keycode, replaced_keysym;
g_assert (keycode != NULL);
g_assert (keysym != NULL && *keysym != 0);
replaced_keycode = get_replaced_keycode (client);
if (replaced_keycode == 0)
return FALSE;
replaced_keysym = XKeycodeToKeysym (xdisplay, replaced_keycode, 0);
XFlush (xdisplay);
offset = client->xkb->map->key_sym_map[replaced_keycode].offset;
client->xkb->map->syms[offset] = *keysym;
changes.changed = XkbKeySymsMask;
changes.first_key_sym = replaced_keycode;
changes.num_key_syms = 1;
XkbChangeMap (xdisplay, client->xkb, &changes);
XFlush (xdisplay);
*keycode = replaced_keycode;
*keysym = replaced_keysym;
return TRUE;
}
static gboolean
get_keycode_from_gdk_keymap (EekboardClient *client,
guint keysym,
guint *keycode,
guint *modifiers)
{
GdkKeymap *keymap = gdk_keymap_get_default ();
GdkKeymapKey *keys, *best_match;
gint n_keys, i;
if (!gdk_keymap_get_entries_for_keyval (keymap, keysym, &keys, &n_keys))
return FALSE;
for (i = 0; i < n_keys; i++)
if (keys[i].group == client->group)
best_match = &keys[i];
*keycode = best_match->keycode;
*modifiers = best_match->level == 1 ? EEK_SHIFT_MASK : 0;
g_free (keys);
return TRUE;
}
static void
send_fake_modifier_key_event (EekboardClient *client,
EekModifierType modifiers,
gboolean is_pressed)
{
GdkDisplay *display = gdk_display_get_default ();
gint i;
for (i = 0; i < G_N_ELEMENTS(client->modifier_keycodes); i++) {
if (modifiers & (1 << i)) {
guint keycode = client->modifier_keycodes[i];
g_return_if_fail (keycode > 0);
XTestFakeKeyEvent (GDK_DISPLAY_XDISPLAY (display),
keycode,
is_pressed,
CurrentTime);
}
}
}
static void
send_fake_key_event (EekboardClient *client,
EekKey *key,
gboolean is_pressed)
{
GdkDisplay *display = gdk_display_get_default ();
EekSymbol *symbol;
EekModifierType keyboard_modifiers, modifiers;
guint xkeysym;
guint keycode, replaced_keysym = 0;
symbol = eek_key_get_symbol_with_fallback (key, 0, 0);
/* Ignore special keys and modifiers */
if (!EEK_IS_KEYSYM(symbol) || eek_symbol_is_modifier (symbol))
return;
xkeysym = eek_keysym_get_xkeysym (EEK_KEYSYM(symbol));
g_return_if_fail (xkeysym > 0);
modifiers = 0;
if (!get_keycode_from_gdk_keymap (client, xkeysym, &keycode, &modifiers)) {
keycode = 0;
replaced_keysym = xkeysym;
if (!replace_keycode (client, &keycode, &replaced_keysym)) {
g_warning ("failed to lookup X keysym %X", xkeysym);
return;
}
}
/* Clear level shift modifiers */
keyboard_modifiers = eek_keyboard_get_modifiers (client->keyboard);
keyboard_modifiers &= ~EEK_SHIFT_MASK;
keyboard_modifiers &= ~EEK_LOCK_MASK;
keyboard_modifiers &= ~eek_keyboard_get_alt_gr_mask (client->keyboard);
modifiers |= keyboard_modifiers;
send_fake_modifier_key_event (client, modifiers, is_pressed);
XSync (GDK_DISPLAY_XDISPLAY (display), False);
keycode = XKeysymToKeycode (GDK_DISPLAY_XDISPLAY (display),
xkeysym);
g_return_if_fail (keycode > 0);
XTestFakeKeyEvent (GDK_DISPLAY_XDISPLAY (display),
keycode,
is_pressed,
CurrentTime);
XSync (GDK_DISPLAY_XDISPLAY (display), False);
if (replaced_keysym)
replace_keycode (client, &keycode, &replaced_keysym);
} }
static void static void
@ -659,28 +1012,8 @@ on_key_pressed (EekKeyboard *keyboard,
gpointer user_data) gpointer user_data)
{ {
EekboardClient *client = user_data; EekboardClient *client = user_data;
EekSymbol *symbol; send_fake_key_event (client, key, TRUE);
send_fake_key_event (client, key, FALSE);
g_assert (client->fakekey);
symbol = eek_key_get_symbol_with_fallback (key, 0, 0);
if (EEK_IS_KEYSYM(symbol) && !eek_symbol_is_modifier (symbol)) {
guint xkeysym = eek_keysym_get_xkeysym (EEK_KEYSYM(symbol));
guint keycode =
XKeysymToKeycode (GDK_DISPLAY_XDISPLAY (client->display), xkeysym);
EekModifierType modifiers =
eek_keyboard_get_modifiers (client->keyboard);
FakeKeyModifier fakekey_modifiers = get_fakekey_modifiers (modifiers);
fakekey_send_keyevent (client->fakekey,
keycode,
TRUE,
fakekey_modifiers);
fakekey_send_keyevent (client->fakekey,
keycode,
FALSE,
fakekey_modifiers);
}
} }
static void static void
@ -688,24 +1021,57 @@ on_key_released (EekKeyboard *keyboard,
EekKey *key, EekKey *key,
gpointer user_data) gpointer user_data)
{ {
EekboardClient *client = user_data; }
g_assert (client->fakekey); static void
fakekey_release (client->fakekey); update_modifier_keycodes (EekboardClient *client)
{
GdkDisplay *display = gdk_display_get_default ();
XModifierKeymap *mods;
gint i, j;
mods = XGetModifierMapping (GDK_DISPLAY_XDISPLAY (display));
for (i = 0; i < 8; i++) {
client->modifier_keycodes[i] = 0;
for (j = 0; j < mods->max_keypermod; j++) {
KeyCode keycode = mods->modifiermap[mods->max_keypermod * i + j];
if (keycode != 0) {
client->modifier_keycodes[i] = keycode;
break;
}
}
}
} }
gboolean gboolean
eekboard_client_enable_fakekey (EekboardClient *client) eekboard_client_enable_xtest (EekboardClient *client)
{ {
if (!client->display) { GdkDisplay *display = gdk_display_get_default ();
client->display = gdk_display_get_default (); int opcode, event_base, error_base, major_version, minor_version;
}
g_assert (client->display);
if (!client->fakekey) { g_assert (display);
client->fakekey = fakekey_init (GDK_DISPLAY_XDISPLAY (client->display));
if (!XTestQueryExtension (GDK_DISPLAY_XDISPLAY (display),
&event_base, &error_base,
&major_version, &minor_version)) {
g_warning ("XTest extension is not available");
return FALSE;
} }
g_assert (client->fakekey);
if (!XkbQueryExtension (GDK_DISPLAY_XDISPLAY (display),
&opcode, &event_base, &error_base,
&major_version, &minor_version)) {
g_warning ("Xkb extension is not available");
return FALSE;
}
if (!client->xkb)
client->xkb = XkbGetMap (GDK_DISPLAY_XDISPLAY (display),
XkbKeySymsMask,
XkbUseCoreKbd);
g_assert (client->xkb);
update_modifier_keycodes (client);
client->key_pressed_handler = client->key_pressed_handler =
g_signal_connect (client->keyboard, "key-pressed", g_signal_connect (client->keyboard, "key-pressed",
@ -718,10 +1084,12 @@ eekboard_client_enable_fakekey (EekboardClient *client)
} }
void void
eekboard_client_disable_fakekey (EekboardClient *client) eekboard_client_disable_xtest (EekboardClient *client)
{ {
if (client->fakekey) if (client->xkb) {
fakekey_release (client->fakekey); XkbFreeKeyboard (client->xkb, 0, TRUE); /* free_all = TRUE */
client->xkb = NULL;
}
if (g_signal_handler_is_connected (client->keyboard, if (g_signal_handler_is_connected (client->keyboard,
client->key_pressed_handler)) client->key_pressed_handler))
@ -741,8 +1109,6 @@ eekboard_client_load_keyboard_from_file (EekboardClient *client,
GFileInputStream *input; GFileInputStream *input;
GError *error; GError *error;
EekLayout *layout; EekLayout *layout;
EekKeyboard *keyboard;
guint keyboard_id;
gboolean retval; gboolean retval;
file = g_file_new_for_path (keyboard_file); file = g_file_new_for_path (keyboard_file);
@ -754,9 +1120,13 @@ eekboard_client_load_keyboard_from_file (EekboardClient *client,
layout = eek_xml_layout_new (G_INPUT_STREAM(input)); layout = eek_xml_layout_new (G_INPUT_STREAM(input));
g_object_unref (input); g_object_unref (input);
#if ENABLE_FOCUS_LISTENER
retval = set_keyboard (client, !client->follows_focus, layout);
#else /* ENABLE_FOCUS_LISTENER */
retval = set_keyboard (client, TRUE, layout); retval = set_keyboard (client, TRUE, layout);
#endif /* !ENABLE_FOCUS_LISTENER */
g_object_unref (layout); g_object_unref (layout);
return retval; return retval;
} }
#endif /* HAVE_FAKEKEY */ #endif /* HAVE_XTEST */

View File

@ -36,7 +36,9 @@ EekboardClient * eekboard_client_new (GDBusConnection *connection);
gboolean eekboard_client_load_keyboard_from_file gboolean eekboard_client_load_keyboard_from_file
(EekboardClient *client, (EekboardClient *client,
const gchar *file); const gchar *file);
gboolean eekboard_client_set_xkl_config (EekboardClient *client,
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);
@ -44,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