Compare commits

...

41 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
66 changed files with 2039 additions and 613 deletions

3
.gitignore vendored
View File

@ -47,7 +47,6 @@ tests/eek-xml-test
src/eekboard src/eekboard
src/eekboard-server src/eekboard-server
src/eekboard-xml src/eekboard-xml
src/eekboard-server.service
docs/reference/eek/*.stamp docs/reference/eek/*.stamp
docs/reference/eek/*.txt docs/reference/eek/*.txt
docs/reference/eek/eek.types docs/reference/eek/eek.types
@ -76,6 +75,8 @@ po/stamp-it
po/.intltool-merge-cache 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 data/*.desktop
examples/eekboard-inscript/eekboard-inscript examples/eekboard-inscript/eekboard-inscript
examples/simple-client/simple-client examples/simple-client/simple-client

2
README
View File

@ -8,7 +8,7 @@ tools to implement desktop virtual keyboards.
** Dependencies ** Dependencies
REQUIRED: GLib2, GTK, PangoCairo, libxklavier, libcroco REQUIRED: GLib2, GTK, PangoCairo, libxklavier, libcroco
OPTIONAL: fakekey, at-spi2-core, Clutter, Clutter-Gtk, Python, Vala, gobject-introspection OPTIONAL: libXtst, at-spi2-core, IBus, Clutter, Clutter-Gtk, Python, Vala, gobject-introspection
** Build from git repo ** Build from git repo

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.7], [ueno@unixuser.org]) AC_INIT([eekboard], [1.0.1], [ueno@unixuser.org])
dnl Init automake dnl Init automake
AM_INIT_AUTOMAKE AM_INIT_AUTOMAKE
@ -89,6 +89,8 @@ 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], [
@ -102,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 X to mark the fullscreen window as dock
AC_MSG_CHECKING([whether you enable X dock])
AC_ARG_ENABLE(x-dock,
AS_HELP_STRING([--enable-x-dock=no/yes],
[Enable X dock default=yes]),
enable_x_dock=$enableval,
enable_x_dock=yes)
if test x$enable_x_dock = xyes; then
PKG_CHECK_MODULES([XDOCK], [x], , enable_x_dock=no)
if test x$enable_x_dock = xyes; then
AC_DEFINE([HAVE_XDOCK], [1], [Define if X dock is found])
fi
fi
AM_CONDITIONAL(ENABLE_XDOCK, [test x$enable_x_dock = xyes])
AC_MSG_RESULT($enable_x_dock)
focus_listeners=""
keystroke_listeners=""
focus_listeners=""
keystroke_listeners=""
dnl use AT-SPI 2 to capture focus/keystroke events dnl use AT-SPI 2 to capture focus/keystroke events
AC_MSG_CHECKING([whether you enable AT-SPI 2 event handling]) AC_MSG_CHECKING([whether you enable AT-SPI 2 event handling])
AC_ARG_ENABLE(atspi, AC_ARG_ENABLE(atspi,
AS_HELP_STRING([--enable-atspi=no/yes], AS_HELP_STRING([--enable-atspi=no/yes],
[Enable AT-SPI 2 event handling default=no]),, [Enable AT-SPI 2 event handling default=yes]),
enable_atspi=no) enable_atspi=$enableval,
enable_atspi=yes)
if test x$enable_atspi = xyes; then if test x$enable_atspi = xyes; then
PKG_CHECK_MODULES([ATSPI2], [atspi-2 dbus-glib-1], , PKG_CHECK_MODULES([ATSPI2], [atspi-2 dbus-glib-1], , enable_atspi=no)
[AC_MSG_ERROR([AT-SPI 2 not found])]) if test x$enable_atspi = xyes; then
AC_DEFINE([HAVE_ATSPI], [1], [Define if AT-SPI 2 is found]) AC_DEFINE([HAVE_ATSPI], [1], [Define if AT-SPI 2 is found])
focus_listeners="atspi $focus_listeners"
keystroke_listeners="atspi $keystroke_listeners"
fi
fi fi
AC_MSG_RESULT($enable_atspi) AC_MSG_RESULT($enable_atspi)
AM_CONDITIONAL(ENABLE_ATSPI, [test x$enable_atspi = xyes]) AM_CONDITIONAL(ENABLE_ATSPI, [test x$enable_atspi = xyes])
dnl use IBus to capture focus events
AC_MSG_CHECKING([whether you enable IBus focus tracking])
AC_ARG_ENABLE(ibus,
AS_HELP_STRING([--enable-ibus=no/yes],
[Enable IBus focus tracking default=yes]),
enable_ibus=$enableval,
enable_ibus=yes)
if test x$enable_ibus = xyes; then
PKG_CHECK_MODULES([IBUS], [ibus-1.0 >= 1.3.99], , enable_ibus=no)
if test x$enable_ibus = xyes; then
AC_DEFINE([HAVE_IBUS], [1], [Define if IBus is found])
focus_listeners="ibus $focus_listeners"
fi
fi
AC_MSG_RESULT($enable_ibus)
AM_CONDITIONAL(ENABLE_IBUS, [test x$enable_ibus = xyes])
if test -n "$focus_listeners"; then
AC_DEFINE(ENABLE_FOCUS_LISTENER, [1], [Define if eekboard can follow focus changes])
fi
dnl Python language binding dnl Python language binding
AC_MSG_CHECKING([whether you enable Python language support]) AC_MSG_CHECKING([whether you enable Python language support])
AC_ARG_ENABLE(python, AC_ARG_ENABLE(python,
AS_HELP_STRING([--enable-python=no/yes], AS_HELP_STRING([--enable-python=no/yes],
[Enable Python language binding default=yes]),, [Enable Python language binding default=yes]),
enable_python=$enableval,
enable_python=yes) enable_python=yes)
AC_MSG_RESULT($enable_python)
AM_CONDITIONAL(ENABLE_PYTHON, [test x$enable_python = xyes]) dnl check python unconditionally to re-generate
dnl eek/*-keysym-labels.txt when maintainer-mode enabled
AM_PATH_PYTHON([2.5], , enable_python=no)
if test x"$enable_python" = x"yes"; then if test x"$enable_python" = x"yes"; then
# check python if test x$enable_python = xyes; then
AM_PATH_PYTHON([2.5]) AC_PATH_PROGS(PYTHON_CONFIG, [python$PYTHON_VERSION-config python-config])
AC_PATH_PROG(PYTHON_CONFIG, python$PYTHON_VERSION-config)
if test x"$PYTHON_CONFIG" = x""; then
AC_PATH_PROG(PYTHON_CONFIG, python-config)
fi
if test x"$PYTHON_CONFIG" != x""; then if test x"$PYTHON_CONFIG" != x""; then
PYTHON_CFLAGS=`$PYTHON_CONFIG --includes` PYTHON_CFLAGS=`$PYTHON_CONFIG --includes`
PYTHON_LIBS=`$PYTHON_CONFIG --libs` PYTHON_LIBS=`$PYTHON_CONFIG --libs`
@ -159,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)
@ -217,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
@ -266,5 +344,6 @@ Build options:
Build Vala binding $enable_vala Build Vala binding $enable_vala
Build Python binding $enable_python Build Python binding $enable_python
Build document $enable_gtk_doc Build document $enable_gtk_doc
Support accessibility $enable_atspi Focus listeners $focus_listeners
Keystroke listeners $keystroke_listeners
]) ])

View File

@ -1,5 +1,17 @@
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)
@ -12,8 +24,8 @@ 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 if ENABLE_ATSPI
CLEANFILES += $(autostart_DATA) CLEANFILES += $(autostart_DATA)

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

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

@ -96,7 +96,7 @@ libeek_la_SOURCES = \
$(srcdir)/eek-enumtypes.c \ $(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
@ -116,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
@ -130,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 = \
@ -141,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 = \
@ -152,7 +152,7 @@ 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

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

@ -1,4 +1,9 @@
/*** BEGIN file-header ***/ /*** 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__ #ifndef __EEK_ENUMTYPES_H__
#define __EEK_ENUMTYPES_H__ #define __EEK_ENUMTYPES_H__

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

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

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

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

@ -647,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);
@ -656,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);
} }

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

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

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

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

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

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

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

@ -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 \
@ -42,11 +41,11 @@ eekboard_LDADD = \
$(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_ATSPI if ENABLE_ATSPI
@ -56,6 +55,13 @@ eekboard_LDADD += \
$(ATSPI2_LIBS) $(ATSPI2_LIBS)
endif endif
if ENABLE_IBUS
eekboard_CFLAGS += \
$(IBUS_CFLAGS)
eekboard_LDADD += \
$(IBUS_LIBS)
endif
eekboard_headers = client.h eekboard_headers = client.h
eekboard_SOURCES = client.c client-main.c eekboard_SOURCES = client.c client-main.c
@ -72,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
@ -116,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

@ -24,6 +24,9 @@
#include <dbus/dbus.h> #include <dbus/dbus.h>
#include <atspi/atspi.h> #include <atspi/atspi.h>
#endif /* HAVE_ATSPI */ #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 "eekboard/eekboard.h" #include "eekboard/eekboard.h"
@ -56,9 +59,11 @@ static const GOptionEntry options[] = {
N_("Connect to the given D-Bus address")}, N_("Connect to the given D-Bus address")},
{"use-system-layout", 'x', 0, G_OPTION_ARG_NONE, &opt_use_system_layout, {"use-system-layout", 'x', 0, G_OPTION_ARG_NONE, &opt_use_system_layout,
N_("Use system keyboard layout")}, N_("Use system keyboard layout")},
#ifdef HAVE_ATSPI #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_ATSPI */ #endif /* HAVE_ATSPI */
@ -108,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)
{ {
@ -119,6 +130,8 @@ main (int argc, char **argv)
GError *error; GError *error;
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");
@ -167,59 +180,104 @@ 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);
} }
#ifdef HAVE_ATSPI settings = g_settings_new ("org.fedorahosted.eekboard");
if (opt_focus || opt_keystroke) { focus = FOCUS_NONE;
GSettings *settings = g_settings_new ("org.gnome.desktop.interface"); if (opt_focus) {
gchar *focus_listener = g_settings_get_string (settings,
"focus-listener");
if (g_settings_get_boolean (settings, "toolkit-accessibility")) { if (g_strcmp0 (focus_listener, "atspi") == 0)
focus = FOCUS_ATSPI;
else if (g_strcmp0 (focus_listener, "ibus") == 0)
focus = FOCUS_IBUS;
else {
g_printerr ("Unknown focus listener \"%s\". "
"Try \"atspi\" or \"ibus\"\n", focus_listener);
g_object_unref (client);
exit (1);
}
}
#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) { if (atspi_init () != 0) {
g_printerr ("Can't init AT-SPI 2\n"); 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_atspi_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_atspi_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_ATSPI */ #endif /* HAVE_ATSPI */
#ifdef HAVE_IBUS
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)) { 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_printerr ("Can't use --use-system-layout option with keyboard options\n");
g_object_unref (client);
exit (1); exit (1);
} }
if (opt_use_system_layout) {
if (!eekboard_client_enable_xkl (client)) { if (!eekboard_client_enable_xkl (client)) {
g_printerr ("Can't register xklavier event listeners\n"); g_printerr ("Can't register xklavier event listeners\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 { } else {
gchar *file; gchar *file;
gboolean success;
if (!opt_keyboard) if (!opt_keyboard)
opt_keyboard = DEFAULT_LAYOUT; opt_keyboard = DEFAULT_LAYOUT;
@ -228,20 +286,22 @@ main (int argc, char **argv)
file = g_strdup (opt_keyboard); file = g_strdup (opt_keyboard);
else else
file = g_strdup_printf ("%s/%s.xml", KEYBOARDDIR, opt_keyboard); file = g_strdup_printf ("%s/%s.xml", KEYBOARDDIR, opt_keyboard);
if (!eekboard_client_load_keyboard_from_file (client, file)) { success = eekboard_client_load_keyboard_from_file (client, file);
g_printerr ("Can't load keyboard file %s\n", file);
g_free (file); g_free (file);
if (!success) {
g_printerr ("Can't load keyboard file %s\n", file);
g_object_unref (client);
exit (1); exit (1);
} }
g_free (file);
} }
#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) {
@ -253,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);
@ -265,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

@ -28,9 +28,14 @@
#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"
@ -38,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
@ -58,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;
@ -68,15 +76,25 @@ struct _EekboardClient {
gulong key_pressed_handler; gulong key_pressed_handler;
gulong key_released_handler; gulong key_released_handler;
gboolean follows_focus;
guint hide_keyboard_timeout_id;
#ifdef HAVE_ATSPI #ifdef HAVE_ATSPI
AtspiAccessible *acc; AtspiAccessible *acc;
gboolean follows_focus;
AtspiDeviceListener *keystroke_listener; AtspiDeviceListener *keystroke_listener;
#endif /* HAVE_ATSPI */ #endif /* HAVE_ATSPI */
#ifdef HAVE_FAKEKEY #ifdef HAVE_IBUS
FakeKey *fakekey; IBusBus *ibus_bus;
#endif /* HAVE_FAKEKEY */ 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 {
@ -107,11 +125,15 @@ static gboolean keystroke_listener_cb (const AtspiDeviceEvent *stroke,
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,
@ -184,9 +206,17 @@ eekboard_client_dispose (GObject *object)
eekboard_client_disable_atspi_keystroke (client); eekboard_client_disable_atspi_keystroke (client);
#endif /* HAVE_ATSPI */ #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) {
@ -207,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);
@ -264,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;
@ -272,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_ATSPI #if ENABLE_FOCUS_LISTENER
client->follows_focus = FALSE; 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_ATSPI */ #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_ATSPI client->use_xkl_layout = TRUE;
return set_xkl_keyboard (client,
#if ENABLE_FOCUS_LISTENER
return set_keyboard_from_xkl (client,
!client->follows_focus, !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);
@ -336,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_ATSPI return TRUE;
return set_xkl_keyboard (client,
!client->follows_focus,
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,
@ -496,7 +520,8 @@ focus_listener_cb (const AtspiEvent *event,
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);
} }
@ -505,7 +530,8 @@ focus_listener_cb (const AtspiEvent *event,
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);
} }
@ -546,6 +572,128 @@ keystroke_listener_cb (const AtspiDeviceEvent *stroke,
} }
#endif /* HAVE_ATSPI */ #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)
{ {
@ -576,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
@ -612,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,
@ -679,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
@ -710,35 +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;
guint keycode;
EekModifierType modifiers;
FakeKeyModifier fakekey_modifiers;
xkeysym = eek_keysym_get_xkeysym (EEK_KEYSYM(symbol));
g_return_if_fail (xkeysym > 0);
keycode = XKeysymToKeycode (GDK_DISPLAY_XDISPLAY (client->display),
xkeysym);
g_return_if_fail (keycode > 0);
modifiers = eek_keyboard_get_modifiers (client->keyboard);
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
@ -746,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",
@ -776,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))
@ -810,13 +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);
#ifdef HAVE_ATSPI #if ENABLE_FOCUS_LISTENER
retval = set_keyboard (client, !client->follows_focus, layout); retval = set_keyboard (client, !client->follows_focus, layout);
#else #else /* ENABLE_FOCUS_LISTENER */
retval = set_keyboard (client, TRUE, layout); retval = set_keyboard (client, TRUE, layout);
#endif #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);
@ -54,8 +56,13 @@ gboolean eekboard_client_enable_atspi_keystroke
void eekboard_client_disable_atspi_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 {
@ -184,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;
@ -199,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)
{ {
@ -216,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));
@ -238,13 +319,19 @@ set_geometry (ServerContext *context)
"allocation-changed", "allocation-changed",
G_CALLBACK(on_allocation_changed), G_CALLBACK(on_allocation_changed),
NULL); NULL);
#else
g_return_if_reached ();
#endif #endif
}
gtk_widget_set_size_request (context->widget, gtk_widget_set_size_request (context->widget,
bounds.width, bounds.width,
bounds.height); bounds.height);
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);
} }
} }
@ -263,6 +350,7 @@ 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));
@ -274,10 +362,14 @@ update_widget (ServerContext *context)
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);
@ -295,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
@ -312,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:
@ -325,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),
@ -369,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);
} }
@ -430,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;
@ -459,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