Compare commits

...

16 Commits

Author SHA1 Message Date
be7154f287 Minimal changes to compile under the VM without (most?) X11 calls 2019-02-04 07:36:04 -02:00
e212262f29 Stop key-repeat when the server receives a new D-Bus event.
Key-repeat timer should be cleared when the server receives a new D-Bus.
Fixes: https://bugzilla.redhat.com/show_bug.cgi?id=857977
2012-10-01 11:55:04 +09:00
c71167d893 Fix out-of-tree build. 2012-10-01 11:55:00 +09:00
2d4e4c7a13 Fix compiler warnings. 2012-10-01 11:37:47 +09:00
695f8df5b8 Bump version to 1.0.8. 2012-08-15 17:28:23 +09:00
2e822cb6a6 Don't crash when all the keyboards are removed. 2012-08-15 17:27:20 +09:00
f2a90935a3 Make "visible" property per client instead of per context. 2012-04-24 18:38:32 +09:00
cee741eca0 Fix initial window size. 2012-04-24 12:48:35 +09:00
b5b59e77d6 Check errors when retrieving XKB layout information. 2012-04-24 11:58:41 +09:00
cce883808e Simplify eek-xkb-layout.c. 2012-04-24 11:01:42 +09:00
8faae7ef08 Use git.mk. 2012-04-24 10:38:36 +09:00
4538ef38a1 Revert "Remove eek-xkb*."
This reverts commit ee12d02402.
2012-04-24 10:06:09 +09:00
ee12d02402 Remove eek-xkb*. 2012-04-23 18:35:15 +09:00
7050fa41a0 G_CONST_RETURN -> const. 2012-04-23 17:09:48 +09:00
4a346211b8 Show tooltips. 2012-04-23 16:43:06 +09:00
4df2ecc8ae Don't abort when failed to load keyboard. 2012-04-16 14:37:18 +09:00
46 changed files with 894 additions and 617 deletions

84
.gitignore vendored
View File

@ -1,84 +0,0 @@
*.la
*.lo
*.loT
*.o
*.so
*~
*.pyc
Makefile
Makefile.in
.deps
.libs
INSTALL
aclocal.m4
autom4te.cache
compile
config.guess
config.h
config.h.in
config.log
config.rpath
config.status
config.sub
configure
depcomp
install-sh
libtool
ltmain.sh
missing
stamp-h1
libkeyactor*.tar.*
mkinstalldirs
m4/*.m4
gtk-doc.make
eek/eek-special-keysym-entries.h
eek/eek-unicode-keysym-entries.h
eek/eek-xkeysym-keysym-entries.h
eek/eek-enumtypes.[ch]
eek/eek-marshalers.[ch]
eek/*.pc
eek/*.gir
eek/*.typelib
eekboard/*.pc
eekboard/*.gir
eekboard/*.typelib
eekboard/eekboard-marshalers.[ch]
tests/eek-simple-test
tests/eek-xkb-test
tests/eek-xml-test
src/eekboard
src/eekboard-server
docs/reference/eek/*.stamp
docs/reference/eek/*.txt
docs/reference/eek/eek.types
!/docs/reference/eek/eek-sections.txt
docs/reference/eek/xml
docs/reference/eek/html
docs/reference/eek/eek.signals
docs/reference/eek/eek.args
docs/reference/eek/eek.hierarchy
docs/reference/eek/eek.interfaces
docs/reference/eek/eek.prerequisites
docs/reference/eekboard/*.stamp
docs/reference/eekboard/*.txt
!/docs/reference/eekboard/eekboard-sections.txt
docs/reference/eekboard/xml
docs/reference/eekboard/html
docs/reference/eekboard/eekboard.signals
docs/reference/eekboard/eekboard.args
docs/reference/eekboard/eekboard.hierarchy
docs/reference/eekboard/eekboard.interfaces
docs/reference/eekboard/eekboard.prerequisites
po/*.gmo
po/Makefile.in.in
po/POTFILES
po/stamp-it
po/.intltool-merge-cache
bindings/vala/*.vapi
py-compile
data/org.fedorahosted.eekboard.gschema.xml
data/org.fedorahosted.eekboard.gschema.valid
data/eekboard-server.service
data/*.desktop
examples/eekxml/eekxml

View File

@ -19,3 +19,21 @@
ACLOCAL_AMFLAGS = -I m4 ACLOCAL_AMFLAGS = -I m4
SUBDIRS = eek eekboard src tests bindings docs po data examples SUBDIRS = eek eekboard src tests bindings docs po data examples
DISTCHECK_CONFIGURE_FLAGS = --enable-gtk-doc --enable-introspection DISTCHECK_CONFIGURE_FLAGS = --enable-gtk-doc --enable-introspection
GITIGNOREFILES = \
INSTALL \
aclocal.m4 \
compile \
config.guess \
config.h.in \
config.sub \
depcomp \
gtk-doc.make \
install-sh \
ltmain.sh \
m4 \
missing \
mkinstalldirs \
$(NULL)
-include $(top_srcdir)/git.mk

View File

@ -17,3 +17,5 @@
# 02110-1301 USA # 02110-1301 USA
SUBDIRS = vala SUBDIRS = vala
-include $(top_srcdir)/git.mk

View File

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

View File

@ -1 +1,2 @@
eek-0.90 eek-0.90
x11

View File

@ -20,7 +20,7 @@ AC_PREREQ(2.63)
dnl AC_CONFIG_SRCDIR([configure.ac]) dnl AC_CONFIG_SRCDIR([configure.ac])
AC_CONFIG_MACRO_DIR([m4]) AC_CONFIG_MACRO_DIR([m4])
AC_INIT([eekboard], [1.0.7], [ueno@unixuser.org]) AC_INIT([eekboard], [1.0.8], [ueno@unixuser.org])
dnl Init automake dnl Init automake
AM_INIT_AUTOMAKE AM_INIT_AUTOMAKE

View File

@ -32,3 +32,4 @@ CLEANFILES += $(autostart_DATA)
EXTRA_DIST += $(autostart_in_files) EXTRA_DIST += $(autostart_in_files)
endif endif
-include $(top_srcdir)/git.mk

View File

@ -14,3 +14,4 @@ install-data-hook:
echo "*** $(gtk_update_icon_cache)"; \ echo "*** $(gtk_update_icon_cache)"; \
fi fi
-include $(top_srcdir)/git.mk

View File

@ -14,3 +14,4 @@ install-data-hook:
echo "*** $(gtk_update_icon_cache)"; \ echo "*** $(gtk_update_icon_cache)"; \
fi fi
-include $(top_srcdir)/git.mk

View File

@ -14,3 +14,4 @@ install-data-hook:
echo "*** $(gtk_update_icon_cache)"; \ echo "*** $(gtk_update_icon_cache)"; \
fi fi
-include $(top_srcdir)/git.mk

View File

@ -14,3 +14,4 @@ install-data-hook:
echo "*** $(gtk_update_icon_cache)"; \ echo "*** $(gtk_update_icon_cache)"; \
fi fi
-include $(top_srcdir)/git.mk

View File

@ -14,3 +14,4 @@ install-data-hook:
echo "*** $(gtk_update_icon_cache)"; \ echo "*** $(gtk_update_icon_cache)"; \
fi fi
-include $(top_srcdir)/git.mk

View File

@ -1 +1,3 @@
SUBDIRS = 16x16 22x22 24x24 32x32 48x48 scalable SUBDIRS = 16x16 22x22 24x24 32x32 48x48 scalable
-include $(top_srcdir)/git.mk

View File

@ -12,3 +12,4 @@ install-data-hook:
echo "*** $(gtk_update_icon_cache)"; \ echo "*** $(gtk_update_icon_cache)"; \
fi fi
-include $(top_srcdir)/git.mk

View File

@ -36,3 +36,5 @@ inscript_symbols = \
symbols/ta-inscript.xml \ symbols/ta-inscript.xml \
symbols/te-inscript.xml \ symbols/te-inscript.xml \
$(NULL) $(NULL)
-include $(top_srcdir)/git.mk

View File

@ -248,10 +248,10 @@
<keysym keyval="65506">Shift_R</keysym> <keysym keyval="65506">Shift_R</keysym>
</key> </key>
<key keycode="149" name="I149"> <key keycode="149" name="I149">
<symbol label="⌨" icon="input-keyboard-symbolic">cycle-keyboard</symbol> <symbol label="⌨" icon="input-keyboard-symbolic" tooltip="Change keyboard">cycle-keyboard</symbol>
</key> </key>
<key keycode="150" name="I150"> <key keycode="150" name="I150">
<symbol label="☺" icon="preferences-system-symbolic">preferences</symbol> <symbol label="☺" icon="preferences-system-symbolic" tooltip="Setup">preferences</symbol>
</key> </key>
<key keycode="37" name="LCTL"> <key keycode="37" name="LCTL">
<keysym keyval="65507">Control_L</keysym> <keysym keyval="65507">Control_L</keysym>

View File

@ -1,2 +1,4 @@
themedir = $(pkgdatadir)/themes themedir = $(pkgdatadir)/themes
dist_theme_DATA = default.css dist_theme_DATA = default.css
-include $(top_srcdir)/git.mk

View File

@ -17,3 +17,5 @@
# 02110-1301 USA # 02110-1301 USA
SUBDIRS = reference SUBDIRS = reference
-include $(top_srcdir)/git.mk

View File

@ -17,3 +17,5 @@
# 02110-1301 USA # 02110-1301 USA
SUBDIRS = eek eekboard SUBDIRS = eek eekboard
-include $(top_srcdir)/git.mk

View File

@ -129,3 +129,5 @@ if ENABLE_GTK_DOC
endif endif
-include $(top_srcdir)/gtk-doc.mk -include $(top_srcdir)/gtk-doc.mk
-include $(top_srcdir)/git.mk

View File

@ -118,3 +118,5 @@ if ENABLE_GTK_DOC
endif endif
-include $(top_srcdir)/gtk-doc.mk -include $(top_srcdir)/gtk-doc.mk
-include $(top_srcdir)/git.mk

View File

@ -16,10 +16,13 @@
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
# 02110-1301 USA # 02110-1301 USA
NULL =
lib_LTLIBRARIES = \ lib_LTLIBRARIES = \
libeek.la \ libeek.la \
libeek-gtk.la \ libeek-gtk.la \
libeek-xkl.la libeek-xkl.la \
$(NULL)
libeek_public_headers = \ libeek_public_headers = \
$(srcdir)/eek-layout.h \ $(srcdir)/eek-layout.h \
@ -37,17 +40,17 @@ libeek_public_headers = \
$(srcdir)/eek-xml-layout.h \ $(srcdir)/eek-xml-layout.h \
$(srcdir)/eek-serializable.h \ $(srcdir)/eek-serializable.h \
$(srcdir)/eek-theme.h \ $(srcdir)/eek-theme.h \
$(srcdir)/eek.h $(srcdir)/eek.h \
$(NULL)
libeek_private_headers = \ libeek_private_headers = \
$(srcdir)/eek-renderer.h \ $(srcdir)/eek-renderer.h \
$(srcdir)/eek-special-keysym-entries.h \ $(libeek_keysym_headers) \
$(srcdir)/eek-unicode-keysym-entries.h \ $(builddir)/eek-marshalers.h \
$(srcdir)/eek-xkeysym-keysym-entries.h \
$(srcdir)/eek-marshalers.h \
$(srcdir)/eek-theme-context.h \ $(srcdir)/eek-theme-context.h \
$(srcdir)/eek-theme-private.h \ $(srcdir)/eek-theme-private.h \
$(srcdir)/eek-theme-node.h $(srcdir)/eek-theme-node.h \
$(NULL)
libeek_sources = \ libeek_sources = \
$(srcdir)/eek.c \ $(srcdir)/eek.c \
@ -69,30 +72,36 @@ libeek_sources = \
$(srcdir)/eek-keyboard-drawing.c \ $(srcdir)/eek-keyboard-drawing.c \
$(srcdir)/eek-theme.c \ $(srcdir)/eek-theme.c \
$(srcdir)/eek-theme-context.c \ $(srcdir)/eek-theme-context.c \
$(srcdir)/eek-theme-node.c $(srcdir)/eek-theme-node.c \
$(NULL)
libeek_keysym_sources = \ libeek_keysym_headers = \
$(srcdir)/eek-special-keysym-entries.h \ $(builddir)/eek-special-keysym-entries.h \
$(srcdir)/eek-unicode-keysym-entries.h \ $(builddir)/eek-unicode-keysym-entries.h \
$(srcdir)/eek-xkeysym-keysym-entries.h $(builddir)/eek-xkeysym-keysym-entries.h \
$(NULL)
libeek_enumtypes_sources = \ libeek_enumtypes_sources = \
$(srcdir)/eek-enumtypes.c \ $(builddir)/eek-enumtypes.c \
$(srcdir)/eek-enumtypes.h $(builddir)/eek-enumtypes.h \
$(NULL)
libeek_marshalers_sources = \ libeek_marshalers_sources = \
$(srcdir)/eek-marshalers.c \ $(builddir)/eek-marshalers.c \
$(srcdir)/eek-marshalers.h $(builddir)/eek-marshalers.h \
$(NULL)
BUILT_SOURCES = \ BUILT_SOURCES = \
$(libeek_keysym_sources) \ $(libeek_keysym_headers) \
$(libeek_enumtypes_sources) \ $(libeek_enumtypes_sources) \
$(libeek_marshalers_sources) $(libeek_marshalers_sources) \
$(NULL)
libeek_la_SOURCES = \ libeek_la_SOURCES = \
$(libeek_sources) \ $(libeek_sources) \
$(srcdir)/eek-enumtypes.c \ $(builddir)/eek-enumtypes.c \
$(srcdir)/eek-marshalers.c $(builddir)/eek-marshalers.c \
$(NULL)
libeek_la_CFLAGS = \ libeek_la_CFLAGS = \
-DEEK_COMPILATION=1 \ -DEEK_COMPILATION=1 \
@ -111,12 +120,15 @@ libeek_la_LIBADD = \
libeek_gtk_public_headers = \ libeek_gtk_public_headers = \
$(srcdir)/eek-gtk-keyboard.h \ $(srcdir)/eek-gtk-keyboard.h \
$(srcdir)/eek-gtk.h $(srcdir)/eek-gtk.h \
$(NULL)
libeek_gtk_private_headers = \ libeek_gtk_private_headers = \
$(srcdir)/eek-gtk-renderer.h $(srcdir)/eek-gtk-renderer.h \
$(NULL)
libeek_gtk_sources = \ libeek_gtk_sources = \
$(srcdir)/eek-gtk-keyboard.c \ $(srcdir)/eek-gtk-keyboard.c \
$(srcdir)/eek-gtk-renderer.c $(srcdir)/eek-gtk-renderer.c \
$(NULL)
libeek_gtk_la_SOURCES = $(libeek_gtk_sources) libeek_gtk_la_SOURCES = $(libeek_gtk_sources)
libeek_gtk_la_CFLAGS = -DEEK_COMPILATION=1 $(GTK_CFLAGS) $(LIBCANBERRA_CFLAGS) libeek_gtk_la_CFLAGS = -DEEK_COMPILATION=1 $(GTK_CFLAGS) $(LIBCANBERRA_CFLAGS)
@ -126,11 +138,13 @@ libeek_xkl_public_headers = \
$(srcdir)/eek-xkl-layout.h \ $(srcdir)/eek-xkl-layout.h \
$(srcdir)/eek-xkl.h \ $(srcdir)/eek-xkl.h \
$(srcdir)/eek-xkb-layout.h \ $(srcdir)/eek-xkb-layout.h \
$(srcdir)/eek-xkb.h $(srcdir)/eek-xkb.h \
$(NULL)
libeek_xkl_sources = \ libeek_xkl_sources = \
$(srcdir)/eek-xkb-layout.c \ $(srcdir)/eek-xkb-layout.c \
$(srcdir)/eek-xkl-layout.c $(srcdir)/eek-xkl-layout.c \
$(NULL)
libeek_xkl_la_SOURCES = $(libeek_xkl_sources) libeek_xkl_la_SOURCES = $(libeek_xkl_sources)
libeek_xkl_la_CFLAGS = -DEEK_COMPILATION=1 $(LIBXKLAVIER_CFLAGS) libeek_xkl_la_CFLAGS = -DEEK_COMPILATION=1 $(LIBXKLAVIER_CFLAGS)
@ -139,56 +153,68 @@ libeek_xkl_la_LIBADD = libeek.la $(LIBXKLAVIER_LIBS)
eekdir = $(includedir)/eek-$(EEK_API_VERSION)/eek eekdir = $(includedir)/eek-$(EEK_API_VERSION)/eek
eek_HEADERS = \ eek_HEADERS = \
$(libeek_public_headers) \ $(libeek_public_headers) \
$(srcdir)/eek-enumtypes.h \ $(builddir)/eek-enumtypes.h \
$(libeek_gtk_public_headers) \ $(libeek_gtk_public_headers) \
$(libeek_xkl_public_headers) $(libeek_xkl_public_headers) \
$(NULL)
noinst_HEADERS = \ noinst_HEADERS = \
$(libeek_private_headers) \ $(libeek_private_headers) \
$(libeek_gtk_private_headers) \ $(libeek_gtk_private_headers) \
$(libeek_xkl_private_headers) $(libeek_xkl_private_headers) \
$(NULL)
eek-special-keysym-entries.h: special-keysym-entries.txt eek-special-keysym-entries.h: special-keysym-entries.txt
$(AM_V_GEN) $(PYTHON) ./gen-keysym-entries.py special_keysym_entries \ $(AM_V_GEN) $(PYTHON) $(srcdir)/gen-keysym-entries.py \
special_keysym_entries \
< $< > $@ < $< > $@
eek-unicode-keysym-entries.h: unicode-keysym-entries.txt eek-unicode-keysym-entries.h: unicode-keysym-entries.txt
$(AM_V_GEN) $(PYTHON) ./gen-keysym-entries.py unicode_keysym_entries \ $(AM_V_GEN) $(PYTHON) $(srcdir)/gen-keysym-entries.py \
unicode_keysym_entries \
< $< > $@ < $< > $@
eek-xkeysym-keysym-entries.h: xkeysym-keysym-entries.txt eek-xkeysym-keysym-entries.h: xkeysym-keysym-entries.txt
$(AM_V_GEN) $(PYTHON) ./gen-keysym-entries.py xkeysym_keysym_entries \ $(AM_V_GEN) $(PYTHON) $(srcdir)/gen-keysym-entries.py \
xkeysym_keysym_entries \
< $< > $@ < $< > $@
eek-enumtypes.h: $(libeek_public_headers) eek-enumtypes.h.template eek-enumtypes.h: $(libeek_public_headers) eek-enumtypes.h.template
$(AM_V_GEN) $(GLIB_MKENUMS) --template eek-enumtypes.h.template \ $(AM_V_GEN) $(GLIB_MKENUMS) \
--template $(srcdir)/eek-enumtypes.h.template \
$(libeek_public_headers) > eek-enumtypes.h.tmp && \ $(libeek_public_headers) > eek-enumtypes.h.tmp && \
mv eek-enumtypes.h.tmp eek-enumtypes.h mv eek-enumtypes.h.tmp eek-enumtypes.h
eek-enumtypes.c: $(libeek_public_headers) eek-enumtypes.c.template eek-enumtypes.c: $(libeek_public_headers) eek-enumtypes.c.template
$(AM_V_GEN) $(GLIB_MKENUMS) --template eek-enumtypes.c.template \ $(AM_V_GEN) $(GLIB_MKENUMS) \
--template $(srcdir)/eek-enumtypes.c.template \
$(libeek_public_headers) > eek-enumtypes.c.tmp && \ $(libeek_public_headers) > eek-enumtypes.c.tmp && \
mv eek-enumtypes.c.tmp eek-enumtypes.c mv eek-enumtypes.c.tmp eek-enumtypes.c
# gen marshal # gen marshal
eek-marshalers.h: eek-marshalers.list eek-marshalers.h: eek-marshalers.list
$(AM_V_GEN) $(GLIB_GENMARSHAL) --prefix=_eek_marshal $(srcdir)/eek-marshalers.list --header --internal > $@.tmp && \ $(AM_V_GEN) $(GLIB_GENMARSHAL) \
--prefix=_eek_marshal $(srcdir)/eek-marshalers.list \
--header --internal > $@.tmp && \
mv $@.tmp $@ mv $@.tmp $@
eek-marshalers.c: eek-marshalers.list eek-marshalers.h eek-marshalers.c: eek-marshalers.list eek-marshalers.h
$(AM_V_GEN) (echo "#include \"eek-marshalers.h\""; \ $(AM_V_GEN) (echo "#include \"eek-marshalers.h\""; \
$(GLIB_GENMARSHAL) --prefix=_eek_marshal $(srcdir)/eek-marshalers.list --body --internal) > $@.tmp && \ $(GLIB_GENMARSHAL) --prefix=_eek_marshal \
$(srcdir)/eek-marshalers.list --body --internal) > $@.tmp && \
mv $@.tmp $@ mv $@.tmp $@
pkgconfigdir = $(libdir)/pkgconfig pkgconfigdir = $(libdir)/pkgconfig
pkgconfig_DATA = \ pkgconfig_DATA = \
eek-$(EEK_API_VERSION).pc \ eek-$(EEK_API_VERSION).pc \
eek-gtk-$(EEK_API_VERSION).pc \ eek-gtk-$(EEK_API_VERSION).pc \
eek-xkl-$(EEK_API_VERSION).pc eek-xkl-$(EEK_API_VERSION).pc \
$(NULL)
CLEANFILES = CLEANFILES =
DISTCLEANFILES = \ DISTCLEANFILES = \
$(BUILT_SOURCES) \ $(BUILT_SOURCES) \
$(pkgconfig_DATA) $(pkgconfig_DATA) \
$(NULL)
EXTRA_DIST = \ EXTRA_DIST = \
gen-keysym-entries.py \ gen-keysym-entries.py \
@ -197,7 +223,8 @@ EXTRA_DIST = \
xkeysym-keysym-entries.txt \ xkeysym-keysym-entries.txt \
eek-enumtypes.h.template \ eek-enumtypes.h.template \
eek-enumtypes.c.template \ eek-enumtypes.c.template \
eek-marshalers.list eek-marshalers.list \
$(NULL)
-include $(INTROSPECTION_MAKEFILE) -include $(INTROSPECTION_MAKEFILE)
INTROSPECTION_GIRS = INTROSPECTION_GIRS =
@ -207,29 +234,57 @@ INTROSPECTION_COMPILER_ARGS = --includedir=$(srcdir)
if HAVE_INTROSPECTION if HAVE_INTROSPECTION
Eek@EEK_LIBRARY_SUFFIX@.gir: libeek.la Eek@EEK_LIBRARY_SUFFIX@.gir: libeek.la
Eek@EEK_LIBRARY_SUFFIX_U@_gir_SCANNERFLAGS = --strip-prefix=Eek --pkg=glib-2.0 --pkg-export=eek-$(EEK_API_VERSION) Eek@EEK_LIBRARY_SUFFIX_U@_gir_SCANNERFLAGS = \
--identifier-prefix=Eek \
--symbol-prefix=eek \
--pkg=glib-2.0 \
--pkg-export=eek-$(EEK_API_VERSION) \
$(NULL)
Eek@EEK_LIBRARY_SUFFIX_U@_gir_INCLUDES = GLib-2.0 GObject-2.0 Gio-2.0 Eek@EEK_LIBRARY_SUFFIX_U@_gir_INCLUDES = GLib-2.0 GObject-2.0 Gio-2.0
Eek@EEK_LIBRARY_SUFFIX_U@_gir_CFLAGS = $(libeek_la_CFLAGS) Eek@EEK_LIBRARY_SUFFIX_U@_gir_CFLAGS = $(libeek_la_CFLAGS)
Eek@EEK_LIBRARY_SUFFIX_U@_gir_LIBS = libeek.la Eek@EEK_LIBRARY_SUFFIX_U@_gir_LIBS = libeek.la
Eek@EEK_LIBRARY_SUFFIX_U@_gir_FILES = $(libeek_sources) $(libeek_public_headers) $(srcdir)/eek-enumtypes.h Eek@EEK_LIBRARY_SUFFIX_U@_gir_FILES = \
$(libeek_sources) \
$(libeek_public_headers) \
$(builddir)/eek-enumtypes.h \
$(NULL)
EekGtk@EEK_LIBRARY_SUFFIX@.gir: libeek-gtk.la Eek@EEK_LIBRARY_SUFFIX@.gir EekGtk@EEK_LIBRARY_SUFFIX@.gir: libeek-gtk.la Eek@EEK_LIBRARY_SUFFIX@.gir
EekGtk@EEK_LIBRARY_SUFFIX_U@_gir_SCANNERFLAGS = --pkg-export=eek-gtk-$(EEK_API_VERSION) EekGtk@EEK_LIBRARY_SUFFIX_U@_gir_SCANNERFLAGS = \
EekGtk@EEK_LIBRARY_SUFFIX_U@_gir_INCLUDES = GObject-2.0 Gtk-@GTK_API_VERSION@ Eek@EEK_LIBRARY_SUFFIX@ --identifier-prefix=Eek \
--symbol-prefix=eek \
--pkg-export=eek-gtk-$(EEK_API_VERSION) \
$(NULL)
EekGtk@EEK_LIBRARY_SUFFIX_U@_gir_INCLUDES = \
GObject-2.0 \
Gtk-@GTK_API_VERSION@ \
Eek@EEK_LIBRARY_SUFFIX@ \
$(NULL)
EekGtk@EEK_LIBRARY_SUFFIX_U@_gir_CFLAGS = $(libeek_gtk_la_CFLAGS) EekGtk@EEK_LIBRARY_SUFFIX_U@_gir_CFLAGS = $(libeek_gtk_la_CFLAGS)
EekGtk@EEK_LIBRARY_SUFFIX_U@_gir_LIBS = libeek-gtk.la EekGtk@EEK_LIBRARY_SUFFIX_U@_gir_LIBS = libeek-gtk.la
EekGtk@EEK_LIBRARY_SUFFIX_U@_gir_FILES = $(libeek_gtk_sources) $(libeek_gtk_public_headers) EekGtk@EEK_LIBRARY_SUFFIX_U@_gir_FILES = \
$(libeek_gtk_sources) \
$(libeek_gtk_public_headers) \
$(NULL)
EekXkl@EEK_LIBRARY_SUFFIX@.gir: libeek-xkl.la Eek@EEK_LIBRARY_SUFFIX@.gir EekXkl@EEK_LIBRARY_SUFFIX@.gir: libeek-xkl.la Eek@EEK_LIBRARY_SUFFIX@.gir
EekXkl@EEK_LIBRARY_SUFFIX_U@_gir_SCANNERFLAGS = \
--identifier-prefix=Eek \
--symbol-prefix=eek \
$(NULL)
EekXkl@EEK_LIBRARY_SUFFIX_U@_gir_INCLUDES = GObject-2.0 Eek@EEK_LIBRARY_SUFFIX@ EekXkl@EEK_LIBRARY_SUFFIX_U@_gir_INCLUDES = GObject-2.0 Eek@EEK_LIBRARY_SUFFIX@
EekXkl@EEK_LIBRARY_SUFFIX_U@_gir_CFLAGS = $(libeek_xkl_la_CFLAGS) EekXkl@EEK_LIBRARY_SUFFIX_U@_gir_CFLAGS = $(libeek_xkl_la_CFLAGS)
EekXkl@EEK_LIBRARY_SUFFIX_U@_gir_LIBS = libeek-xkl.la EekXkl@EEK_LIBRARY_SUFFIX_U@_gir_LIBS = libeek-xkl.la
EekXkl@EEK_LIBRARY_SUFFIX_U@_gir_FILES = $(libeek_xkl_sources) $(libeek_xkl_public_headers) EekXkl@EEK_LIBRARY_SUFFIX_U@_gir_FILES = \
$(libeek_xkl_sources) \
$(libeek_xkl_public_headers) \
$(NULL)
INTROSPECTION_GIRS += \ INTROSPECTION_GIRS += \
Eek@EEK_LIBRARY_SUFFIX@.gir \ Eek@EEK_LIBRARY_SUFFIX@.gir \
EekGtk@EEK_LIBRARY_SUFFIX@.gir \ EekGtk@EEK_LIBRARY_SUFFIX@.gir \
EekXkl@EEK_LIBRARY_SUFFIX@.gir EekXkl@EEK_LIBRARY_SUFFIX@.gir \
$(NULL)
girdir = $(datadir)/gir-1.0 girdir = $(datadir)/gir-1.0
gir_DATA = $(INTROSPECTION_GIRS) gir_DATA = $(INTROSPECTION_GIRS)
@ -239,3 +294,5 @@ typelib_DATA = $(INTROSPECTION_GIRS:.gir=.typelib)
CLEANFILES += $(gir_DATA) $(typelib_DATA) CLEANFILES += $(gir_DATA) $(typelib_DATA)
endif endif
-include $(top_srcdir)/git.mk

View File

@ -311,7 +311,7 @@ eek_element_set_name (EekElement *element,
* Get the name of @element. * Get the name of @element.
* Returns: the name of @element or NULL when the name is not set * Returns: the name of @element or NULL when the name is not set
*/ */
G_CONST_RETURN gchar * const gchar *
eek_element_get_name (EekElement *element) eek_element_get_name (EekElement *element)
{ {
g_return_val_if_fail (EEK_IS_ELEMENT(element), NULL); g_return_val_if_fail (EEK_IS_ELEMENT(element), NULL);

View File

@ -58,45 +58,45 @@ struct _EekElementClass
gint level); gint level);
}; };
GType eek_element_get_type (void) G_GNUC_CONST; GType eek_element_get_type (void) G_GNUC_CONST;
void eek_element_set_parent (EekElement *element, void eek_element_set_parent (EekElement *element,
EekElement *parent); EekElement *parent);
EekElement *eek_element_get_parent (EekElement *element); EekElement *eek_element_get_parent (EekElement *element);
void eek_element_set_name (EekElement *element, void eek_element_set_name (EekElement *element,
const gchar *name); const gchar *name);
G_CONST_RETURN gchar *eek_element_get_name (EekElement *element); const gchar *eek_element_get_name (EekElement *element);
void eek_element_set_bounds (EekElement *element, void eek_element_set_bounds (EekElement *element,
EekBounds *bounds); EekBounds *bounds);
void eek_element_get_bounds (EekElement *element, void eek_element_get_bounds (EekElement *element,
EekBounds *bounds); EekBounds *bounds);
void eek_element_set_position (EekElement *element, void eek_element_set_position (EekElement *element,
gdouble x, gdouble x,
gdouble y); gdouble y);
void eek_element_set_size (EekElement *element, void eek_element_set_size (EekElement *element,
gdouble width, gdouble width,
gdouble height); gdouble height);
void eek_element_get_absolute_position (EekElement *element, void eek_element_get_absolute_position (EekElement *element,
gdouble *x, gdouble *x,
gdouble *y); gdouble *y);
void eek_element_set_symbol_index (EekElement *element, void eek_element_set_symbol_index (EekElement *element,
gint group, gint group,
gint level); gint level);
void eek_element_get_symbol_index (EekElement *element, void eek_element_get_symbol_index (EekElement *element,
gint *group, gint *group,
gint *level); gint *level);
void eek_element_set_group (EekElement *element, void eek_element_set_group (EekElement *element,
gint group); gint group);
void eek_element_set_level (EekElement *element, void eek_element_set_level (EekElement *element,
gint level); gint level);
gint eek_element_get_group (EekElement *element); gint eek_element_get_group (EekElement *element);
gint eek_element_get_level (EekElement *element); gint eek_element_get_level (EekElement *element);
G_END_DECLS G_END_DECLS
#endif /* EEK_ELEMENT_H */ #endif /* EEK_ELEMENT_H */

View File

@ -232,6 +232,9 @@ eek_gtk_keyboard_real_motion_notify_event (GtkWidget *self,
EekGtkKeyboardPrivate *priv = EEK_GTK_KEYBOARD_GET_PRIVATE(self); EekGtkKeyboardPrivate *priv = EEK_GTK_KEYBOARD_GET_PRIVATE(self);
EekKey *key; EekKey *key;
if (event->state == 0)
return FALSE;
key = eek_renderer_find_key_by_position (priv->renderer, key = eek_renderer_find_key_by_position (priv->renderer,
(gdouble)event->x, (gdouble)event->x,
(gdouble)event->y); (gdouble)event->y);
@ -275,6 +278,30 @@ eek_gtk_keyboard_real_unmap (GtkWidget *self)
GTK_WIDGET_CLASS (eek_gtk_keyboard_parent_class)->unmap (self); GTK_WIDGET_CLASS (eek_gtk_keyboard_parent_class)->unmap (self);
} }
static gboolean
eek_gtk_keyboard_real_query_tooltip (GtkWidget *widget,
gint x,
gint y,
gboolean keyboard_tooltip,
GtkTooltip *tooltip)
{
EekGtkKeyboardPrivate *priv = EEK_GTK_KEYBOARD_GET_PRIVATE(widget);
EekKey *key;
key = eek_renderer_find_key_by_position (priv->renderer,
(gdouble)x,
(gdouble)y);
if (key) {
EekSymbol *symbol = eek_key_get_symbol (key);
const gchar *text = eek_symbol_get_tooltip (symbol);
if (text) {
gtk_tooltip_set_text (tooltip, text);
return TRUE;
}
}
return FALSE;
}
static void static void
eek_gtk_keyboard_set_keyboard (EekGtkKeyboard *self, eek_gtk_keyboard_set_keyboard (EekGtkKeyboard *self,
EekKeyboard *keyboard) EekKeyboard *keyboard)
@ -397,6 +424,8 @@ eek_gtk_keyboard_class_init (EekGtkKeyboardClass *klass)
eek_gtk_keyboard_real_button_release_event; eek_gtk_keyboard_real_button_release_event;
widget_class->motion_notify_event = widget_class->motion_notify_event =
eek_gtk_keyboard_real_motion_notify_event; eek_gtk_keyboard_real_motion_notify_event;
widget_class->query_tooltip =
eek_gtk_keyboard_real_query_tooltip;
gobject_class->set_property = eek_gtk_keyboard_set_property; gobject_class->set_property = eek_gtk_keyboard_set_property;
gobject_class->dispose = eek_gtk_keyboard_dispose; gobject_class->dispose = eek_gtk_keyboard_dispose;

View File

@ -40,6 +40,7 @@ enum {
PROP_CATEGORY, PROP_CATEGORY,
PROP_MODIFIER_MASK, PROP_MODIFIER_MASK,
PROP_ICON_NAME, PROP_ICON_NAME,
PROP_TOOLTIP,
PROP_LAST PROP_LAST
}; };
@ -49,6 +50,7 @@ struct _EekSymbolPrivate {
EekSymbolCategory category; EekSymbolCategory category;
EekModifierType modifier_mask; EekModifierType modifier_mask;
gchar *icon_name; gchar *icon_name;
gchar *tooltip;
}; };
static void eek_serializable_iface_init (EekSerializableIface *iface); static void eek_serializable_iface_init (EekSerializableIface *iface);
@ -71,6 +73,7 @@ eek_symbol_real_serialize (EekSerializable *self,
g_variant_builder_add (builder, "u", priv->category); g_variant_builder_add (builder, "u", priv->category);
g_variant_builder_add (builder, "u", priv->modifier_mask); g_variant_builder_add (builder, "u", priv->modifier_mask);
g_variant_builder_add (builder, "s", NOTNULL(priv->icon_name)); g_variant_builder_add (builder, "s", NOTNULL(priv->icon_name));
g_variant_builder_add (builder, "s", NOTNULL(priv->tooltip));
#undef NOTNULL #undef NOTNULL
} }
@ -86,6 +89,7 @@ eek_symbol_real_deserialize (EekSerializable *self,
g_variant_get_child (variant, index++, "u", &priv->category); g_variant_get_child (variant, index++, "u", &priv->category);
g_variant_get_child (variant, index++, "u", &priv->modifier_mask); g_variant_get_child (variant, index++, "u", &priv->modifier_mask);
g_variant_get_child (variant, index++, "s", &priv->icon_name); g_variant_get_child (variant, index++, "s", &priv->icon_name);
g_variant_get_child (variant, index++, "s", &priv->tooltip);
return index; return index;
} }
@ -121,6 +125,10 @@ eek_symbol_set_property (GObject *object,
eek_symbol_set_icon_name (EEK_SYMBOL(object), eek_symbol_set_icon_name (EEK_SYMBOL(object),
g_value_get_string (value)); g_value_get_string (value));
break; break;
case PROP_TOOLTIP:
eek_symbol_set_tooltip (EEK_SYMBOL(object),
g_value_get_string (value));
break;
default: default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break; break;
@ -151,6 +159,10 @@ eek_symbol_get_property (GObject *object,
g_value_set_string (value, g_value_set_string (value,
eek_symbol_get_icon_name (EEK_SYMBOL(object))); eek_symbol_get_icon_name (EEK_SYMBOL(object)));
break; break;
case PROP_TOOLTIP:
g_value_set_string (value,
eek_symbol_get_tooltip (EEK_SYMBOL(object)));
break;
default: default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break; break;
@ -165,6 +177,7 @@ eek_symbol_finalize (GObject *object)
g_free (priv->name); g_free (priv->name);
g_free (priv->label); g_free (priv->label);
g_free (priv->icon_name); g_free (priv->icon_name);
g_free (priv->tooltip);
G_OBJECT_CLASS (eek_symbol_parent_class)->finalize (object); G_OBJECT_CLASS (eek_symbol_parent_class)->finalize (object);
} }
@ -216,6 +229,13 @@ eek_symbol_class_init (EekSymbolClass *klass)
NULL, NULL,
G_PARAM_CONSTRUCT | G_PARAM_READWRITE); G_PARAM_CONSTRUCT | G_PARAM_READWRITE);
g_object_class_install_property (gobject_class, PROP_ICON_NAME, pspec); g_object_class_install_property (gobject_class, PROP_ICON_NAME, pspec);
pspec = g_param_spec_string ("tooltip",
"Tooltip",
"Tooltip text",
NULL,
G_PARAM_CONSTRUCT | G_PARAM_READWRITE);
g_object_class_install_property (gobject_class, PROP_TOOLTIP, pspec);
} }
static void static void
@ -265,7 +285,7 @@ eek_symbol_set_name (EekSymbol *symbol,
* *
* Get the name of @symbol. * Get the name of @symbol.
*/ */
G_CONST_RETURN gchar * const gchar *
eek_symbol_get_name (EekSymbol *symbol) eek_symbol_get_name (EekSymbol *symbol)
{ {
EekSymbolPrivate *priv; EekSymbolPrivate *priv;
@ -304,7 +324,7 @@ eek_symbol_set_label (EekSymbol *symbol,
* *
* Get the label text of @symbol. * Get the label text of @symbol.
*/ */
G_CONST_RETURN gchar * const gchar *
eek_symbol_get_label (EekSymbol *symbol) eek_symbol_get_label (EekSymbol *symbol)
{ {
EekSymbolPrivate *priv; EekSymbolPrivate *priv;
@ -428,7 +448,7 @@ eek_symbol_set_icon_name (EekSymbol *symbol,
* *
* Get the icon name of @symbol. * Get the icon name of @symbol.
*/ */
G_CONST_RETURN gchar * const gchar *
eek_symbol_get_icon_name (EekSymbol *symbol) eek_symbol_get_icon_name (EekSymbol *symbol)
{ {
EekSymbolPrivate *priv; EekSymbolPrivate *priv;
@ -441,6 +461,45 @@ eek_symbol_get_icon_name (EekSymbol *symbol)
return priv->icon_name; return priv->icon_name;
} }
/**
* eek_symbol_set_tooltip:
* @symbol: an #EekSymbol
* @tooltip: icon name of @symbol
*
* Set the tooltip text of @symbol to @tooltip.
*/
void
eek_symbol_set_tooltip (EekSymbol *symbol,
const gchar *tooltip)
{
EekSymbolPrivate *priv;
g_return_if_fail (EEK_IS_SYMBOL(symbol));
priv = EEK_SYMBOL_GET_PRIVATE(symbol);
g_free (priv->tooltip);
priv->tooltip = g_strdup (tooltip);
}
/**
* eek_symbol_get_tooltip:
* @symbol: an #EekSymbol
*
* Get the tooltip text of @symbol.
*/
const gchar *
eek_symbol_get_tooltip (EekSymbol *symbol)
{
EekSymbolPrivate *priv;
g_return_val_if_fail (EEK_IS_SYMBOL(symbol), NULL);
priv = EEK_SYMBOL_GET_PRIVATE(symbol);
if (priv->tooltip == NULL || *priv->tooltip == '\0')
return NULL;
return priv->tooltip;
}
static const struct { static const struct {
EekSymbolCategory category; EekSymbolCategory category;
gchar *name; gchar *name;
@ -456,7 +515,7 @@ static const struct {
{ EEK_SYMBOL_CATEGORY_UNKNOWN, NULL } { EEK_SYMBOL_CATEGORY_UNKNOWN, NULL }
}; };
G_CONST_RETURN gchar * const gchar *
eek_symbol_category_get_name (EekSymbolCategory category) eek_symbol_category_get_name (EekSymbolCategory category)
{ {
gint i; gint i;

View File

@ -89,32 +89,31 @@ struct _EekSymbolClass {
GObjectClass parent_class; GObjectClass parent_class;
}; };
GType eek_symbol_get_type (void) G_GNUC_CONST; GType eek_symbol_get_type (void) G_GNUC_CONST;
EekSymbol *eek_symbol_new (const gchar *name); EekSymbol *eek_symbol_new (const gchar *name);
void eek_symbol_set_name (EekSymbol *symbol, void eek_symbol_set_name (EekSymbol *symbol,
const gchar *name); const gchar *name);
G_CONST_RETURN gchar *eek_symbol_get_name (EekSymbol *symbol); const gchar *eek_symbol_get_name (EekSymbol *symbol);
void eek_symbol_set_label (EekSymbol *symbol, void eek_symbol_set_label (EekSymbol *symbol,
const gchar *label); const gchar *label);
G_CONST_RETURN gchar *eek_symbol_get_label (EekSymbol *symbol); const gchar *eek_symbol_get_label (EekSymbol *symbol);
void eek_symbol_set_category (EekSymbol *symbol, void eek_symbol_set_category (EekSymbol *symbol,
EekSymbolCategory category); EekSymbolCategory category);
EekSymbolCategory eek_symbol_get_category (EekSymbol *symbol); EekSymbolCategory eek_symbol_get_category (EekSymbol *symbol);
EekModifierType eek_symbol_get_modifier_mask EekModifierType eek_symbol_get_modifier_mask (EekSymbol *symbol);
(EekSymbol *symbol); void eek_symbol_set_modifier_mask (EekSymbol *symbol,
void eek_symbol_set_modifier_mask EekModifierType mask);
(EekSymbol *symbol, gboolean eek_symbol_is_modifier (EekSymbol *symbol);
EekModifierType mask); void eek_symbol_set_icon_name (EekSymbol *symbol,
gboolean eek_symbol_is_modifier (EekSymbol *symbol); const gchar *icon_name);
void eek_symbol_set_icon_name (EekSymbol *symbol, const gchar *eek_symbol_get_icon_name (EekSymbol *symbol);
const gchar *icon_name); void eek_symbol_set_tooltip (EekSymbol *symbol,
G_CONST_RETURN gchar *eek_symbol_get_icon_name (EekSymbol *symbol); const gchar *tooltip);
const gchar * eek_symbol_get_tooltip (EekSymbol *symbol);
G_CONST_RETURN gchar *eek_symbol_category_get_name const gchar *eek_symbol_category_get_name (EekSymbolCategory category);
(EekSymbolCategory category); EekSymbolCategory eek_symbol_category_from_name (const gchar *name);
EekSymbolCategory eek_symbol_category_from_name
(const gchar *name);
G_END_DECLS G_END_DECLS

View File

@ -44,7 +44,11 @@
#include "eek-key.h" #include "eek-key.h"
#include "eek-keysym.h" #include "eek-keysym.h"
#define noKBDRAW_DEBUG #define XKB_COMPONENT_MASK (XkbGBN_GeometryMask | \
XkbGBN_KeyNamesMask | \
XkbGBN_OtherNamesMask | \
XkbGBN_SymbolsMask | \
XkbGBN_IndicatorMapMask)
static void initable_iface_init (GInitableIface *initable_iface); static void initable_iface_init (GInitableIface *initable_iface);
@ -58,9 +62,6 @@ G_DEFINE_TYPE_WITH_CODE (EekXkbLayout, eek_xkb_layout, EEK_TYPE_LAYOUT,
enum { enum {
PROP_0, PROP_0,
PROP_DISPLAY, PROP_DISPLAY,
PROP_KEYCODES,
PROP_GEOMETRY,
PROP_SYMBOLS,
PROP_LAST PROP_LAST
}; };
@ -83,19 +84,18 @@ struct _EekXkbLayoutPrivate
gint scale_denominator; gint scale_denominator;
}; };
static guint static guint find_keycode (EekXkbLayout *layout,
find_keycode (EekXkbLayout *layout, gchar *key_name); gchar *key_name);
static void static gboolean get_keyboard_from_server (EekXkbLayout *layout,
get_keyboard (EekXkbLayout *layout); GError **error);
static void static gboolean get_names_from_server (EekXkbLayout *layout,
get_names (EekXkbLayout *layout); GError **error);
static void static void setup_scaling (EekXkbLayout *layout,
setup_scaling (EekXkbLayout *layout, gdouble width,
gdouble width, gdouble height);
gdouble height);
G_INLINE_FUNC gint G_INLINE_FUNC gint
xkb_to_pixmap_coord (EekXkbLayout *layout, xkb_to_pixmap_coord (EekXkbLayout *layout,
@ -149,7 +149,8 @@ create_key (EekXkbLayout *layout,
xkbshape->primary; xkbshape->primary;
outline = g_slice_new (EekOutline); outline = g_slice_new (EekOutline);
outline->corner_radius = xkb_to_pixmap_coord(layout, xkboutline->corner_radius); outline->corner_radius = xkb_to_pixmap_coord(layout,
xkboutline->corner_radius);
if (xkboutline->num_points <= 2) { /* rectangular */ if (xkboutline->num_points <= 2) { /* rectangular */
gdouble x1, y1, x2, y2; gdouble x1, y1, x2, y2;
@ -370,24 +371,11 @@ eek_xkb_layout_set_property (GObject *object,
GParamSpec *pspec) GParamSpec *pspec)
{ {
EekXkbLayout *layout = EEK_XKB_LAYOUT (object); EekXkbLayout *layout = EEK_XKB_LAYOUT (object);
const gchar *name;
switch (prop_id) { switch (prop_id) {
case PROP_DISPLAY: case PROP_DISPLAY:
layout->priv->display = g_value_get_pointer (value); layout->priv->display = g_value_get_pointer (value);
break; break;
case PROP_KEYCODES:
name = g_value_get_string (value);
eek_xkb_layout_set_keycodes (EEK_XKB_LAYOUT(object), name);
break;
case PROP_GEOMETRY:
name = g_value_get_string (value);
eek_xkb_layout_set_geometry (EEK_XKB_LAYOUT(object), name);
break;
case PROP_SYMBOLS:
name = g_value_get_string (value);
eek_xkb_layout_set_symbols (EEK_XKB_LAYOUT(object), name);
break;
default: default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break; break;
@ -401,24 +389,11 @@ eek_xkb_layout_get_property (GObject *object,
GParamSpec *pspec) GParamSpec *pspec)
{ {
EekXkbLayout *layout = EEK_XKB_LAYOUT (object); EekXkbLayout *layout = EEK_XKB_LAYOUT (object);
const gchar *name;
switch (prop_id) { switch (prop_id) {
case PROP_DISPLAY: case PROP_DISPLAY:
g_value_set_pointer (value, layout->priv->display); g_value_set_pointer (value, layout->priv->display);
break; break;
case PROP_KEYCODES:
name = eek_xkb_layout_get_keycodes (EEK_XKB_LAYOUT(object));
g_value_set_string (value, name);
break;
case PROP_GEOMETRY:
name = eek_xkb_layout_get_geometry (EEK_XKB_LAYOUT(object));
g_value_set_string (value, name);
break;
case PROP_SYMBOLS:
name = eek_xkb_layout_get_symbols (EEK_XKB_LAYOUT(object));
g_value_set_string (value, name);
break;
default: default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break; break;
@ -446,27 +421,6 @@ eek_xkb_layout_class_init (EekXkbLayoutClass *klass)
G_PARAM_READWRITE | G_PARAM_READWRITE |
G_PARAM_CONSTRUCT_ONLY); G_PARAM_CONSTRUCT_ONLY);
g_object_class_install_property (gobject_class, PROP_DISPLAY, pspec); g_object_class_install_property (gobject_class, PROP_DISPLAY, pspec);
pspec = g_param_spec_string ("keycodes",
"Keycodes",
"XKB keycodes component name",
NULL,
G_PARAM_READWRITE);
g_object_class_install_property (gobject_class, PROP_KEYCODES, pspec);
pspec = g_param_spec_string ("geometry",
"Geometry",
"XKB geometry component name",
NULL,
G_PARAM_READWRITE);
g_object_class_install_property (gobject_class, PROP_GEOMETRY, pspec);
pspec = g_param_spec_string ("symbols",
"Symbols",
"XKB symbols component name",
NULL,
G_PARAM_READWRITE);
g_object_class_install_property (gobject_class, PROP_SYMBOLS, pspec);
} }
static void static void
@ -475,8 +429,9 @@ eek_xkb_layout_init (EekXkbLayout *self)
self->priv = EEK_XKB_LAYOUT_GET_PRIVATE (self); self->priv = EEK_XKB_LAYOUT_GET_PRIVATE (self);
} }
static void static gboolean
get_names (EekXkbLayout *layout) get_names_from_server (EekXkbLayout *layout,
GError **error)
{ {
EekXkbLayoutPrivate *priv = layout->priv; EekXkbLayoutPrivate *priv = layout->priv;
gchar *name; gchar *name;
@ -524,6 +479,8 @@ get_names (EekXkbLayout *layout)
XFree (name); XFree (name);
} }
} }
return TRUE;
} }
/** /**
@ -546,252 +503,76 @@ eek_xkb_layout_new (Display *display,
* eek_xkb_layout_set_names: (skip) * eek_xkb_layout_set_names: (skip)
* @layout: an #EekXkbLayout * @layout: an #EekXkbLayout
* @names: XKB component names * @names: XKB component names
* @error: a #GError
* *
* Set the XKB component names to @layout. * Set the XKB component names to @layout.
* Returns: %TRUE if any of the component names changed, %FALSE otherwise * Returns: %TRUE if the component names are successfully set, %FALSE otherwise
*/ */
gboolean gboolean
eek_xkb_layout_set_names (EekXkbLayout *layout, XkbComponentNamesRec *names) eek_xkb_layout_set_names (EekXkbLayout *layout,
XkbComponentNamesRec *names,
GError **error)
{ {
EekXkbLayoutPrivate *priv = EEK_XKB_LAYOUT_GET_PRIVATE (layout); if (g_strcmp0 (names->keycodes, layout->priv->names.keycodes)) {
gboolean retval; g_free (layout->priv->names.keycodes);
layout->priv->names.keycodes = g_strdup (names->keycodes);
g_return_val_if_fail (priv, FALSE);
if (g_strcmp0 (names->keycodes, priv->names.keycodes)) {
g_free (priv->names.keycodes);
priv->names.keycodes = g_strdup (names->keycodes);
retval = TRUE;
} }
if (g_strcmp0 (names->geometry, priv->names.geometry)) { if (g_strcmp0 (names->geometry, layout->priv->names.geometry)) {
g_free (priv->names.geometry); g_free (layout->priv->names.geometry);
priv->names.geometry = g_strdup (names->geometry); layout->priv->names.geometry = g_strdup (names->geometry);
retval = TRUE;
} }
if (g_strcmp0 (names->symbols, priv->names.symbols)) { if (g_strcmp0 (names->symbols, layout->priv->names.symbols)) {
g_free (priv->names.symbols); g_free (layout->priv->names.symbols);
priv->names.symbols = g_strdup (names->symbols); layout->priv->names.symbols = g_strdup (names->symbols);
retval = TRUE;
} }
get_keyboard (layout); return get_keyboard_from_server (layout, error);
g_assert (priv->xkb);
return retval;
} }
/** static gboolean
* eek_xkb_layout_set_names_full: get_keyboard_from_server (EekXkbLayout *layout,
* @layout: an #EekXkbLayout GError **error)
* @Varargs: pairs of component name and value, terminated by NULL.
*
* Set the XKB component names to @layout. This function is merely a
* wrapper around eek_xkb_layout_set_names() to avoid passing a
* pointer of XkbComponentNamesRec, which is not currently available
* in the gobject-introspection repository.
*
* Available component names are: keymap, keycodes, types, compat,
* symbols, geometry.
*
* Returns: %TRUE if the component name is successfully set, %FALSE otherwise
* Since: 0.0.2
*/
gboolean
eek_xkb_layout_set_names_full (EekXkbLayout *layout,
...)
{
va_list var_args;
gboolean retval;
va_start (var_args, layout);
retval = eek_xkb_layout_set_names_full_valist (layout, var_args);
va_end (var_args);
return retval;
}
/**
* eek_xkb_layout_set_names_full_valist:
* @layout: an #EekXkbLayout
* @var_args: <type>va_list</type> of pairs of component name and value.
*
* See eek_xkb_layout_set_names_full(), this version takes a
* <type>va_list</type> for language bindings to use.
*
* Since: 0.0.5
*/
gboolean
eek_xkb_layout_set_names_full_valist (EekXkbLayout *layout,
va_list var_args)
{
XkbComponentNamesRec names;
gchar *name, *value;
memset (&names, 0, sizeof names);
name = va_arg (var_args, gchar *);
while (name) {
value = va_arg (var_args, gchar *);
if (g_strcmp0 (name, "keymap") == 0)
names.keymap = (char *)value;
else if (g_strcmp0 (name, "keycodes") == 0)
names.keycodes = (char *)value;
else if (g_strcmp0 (name, "types") == 0)
names.types = (char *)value;
else if (g_strcmp0 (name, "compat") == 0)
names.compat = (char *)value;
else if (g_strcmp0 (name, "symbols") == 0)
names.symbols = (char *)value;
else if (g_strcmp0 (name, "geometry") == 0)
names.geometry = (char *)value;
name = va_arg (var_args, gchar *);
}
return eek_xkb_layout_set_names (layout, &names);
}
/**
* eek_xkb_layout_set_keycodes:
* @layout: an #EekXkbLayout
* @keycodes: component name for keycodes
*
* Set the keycodes component (in the XKB terminology).
* Returns: %TRUE if the component name is successfully set, %FALSE otherwise
*/
gboolean
eek_xkb_layout_set_keycodes (EekXkbLayout *layout, const gchar *keycodes)
{
EekXkbLayoutPrivate *priv = EEK_XKB_LAYOUT_GET_PRIVATE (layout);
XkbComponentNamesRec names;
g_return_val_if_fail (priv, FALSE);
memcpy (&names, &priv->names, sizeof names);
names.keycodes = (gchar *)keycodes;
return eek_xkb_layout_set_names (layout, &names);
}
/**
* eek_xkb_layout_set_geometry:
* @layout: an #EekXkbLayout
* @geometry: component name for geometry
*
* Returns: %TRUE if the component name is successfully set, %FALSE otherwise
*/
gboolean
eek_xkb_layout_set_geometry (EekXkbLayout *layout, const gchar *geometry)
{
EekXkbLayoutPrivate *priv = EEK_XKB_LAYOUT_GET_PRIVATE (layout);
XkbComponentNamesRec names;
g_return_val_if_fail (priv, FALSE);
memcpy (&names, &priv->names, sizeof names);
names.geometry = (gchar *)geometry;
return eek_xkb_layout_set_names (layout, &names);
}
/**
* eek_xkb_layout_set_symbols:
* @layout: an #EekXkbLayout
* @symbols: component name for symbols
*
* Set the symbols component (in the XKB terminology).
* Returns: %TRUE if the component name is successfully set, %FALSE otherwise
*/
gboolean
eek_xkb_layout_set_symbols (EekXkbLayout *layout, const gchar *symbols)
{
EekXkbLayoutPrivate *priv = EEK_XKB_LAYOUT_GET_PRIVATE (layout);
XkbComponentNamesRec names;
g_return_val_if_fail (priv, FALSE);
memcpy (&names, &priv->names, sizeof names);
names.symbols = (gchar *)symbols;
return eek_xkb_layout_set_names (layout, &names);
}
/**
* eek_xkb_layout_get_keycodes:
* @layout: an #EekXkbLayout
*
* Get the keycodes component name (in the XKB terminology).
*/
G_CONST_RETURN gchar *
eek_xkb_layout_get_keycodes (EekXkbLayout *layout)
{
EekXkbLayoutPrivate *priv = EEK_XKB_LAYOUT_GET_PRIVATE (layout);
g_return_val_if_fail (priv, NULL);
return priv->names.keycodes;
}
/**
* eek_xkb_layout_get_geometry:
* @layout: an #EekXkbLayout
*
* Get the geometry component name (in the XKB terminology).
*/
G_CONST_RETURN gchar *
eek_xkb_layout_get_geometry (EekXkbLayout *layout)
{
EekXkbLayoutPrivate *priv = EEK_XKB_LAYOUT_GET_PRIVATE (layout);
g_return_val_if_fail (priv, NULL);
return priv->names.geometry;
}
/**
* eek_xkb_layout_get_symbols:
* @layout: an #EekXkbLayout
*
* Get the symbols component name (in the XKB terminology).
*/
G_CONST_RETURN gchar *
eek_xkb_layout_get_symbols (EekXkbLayout *layout)
{
EekXkbLayoutPrivate *priv = EEK_XKB_LAYOUT_GET_PRIVATE (layout);
g_return_val_if_fail (priv, NULL);
return priv->names.symbols;
}
static void
get_keyboard (EekXkbLayout *layout)
{ {
EekXkbLayoutPrivate *priv = layout->priv; EekXkbLayoutPrivate *priv = layout->priv;
if (priv->xkb) if (priv->xkb) {
XkbFreeKeyboard (priv->xkb, 0, TRUE); /* free_all = TRUE */ XkbFreeKeyboard (priv->xkb, 0, True);
priv->xkb = NULL; priv->xkb = NULL;
}
if (priv->names.keycodes && if (priv->names.keycodes && priv->names.geometry && priv->names.symbols) {
priv->names.geometry && priv->xkb = XkbGetKeyboardByName (priv->display,
priv->names.symbols) { XkbUseCoreKbd,
priv->xkb = XkbGetKeyboardByName (priv->display, XkbUseCoreKbd, &priv->names,
&priv->names, 0, 0,
XkbGBN_GeometryMask | XKB_COMPONENT_MASK,
XkbGBN_KeyNamesMask | False);
XkbGBN_OtherNamesMask |
XkbGBN_ClientSymbolsMask |
XkbGBN_IndicatorMapMask, FALSE);
} else { } else {
priv->xkb = XkbGetKeyboard (priv->display, priv->xkb = XkbGetKeyboard (priv->display,
XkbGBN_GeometryMask | XKB_COMPONENT_MASK,
XkbGBN_KeyNamesMask |
XkbGBN_OtherNamesMask |
XkbGBN_SymbolsMask |
XkbGBN_IndicatorMapMask,
XkbUseCoreKbd); XkbUseCoreKbd);
get_names (layout); if (!get_names_from_server (layout, error)) {
XkbFreeKeyboard (priv->xkb, 0, True);
priv->xkb = NULL;
}
} }
if (priv->xkb == NULL) { if (priv->xkb == NULL) {
g_set_error (error,
EEK_ERROR,
EEK_ERROR_LAYOUT_ERROR,
"can't get keyboard from server");
g_free (priv->names.keycodes); g_free (priv->names.keycodes);
priv->names.keycodes = NULL; priv->names.keycodes = NULL;
g_free (priv->names.geometry); g_free (priv->names.geometry);
priv->names.geometry = NULL; priv->names.geometry = NULL;
g_free (priv->names.symbols); g_free (priv->names.symbols);
priv->names.symbols = NULL; priv->names.symbols = NULL;
return FALSE;
} }
return TRUE;
} }
@ -810,11 +591,6 @@ find_keycode (EekXkbLayout *layout, gchar *key_name)
if (!priv->xkb) if (!priv->xkb)
return EEK_INVALID_KEYCODE; return EEK_INVALID_KEYCODE;
#ifdef KBDRAW_DEBUG
printf (" looking for keycode for (%c%c%c%c)\n",
key_name[0], key_name[1], key_name[2], key_name[3]);
#endif
pkey = priv->xkb->names->keys + priv->xkb->min_key_code; pkey = priv->xkb->names->keys + priv->xkb->min_key_code;
for (keycode = priv->xkb->min_key_code; for (keycode = priv->xkb->min_key_code;
keycode <= priv->xkb->max_key_code; keycode++) { keycode <= priv->xkb->max_key_code; keycode++) {
@ -829,12 +605,8 @@ find_keycode (EekXkbLayout *layout, gchar *key_name)
break; break;
} }
} }
if (is_name_matched) { if (is_name_matched)
#ifdef KBDRAW_DEBUG
printf (" found keycode %u\n", keycode);
#endif
return keycode; return keycode;
}
pkey++; pkey++;
} }
@ -854,9 +626,6 @@ find_keycode (EekXkbLayout *layout, gchar *key_name)
if (is_name_matched) { if (is_name_matched) {
keycode = find_keycode (layout, palias->real); keycode = find_keycode (layout, palias->real);
#ifdef KBDRAW_DEBUG
printf ("found alias keycode %u\n", keycode);
#endif
return keycode; return keycode;
} }
palias++; palias++;
@ -894,34 +663,11 @@ initable_init (GInitable *initable,
{ {
EekXkbLayout *layout = EEK_XKB_LAYOUT (initable); EekXkbLayout *layout = EEK_XKB_LAYOUT (initable);
/* XXX: XkbClientMapMask | XkbIndicatorMapMask | XkbNamesMask | if (!get_keyboard_from_server (layout, error))
XkbGeometryMask */
layout->priv->xkb = XkbGetKeyboard (layout->priv->display,
XkbGBN_GeometryMask |
XkbGBN_KeyNamesMask |
XkbGBN_OtherNamesMask |
XkbGBN_SymbolsMask |
XkbGBN_IndicatorMapMask,
XkbUseCoreKbd);
if (layout->priv->xkb == NULL) {
g_set_error (error,
EEK_ERROR,
EEK_ERROR_LAYOUT_ERROR,
"can't get initial XKB keyboard configuration");
return FALSE; return FALSE;
}
get_names (layout); if (!get_names_from_server (layout, error))
get_keyboard (layout);
if (layout->priv->xkb == NULL) {
g_set_error (error,
EEK_ERROR,
EEK_ERROR_LAYOUT_ERROR,
"can't get XKB keyboard configuration");
return FALSE; return FALSE;
}
return TRUE; return TRUE;
} }

View File

@ -60,29 +60,13 @@ struct _EekXkbLayoutClass
gpointer pdummy[24]; gpointer pdummy[24];
}; };
GType eek_xkb_layout_get_type (void) G_GNUC_CONST; GType eek_xkb_layout_get_type (void) G_GNUC_CONST;
EekLayout *eek_xkb_layout_new (Display *display, EekLayout *eek_xkb_layout_new (Display *display,
GError **error); GError **error);
gboolean eek_xkb_layout_set_names (EekXkbLayout *layout, gboolean eek_xkb_layout_set_names (EekXkbLayout *layout,
XkbComponentNamesRec *names); XkbComponentNamesRec *names,
GError **error);
gboolean eek_xkb_layout_set_names_full (EekXkbLayout *layout,
...);
gboolean eek_xkb_layout_set_names_full_valist
(EekXkbLayout *layout,
va_list var_args);
gboolean eek_xkb_layout_set_keycodes (EekXkbLayout *layout,
const gchar *keycodes);
gboolean eek_xkb_layout_set_geometry (EekXkbLayout *layout,
const gchar *geometry);
gboolean eek_xkb_layout_set_symbols (EekXkbLayout *layout,
const gchar *symbols);
const gchar *eek_xkb_layout_get_keycodes (EekXkbLayout *layout);
const gchar *eek_xkb_layout_get_geometry (EekXkbLayout *layout);
const gchar *eek_xkb_layout_get_symbols (EekXkbLayout *layout);
G_END_DECLS G_END_DECLS
#endif /* #ifndef EEK_XKB_LAYOUT_H */ #endif /* #ifndef EEK_XKB_LAYOUT_H */

View File

@ -589,7 +589,12 @@ set_xkb_component_names (EekXklLayout *layout, XklConfigRec *config)
#endif #endif
if (xkl_xkb_config_native_prepare (priv->engine, config, &names)) { if (xkl_xkb_config_native_prepare (priv->engine, config, &names)) {
retval = eek_xkb_layout_set_names (EEK_XKB_LAYOUT(layout), &names); GError *error = NULL;
retval = eek_xkb_layout_set_names (EEK_XKB_LAYOUT(layout),
&names,
&error);
if (!retval)
g_warning ("can't set XKB layout");
xkl_xkb_config_native_cleanup (priv->engine, &names); xkl_xkb_config_native_cleanup (priv->engine, &names);
} }
return retval; return retval;

View File

@ -571,6 +571,7 @@ struct _SymbolsParseData {
GSList *symbols; GSList *symbols;
gchar *label; gchar *label;
gchar *icon; gchar *icon;
gchar *tooltip;
EekSymbolCategory category; EekSymbolCategory category;
guint keyval; guint keyval;
gint groups; gint groups;
@ -683,6 +684,11 @@ symbols_start_element_callback (GMarkupParseContext *pcontext,
if (attribute != NULL) if (attribute != NULL)
data->icon = g_strdup (attribute); data->icon = g_strdup (attribute);
attribute = get_attribute (attribute_names, attribute_values,
"tooltip");
if (attribute != NULL)
data->tooltip = g_strdup (attribute);
attribute = get_attribute (attribute_names, attribute_values, attribute = get_attribute (attribute_names, attribute_values,
"category"); "category");
if (attribute != NULL) if (attribute != NULL)
@ -766,6 +772,11 @@ symbols_end_element_callback (GMarkupParseContext *pcontext,
g_free (data->icon); g_free (data->icon);
data->icon = NULL; data->icon = NULL;
} }
if (data->tooltip) {
eek_symbol_set_tooltip (symbol, data->tooltip);
g_free (data->tooltip);
data->tooltip = NULL;
}
data->symbols = g_slist_prepend (data->symbols, symbol); data->symbols = g_slist_prepend (data->symbols, symbol);
goto out; goto out;

View File

@ -16,55 +16,69 @@
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
# 02110-1301 USA # 02110-1301 USA
NULL =
lib_LTLIBRARIES = libeekboard.la lib_LTLIBRARIES = libeekboard.la
libeekboard_headers = \ libeekboard_headers = \
eekboard-service.h \ $(srcdir)/eekboard-service.h \
eekboard-context-service.h \ $(srcdir)/eekboard-context-service.h \
eekboard-client.h \ $(srcdir)/eekboard-client.h \
eekboard-context.h \ $(srcdir)/eekboard-context.h \
eekboard-xklutil.h $(srcdir)/eekboard-xklutil.h \
$(NULL)
libeekboard_private_headers = \ libeekboard_private_headers = \
eekboard-marshalers.h $(builddir)/eekboard-marshalers.h \
$(NULL)
libeekboard_sources = \ libeekboard_sources = \
eekboard-service.c \ $(srcdir)/eekboard-service.c \
eekboard-context-service.c \ $(srcdir)/eekboard-context-service.c \
eekboard-client.c \ $(srcdir)/eekboard-client.c \
eekboard-context.c \ $(srcdir)/eekboard-context.c \
eekboard-xklutil.c $(srcdir)/eekboard-xklutil.c \
$(NULL)
libeekboard_marshalers_sources = \ libeekboard_marshalers_sources = \
eekboard-marshalers.c \ $(builddir)/eekboard-marshalers.c \
eekboard-marshalers.h $(builddir)/eekboard-marshalers.h \
$(NULL)
BUILT_SOURCES = \ BUILT_SOURCES = \
$(libeekboard_marshalers_sources) $(libeekboard_marshalers_sources) \
$(NULL)
libeekboard_la_SOURCES = \ libeekboard_la_SOURCES = \
$(libeekboard_sources) \ $(libeekboard_sources) \
eekboard-marshalers.c $(builddir)/eekboard-marshalers.c \
$(NULL)
libeekboard_la_CFLAGS = \ libeekboard_la_CFLAGS = \
-DEEKBOARD_COMPILATION=1 \ -DEEKBOARD_COMPILATION=1 \
-DKEYBOARDDIR=\"$(pkgdatadir)/keyboards\" \ -DKEYBOARDDIR=\"$(pkgdatadir)/keyboards\" \
-I$(top_srcdir) \ -I$(top_srcdir) \
$(GIO2_CFLAGS) \ $(GIO2_CFLAGS) \
$(LIBXKLAVIER_CFLAGS) $(LIBXKLAVIER_CFLAGS) \
$(NULL)
libeekboard_la_LIBADD = \ libeekboard_la_LIBADD = \
$(top_builddir)/eek/libeek.la \ $(top_builddir)/eek/libeek.la \
$(top_builddir)/eek/libeek-xkl.la \ $(top_builddir)/eek/libeek-xkl.la \
$(GIO2_LIBS) \ $(GIO2_LIBS) \
$(LIBXKLAVIER_LIBS) $(LIBXKLAVIER_LIBS) \
$(NULL)
eekboarddir = $(includedir)/eekboard-$(EEK_API_VERSION)/eekboard eekboarddir = $(includedir)/eekboard-$(EEK_API_VERSION)/eekboard
eekboard_HEADERS = $(libeekboard_headers) eekboard_HEADERS = $(libeekboard_headers)
pkgconfigdir = $(libdir)/pkgconfig pkgconfigdir = $(libdir)/pkgconfig
pkgconfig_DATA = \ pkgconfig_DATA = \
eekboard-$(EEK_API_VERSION).pc eekboard-$(EEK_API_VERSION).pc \
$(NULL)
DISTCLEANFILES = \ DISTCLEANFILES = \
$(BUILT_SOURCES) \ $(BUILT_SOURCES) \
$(pkgconfig_DATA) $(pkgconfig_DATA) \
$(NULL)
CLEANFILES = CLEANFILES =
@ -72,22 +86,37 @@ EXTRA_DIST = eekboard-marshalers.list
# gen marshal # gen marshal
eekboard-marshalers.h: eekboard-marshalers.list eekboard-marshalers.h: eekboard-marshalers.list
$(AM_V_GEN) $(GLIB_GENMARSHAL) --prefix=_eekboard_marshal $(srcdir)/eekboard-marshalers.list --header --internal > $@.tmp && \ $(AM_V_GEN) $(GLIB_GENMARSHAL) \
--prefix=_eekboard_marshal \
$(srcdir)/eekboard-marshalers.list --header --internal \
> $@.tmp && \
mv $@.tmp $@ mv $@.tmp $@
eekboard-marshalers.c: eekboard-marshalers.list eekboard-marshalers.h eekboard-marshalers.c: eekboard-marshalers.list eekboard-marshalers.h
$(AM_V_GEN) (echo "#include \"eekboard-marshalers.h\""; \ $(AM_V_GEN) (echo "#include \"eekboard-marshalers.h\""; \
$(GLIB_GENMARSHAL) --prefix=_eekboard_marshal $(srcdir)/eekboard-marshalers.list --body --internal) > $@.tmp && \ $(GLIB_GENMARSHAL) \
--prefix=_eekboard_marshal \
$(srcdir)/eekboard-marshalers.list --body --internal) \
> $@.tmp && \
mv $@.tmp $@ mv $@.tmp $@
-include $(INTROSPECTION_MAKEFILE) -include $(INTROSPECTION_MAKEFILE)
INTROSPECTION_GIRS = INTROSPECTION_GIRS =
INTROSPECTION_SCANNER_ARGS = --add-include-path=$(builddir) --add-include-path=$(top_builddir)/eek INTROSPECTION_SCANNER_ARGS = \
INTROSPECTION_COMPILER_ARGS = --includedir=$(srcdir) --includedir=$(top_srcdir)/eek --add-include-path=$(builddir) \
--add-include-path=$(top_builddir)/eek \
$(NULL)
INTROSPECTION_COMPILER_ARGS = \
--includedir=$(builddir) \
--includedir=$(top_builddir)/eek \
$(NULL)
if HAVE_INTROSPECTION if HAVE_INTROSPECTION
Eekboard@EEK_LIBRARY_SUFFIX@.gir: libeekboard.la Eekboard@EEK_LIBRARY_SUFFIX@.gir: libeekboard.la
Eekboard@EEK_LIBRARY_SUFFIX_U@_gir_SCANNERFLAGS = --strip-prefix=Eekboard Eekboard@EEK_LIBRARY_SUFFIX_U@_gir_SCANNERFLAGS = \
--identifier-prefix=Eekboard \
--symbol-prefix=eekboard \
$(NULL)
Eekboard@EEK_LIBRARY_SUFFIX_U@_gir_INCLUDES = Eek@EEK_LIBRARY_SUFFIX@ Eekboard@EEK_LIBRARY_SUFFIX_U@_gir_INCLUDES = Eek@EEK_LIBRARY_SUFFIX@
Eekboard@EEK_LIBRARY_SUFFIX_U@_gir_CFLAGS = $(libeekboard_la_CFLAGS) Eekboard@EEK_LIBRARY_SUFFIX_U@_gir_CFLAGS = $(libeekboard_la_CFLAGS)
Eekboard@EEK_LIBRARY_SUFFIX_U@_gir_LIBS = libeekboard.la Eekboard@EEK_LIBRARY_SUFFIX_U@_gir_LIBS = libeekboard.la
@ -103,3 +132,5 @@ typelib_DATA = $(INTROSPECTION_GIRS:.gir=.typelib)
CLEANFILES += $(gir_DATA) $(typelib_DATA) CLEANFILES += $(gir_DATA) $(typelib_DATA)
endif endif
-include $(top_srcdir)/git.mk

View File

@ -325,6 +325,38 @@ eekboard_client_pop_context (EekboardClient *client,
NULL); NULL);
} }
void
eekboard_client_show_keyboard (EekboardClient *client,
GCancellable *cancellable)
{
g_return_if_fail (EEKBOARD_IS_CLIENT(client));
g_dbus_proxy_call (G_DBUS_PROXY(client),
"ShowKeyboard",
NULL,
G_DBUS_CALL_FLAGS_NONE,
-1,
cancellable,
eekboard_async_ready_callback,
NULL);
}
void
eekboard_client_hide_keyboard (EekboardClient *client,
GCancellable *cancellable)
{
g_return_if_fail (EEKBOARD_IS_CLIENT(client));
g_dbus_proxy_call (G_DBUS_PROXY(client),
"HideKeyboard",
NULL,
G_DBUS_CALL_FLAGS_NONE,
-1,
cancellable,
eekboard_async_ready_callback,
NULL);
}
static void static void
send_destroy_context (EekboardClient *client, send_destroy_context (EekboardClient *client,
EekboardContext *context, EekboardContext *context,

View File

@ -67,6 +67,10 @@ void eekboard_client_push_context (EekboardClient *eekboard,
GCancellable *cancellable); GCancellable *cancellable);
void eekboard_client_pop_context (EekboardClient *eekboard, void eekboard_client_pop_context (EekboardClient *eekboard,
GCancellable *cancellable); GCancellable *cancellable);
void eekboard_client_show_keyboard (EekboardClient *eekboard,
GCancellable *cancellable);
void eekboard_client_hide_keyboard (EekboardClient *eekboard,
GCancellable *cancellable);
void eekboard_client_destroy_context (EekboardClient *eekboard, void eekboard_client_destroy_context (EekboardClient *eekboard,
EekboardContext *context, EekboardContext *context,
GCancellable *cancellable); GCancellable *cancellable);

View File

@ -31,7 +31,7 @@
#include "eekboard/eekboard-context-service.h" #include "eekboard/eekboard-context-service.h"
#include "eekboard/eekboard-xklutil.h" #include "eekboard/eekboard-xklutil.h"
#include "eek/eek-xkl.h" //#include "eek/eek-xkl.h" //x11_stub
#define CSW 640 #define CSW 640
#define CSH 480 #define CSH 480
@ -173,7 +173,7 @@ eekboard_context_service_real_create_keyboard (EekboardContextService *self,
display = XOpenDisplay (NULL); display = XOpenDisplay (NULL);
error = NULL; error = NULL;
layout = eek_xkl_layout_new (display, &error); //layout = eek_xkl_layout_new (display, &error); //x11_stub
if (layout == NULL) { if (layout == NULL) {
g_warning ("can't create keyboard %s: %s", g_warning ("can't create keyboard %s: %s",
keyboard_type, error->message); keyboard_type, error->message);
@ -181,10 +181,14 @@ eekboard_context_service_real_create_keyboard (EekboardContextService *self,
return NULL; return NULL;
} }
/*
//x11_stub
if (!eek_xkl_layout_set_config (EEK_XKL_LAYOUT(layout), rec)) { if (!eek_xkl_layout_set_config (EEK_XKL_LAYOUT(layout), rec)) {
g_object_unref (layout); g_object_unref (layout);
return NULL; return NULL;
} }
*/
} else { } else {
error = NULL; error = NULL;
layout = eek_xml_layout_new (keyboard_type, &error); layout = eek_xml_layout_new (keyboard_type, &error);
@ -201,6 +205,26 @@ eekboard_context_service_real_create_keyboard (EekboardContextService *self,
return keyboard; return keyboard;
} }
static void
eekboard_context_service_real_show_keyboard (EekboardContextService *self)
{
gboolean visible = self->priv->visible;
self->priv->visible = TRUE;
if (visible != self->priv->visible)
emit_visibility_changed_signal (self,
self->priv->visible);
}
static void
eekboard_context_service_real_hide_keyboard (EekboardContextService *self)
{
gboolean visible = self->priv->visible;
self->priv->visible = FALSE;
if (visible != self->priv->visible)
emit_visibility_changed_signal (self,
self->priv->visible);
}
static void static void
eekboard_context_service_set_property (GObject *object, eekboard_context_service_set_property (GObject *object,
guint prop_id, guint prop_id,
@ -209,7 +233,6 @@ eekboard_context_service_set_property (GObject *object,
{ {
EekboardContextService *context = EEKBOARD_CONTEXT_SERVICE(object); EekboardContextService *context = EEKBOARD_CONTEXT_SERVICE(object);
GDBusConnection *connection; GDBusConnection *connection;
gboolean was_visible;
switch (prop_id) { switch (prop_id) {
case PROP_OBJECT_PATH: case PROP_OBJECT_PATH:
@ -234,11 +257,12 @@ eekboard_context_service_set_property (GObject *object,
context->priv->keyboard = g_value_get_object (value); context->priv->keyboard = g_value_get_object (value);
break; break;
case PROP_VISIBLE: case PROP_VISIBLE:
was_visible = context->priv->visible; if (context->priv->keyboard) {
context->priv->visible = g_value_get_boolean (value); if (g_value_get_boolean (value))
if (was_visible != context->priv->visible) eekboard_context_service_show_keyboard (context);
emit_visibility_changed_signal (context, else
context->priv->visible); eekboard_context_service_hide_keyboard (context);
}
break; break;
case PROP_FULLSCREEN: case PROP_FULLSCREEN:
context->priv->fullscreen = g_value_get_boolean (value); context->priv->fullscreen = g_value_get_boolean (value);
@ -358,8 +382,8 @@ eekboard_context_service_class_init (EekboardContextServiceClass *klass)
sizeof (EekboardContextServicePrivate)); sizeof (EekboardContextServicePrivate));
klass->create_keyboard = eekboard_context_service_real_create_keyboard; klass->create_keyboard = eekboard_context_service_real_create_keyboard;
klass->show_keyboard = NULL; klass->show_keyboard = eekboard_context_service_real_show_keyboard;
klass->hide_keyboard = NULL; klass->hide_keyboard = eekboard_context_service_real_hide_keyboard;
gobject_class->constructed = eekboard_context_service_constructed; gobject_class->constructed = eekboard_context_service_constructed;
gobject_class->set_property = eekboard_context_service_set_property; gobject_class->set_property = eekboard_context_service_set_property;
@ -730,6 +754,11 @@ handle_method_call (GDBusConnection *connection,
EekboardContextService *context = user_data; EekboardContextService *context = user_data;
EekboardContextServiceClass *klass = EEKBOARD_CONTEXT_SERVICE_GET_CLASS(context); EekboardContextServiceClass *klass = EEKBOARD_CONTEXT_SERVICE_GET_CLASS(context);
if (context->priv->repeat_timeout_id) {
g_source_remove (context->priv->repeat_timeout_id);
context->priv->repeat_timeout_id = 0;
}
if (g_strcmp0 (method_name, "AddKeyboard") == 0) { if (g_strcmp0 (method_name, "AddKeyboard") == 0) {
const gchar *keyboard_type; const gchar *keyboard_type;
static guint keyboard_id = 0; static guint keyboard_id = 0;
@ -864,15 +893,13 @@ handle_method_call (GDBusConnection *connection,
return; return;
} }
if (klass->show_keyboard) eekboard_context_service_show_keyboard (context);
klass->show_keyboard (context);
g_dbus_method_invocation_return_value (invocation, NULL); g_dbus_method_invocation_return_value (invocation, NULL);
return; return;
} }
if (g_strcmp0 (method_name, "HideKeyboard") == 0) { if (g_strcmp0 (method_name, "HideKeyboard") == 0) {
if (klass->hide_keyboard) eekboard_context_service_hide_keyboard (context);
klass->hide_keyboard (context);
g_dbus_method_invocation_return_value (invocation, NULL); g_dbus_method_invocation_return_value (invocation, NULL);
return; return;
} }
@ -999,6 +1026,24 @@ eekboard_context_service_disable (EekboardContextService *context)
} }
} }
void
eekboard_context_service_show_keyboard (EekboardContextService *context)
{
g_return_if_fail (EEKBOARD_IS_CONTEXT_SERVICE(context));
g_return_if_fail (context->priv->connection);
EEKBOARD_CONTEXT_SERVICE_GET_CLASS(context)->show_keyboard (context);
}
void
eekboard_context_service_hide_keyboard (EekboardContextService *context)
{
g_return_if_fail (EEKBOARD_IS_CONTEXT_SERVICE(context));
g_return_if_fail (context->priv->connection);
EEKBOARD_CONTEXT_SERVICE_GET_CLASS(context)->hide_keyboard (context);
}
/** /**
* eekboard_context_service_destroy: * eekboard_context_service_destroy:
* @context: an #EekboardContextService * @context: an #EekboardContextService

View File

@ -84,6 +84,10 @@ GType eekboard_context_service_get_type
(void) G_GNUC_CONST; (void) G_GNUC_CONST;
void eekboard_context_service_enable (EekboardContextService *context); void eekboard_context_service_enable (EekboardContextService *context);
void eekboard_context_service_disable (EekboardContextService *context); void eekboard_context_service_disable (EekboardContextService *context);
void eekboard_context_service_show_keyboard
(EekboardContextService *context);
void eekboard_context_service_hide_keyboard
(EekboardContextService *context);
void eekboard_context_service_destroy (EekboardContextService *context); void eekboard_context_service_destroy (EekboardContextService *context);
EekKeyboard *eekboard_context_service_get_keyboard EekKeyboard *eekboard_context_service_get_keyboard
(EekboardContextService *context); (EekboardContextService *context);

View File

@ -151,7 +151,7 @@ eekboard_context_real_destroyed (EekboardContext *self)
static void static void
eekboard_context_real_key_activated (EekboardContext *self, eekboard_context_real_key_activated (EekboardContext *self,
const gchar *keyname, guint keycode,
EekSymbol *symbol, EekSymbol *symbol,
guint modifiers) guint modifiers)
{ {

View File

@ -55,6 +55,7 @@ struct _EekboardServicePrivate {
GHashTable *context_hash; GHashTable *context_hash;
GSList *context_stack; GSList *context_stack;
gboolean visible;
}; };
G_DEFINE_TYPE (EekboardService, eekboard_service, G_TYPE_OBJECT); G_DEFINE_TYPE (EekboardService, eekboard_service, G_TYPE_OBJECT);
@ -70,6 +71,8 @@ static const gchar introspection_xml[] =
" <arg direction='in' type='s' name='object_path'/>" " <arg direction='in' type='s' name='object_path'/>"
" </method>" " </method>"
" <method name='PopContext'/>" " <method name='PopContext'/>"
" <method name='ShowKeyboard'/>"
" <method name='HideKeyboard'/>"
" <method name='Destroy'/>" " <method name='Destroy'/>"
/* signals */ /* signals */
" </interface>" " </interface>"
@ -358,6 +361,14 @@ context_destroyed_cb (EekboardContextService *context, EekboardService *service)
g_free (object_path); g_free (object_path);
} }
static void
on_notify_visible (GObject *object, GParamSpec *spec, gpointer user_data)
{
EekboardService *service = user_data;
g_object_get (object, "visible", &service->priv->visible, NULL);
}
static void static void
handle_method_call (GDBusConnection *connection, handle_method_call (GDBusConnection *connection,
const gchar *sender, const gchar *sender,
@ -424,6 +435,10 @@ handle_method_call (GDBusConnection *connection,
service->priv->context_stack = g_slist_prepend (service->priv->context_stack, service->priv->context_stack = g_slist_prepend (service->priv->context_stack,
g_object_ref (context)); g_object_ref (context));
eekboard_context_service_enable (context); eekboard_context_service_enable (context);
g_signal_connect (context, "notify::visible",
G_CALLBACK(on_notify_visible), service);
if (service->priv->visible)
eekboard_context_service_show_keyboard (context);
g_dbus_method_invocation_return_value (invocation, NULL); g_dbus_method_invocation_return_value (invocation, NULL);
return; return;
@ -448,6 +463,9 @@ handle_method_call (GDBusConnection *connection,
} }
g_free (object_path); g_free (object_path);
g_signal_handlers_disconnect_by_func (context,
G_CALLBACK(on_notify_visible),
service);
eekboard_context_service_disable (context); eekboard_context_service_disable (context);
service->priv->context_stack = g_slist_next (service->priv->context_stack); service->priv->context_stack = g_slist_next (service->priv->context_stack);
if (service->priv->context_stack) if (service->priv->context_stack)
@ -458,6 +476,24 @@ handle_method_call (GDBusConnection *connection,
return; return;
} }
if (g_strcmp0 (method_name, "ShowKeyboard") == 0) {
if (service->priv->context_stack) {
eekboard_context_service_show_keyboard (service->priv->context_stack->data);
} else {
service->priv->visible = TRUE;
}
return;
}
if (g_strcmp0 (method_name, "HideKeyboard") == 0) {
if (service->priv->context_stack) {
eekboard_context_service_hide_keyboard (service->priv->context_stack->data);
} else {
service->priv->visible = FALSE;
}
return;
}
if (g_strcmp0 (method_name, "Destroy") == 0) { if (g_strcmp0 (method_name, "Destroy") == 0) {
g_signal_emit (service, signals[DESTROYED], 0); g_signal_emit (service, signals[DESTROYED], 0);
g_dbus_method_invocation_return_value (invocation, NULL); g_dbus_method_invocation_return_value (invocation, NULL);

View File

@ -1 +1,3 @@
SUBDIRS = simple-client SUBDIRS = simple-client
-include $(top_srcdir)/git.mk

View File

@ -1 +1,3 @@
EXTRA_DIST = simple-client EXTRA_DIST = simple-client
-include $(top_srcdir)/git.mk

218
git.mk Normal file
View File

@ -0,0 +1,218 @@
# git.mk
#
# Copyright 2009, Red Hat, Inc.
# Copyright 2010,2011 Behdad Esfahbod
# Written by Behdad Esfahbod
#
# Copying and distribution of this file, with or without modification,
# is permitted in any medium without royalty provided the copyright
# notice and this notice are preserved.
#
# The canonical source for this file is https://github.com/behdad/git.mk.
#
# To use in your project, import this file in your git repo's toplevel,
# then do "make -f git.mk". This modifies all Makefile.am files in
# your project to -include git.mk. Remember to add that line to new
# Makefile.am files you create in your project, or just rerun the
# "make -f git.mk".
#
# This enables automatic .gitignore generation. If you need to ignore
# more files, add them to the GITIGNOREFILES variable in your Makefile.am.
# But think twice before doing that. If a file has to be in .gitignore,
# chances are very high that it's a generated file and should be in one
# of MOSTLYCLEANFILES, CLEANFILES, DISTCLEANFILES, or MAINTAINERCLEANFILES.
#
# The only case that you need to manually add a file to GITIGNOREFILES is
# when remove files in one of mostlyclean-local, clean-local, distclean-local,
# or maintainer-clean-local make targets.
#
# Note that for files like editor backup, etc, there are better places to
# ignore them. See "man gitignore".
#
# If "make maintainer-clean" removes the files but they are not recognized
# by this script (that is, if "git status" shows untracked files still), send
# me the output of "git status" as well as your Makefile.am and Makefile for
# the directories involved and I'll diagnose.
#
# For a list of toplevel files that should be in MAINTAINERCLEANFILES, see
# Makefile.am.sample in the git.mk git repo.
#
# Don't EXTRA_DIST this file. It is supposed to only live in git clones,
# not tarballs. It serves no useful purpose in tarballs and clutters the
# build dir.
#
# This file knows how to handle autoconf, automake, libtool, gtk-doc,
# gnome-doc-utils, yelp.m4, mallard, intltool, gsettings, dejagnu.
#
#
# KNOWN ISSUES:
#
# - Recursive configure doesn't work as $(top_srcdir)/git.mk inside the
# submodule doesn't find us. If you have configure.{in,ac} files in
# subdirs, add a proxy git.mk file in those dirs that simply does:
# "include $(top_srcdir)/../git.mk". Add more ..'s to your taste.
# And add those files to git. See vte/gnome-pty-helper/git.mk for
# example.
#
git-all: git-mk-install
git-mk-install:
@echo Installing git makefile
@any_failed=; \
find "`test -z "$(top_srcdir)" && echo . || echo "$(top_srcdir)"`" -name Makefile.am | while read x; do \
if grep 'include .*/git.mk' $$x >/dev/null; then \
echo $$x already includes git.mk; \
else \
failed=; \
echo "Updating $$x"; \
{ cat $$x; \
echo ''; \
echo '-include $$(top_srcdir)/git.mk'; \
} > $$x.tmp || failed=1; \
if test x$$failed = x; then \
mv $$x.tmp $$x || failed=1; \
fi; \
if test x$$failed = x; then : else \
echo Failed updating $$x; >&2 \
any_failed=1; \
fi; \
fi; done; test -z "$$any_failed"
.PHONY: git-all git-mk-install
### .gitignore generation
$(srcdir)/.gitignore: Makefile.am $(top_srcdir)/git.mk
$(AM_V_GEN) \
{ \
if test "x$(DOC_MODULE)" = x -o "x$(DOC_MAIN_SGML_FILE)" = x; then :; else \
for x in \
$(DOC_MODULE)-decl-list.txt \
$(DOC_MODULE)-decl.txt \
tmpl/$(DOC_MODULE)-unused.sgml \
"tmpl/*.bak" \
xml html \
; do echo /$$x; done; \
fi; \
if test "x$(DOC_MODULE)$(DOC_ID)" = x -o "x$(DOC_LINGUAS)" = x; then :; else \
for lc in $(DOC_LINGUAS); do \
for x in \
$(if $(DOC_MODULE),$(DOC_MODULE).xml) \
$(DOC_PAGES) \
$(DOC_INCLUDES) \
; do echo /$$lc/$$x; done; \
done; \
for x in \
$(_DOC_OMF_ALL) \
$(_DOC_DSK_ALL) \
$(_DOC_HTML_ALL) \
$(_DOC_MOFILES) \
$(DOC_H_FILE) \
"*/.xml2po.mo" \
"*/*.omf.out" \
; do echo /$$x; done; \
fi; \
if test "x$(HELP_ID)" = x -o "x$(HELP_LINGUAS)" = x; then :; else \
for lc in $(HELP_LINGUAS); do \
for x in \
$(HELP_FILES) \
"$$lc.stamp" \
"$$lc.mo" \
; do echo /$$lc/$$x; done; \
done; \
fi; \
if test "x$(gsettings_SCHEMAS)" = x; then :; else \
for x in \
$(gsettings_SCHEMAS:.xml=.valid) \
$(gsettings__enum_file) \
; do echo /$$x; done; \
fi; \
if test -f $(srcdir)/po/Makefile.in.in; then \
for x in \
po/Makefile.in.in \
po/Makefile.in \
po/Makefile \
po/POTFILES \
po/stamp-it \
po/.intltool-merge-cache \
"po/*.gmo" \
"po/*.mo" \
po/$(GETTEXT_PACKAGE).pot \
intltool-extract.in \
intltool-merge.in \
intltool-update.in \
; do echo /$$x; done; \
fi; \
if test -f $(srcdir)/configure; then \
for x in \
autom4te.cache \
configure \
config.h \
stamp-h1 \
libtool \
config.lt \
; do echo /$$x; done; \
fi; \
if test "x$(DEJATOOL)" = x; then :; else \
for x in \
$(DEJATOOL) \
; do echo /$$x.sum; echo /$$x.log; done; \
echo /site.exp; \
fi; \
for x in \
.gitignore \
$(GITIGNOREFILES) \
$(CLEANFILES) \
$(PROGRAMS) \
$(check_PROGRAMS) \
$(EXTRA_PROGRAMS) \
$(LTLIBRARIES) \
so_locations \
.libs _libs \
$(MOSTLYCLEANFILES) \
"*.$(OBJEXT)" \
"*.lo" \
$(DISTCLEANFILES) \
$(am__CONFIG_DISTCLEAN_FILES) \
$(CONFIG_CLEAN_FILES) \
TAGS ID GTAGS GRTAGS GSYMS GPATH tags \
"*.tab.c" \
$(MAINTAINERCLEANFILES) \
$(BUILT_SOURCES) \
$(DEPDIR) \
Makefile \
Makefile.in \
"*.orig" \
"*.rej" \
"*.bak" \
"*~" \
".*.sw[nop]" \
".dirstamp" \
; do echo /$$x; done; \
} | \
sed "s@^/`echo "$(srcdir)" | sed 's/\(.\)/[\1]/g'`/@/@" | \
sed 's@/[.]/@/@g' | \
LC_ALL=C sort | uniq > $@.tmp && \
mv $@.tmp $@;
all: $(srcdir)/.gitignore gitignore-recurse-maybe
gitignore-recurse-maybe:
@if test "x$(SUBDIRS)" = "x$(DIST_SUBDIRS)"; then :; else \
$(MAKE) $(AM_MAKEFLAGS) gitignore-recurse; \
fi;
gitignore-recurse:
@for subdir in $(DIST_SUBDIRS); do \
case " $(SUBDIRS) " in \
*" $$subdir "*) :;; \
*) test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) .gitignore gitignore-recurse || echo "Skipping $$subdir");; \
esac; \
done
gitignore: $(srcdir)/.gitignore gitignore-recurse
maintainer-clean: gitignore-clean
gitignore-clean:
-rm -f $(srcdir)/.gitignore
.PHONY: gitignore-clean gitignore gitignore-recurse gitignore-recurse-maybe

View File

@ -128,3 +128,5 @@ noinst_HEADERS = \
$(eekboard_server_headers) \ $(eekboard_server_headers) \
$(eekboard_setup_headers) \ $(eekboard_setup_headers) \
$(NULL) $(NULL)
-include $(top_srcdir)/git.mk

View File

@ -32,14 +32,14 @@
#include "eekboard/eekboard-client.h" #include "eekboard/eekboard-client.h"
#include "client.h" #include "client.h"
#define DEFAULT_KEYBOARD "us"
static gboolean opt_system = FALSE; static gboolean opt_system = FALSE;
static gboolean opt_session = FALSE; static gboolean opt_session = FALSE;
static gchar *opt_address = NULL; static gchar *opt_address = NULL;
static gboolean opt_focus = FALSE; static gboolean opt_focus = FALSE;
#ifdef HAVE_ATSPI
static gboolean opt_keystroke = FALSE; static gboolean opt_keystroke = FALSE;
#endif /* HAVE_ATSPI */
static gchar *opt_keyboards = NULL; static gchar *opt_keyboards = NULL;

View File

@ -44,6 +44,12 @@
#define CSW 640 #define CSW 640
#define CSH 480 #define CSH 480
#define DEFAULT_KEYBOARD "us"
static gchar *default_keyboards[2] = {
DEFAULT_KEYBOARD,
NULL
};
#define IBUS_INTERFACE_PANEL "org.freedesktop.IBus.Panel" #define IBUS_INTERFACE_PANEL "org.freedesktop.IBus.Panel"
enum { enum {
@ -87,7 +93,7 @@ struct _Client {
#ifdef HAVE_XTEST #ifdef HAVE_XTEST
guint modifier_keycodes[8]; guint modifier_keycodes[8];
XkbDescRec *xkb; //XkbDescRec *xkb; //x11_stub
#endif /* HAVE_XTEST */ #endif /* HAVE_XTEST */
GSettings *settings; GSettings *settings;
@ -141,6 +147,7 @@ client_set_property (GObject *object,
{ {
Client *client = CLIENT(object); Client *client = CLIENT(object);
GDBusConnection *connection; GDBusConnection *connection;
gchar **keyboards;
switch (prop_id) { switch (prop_id) {
case PROP_CONNECTION: case PROP_CONNECTION:
@ -166,7 +173,10 @@ client_set_property (GObject *object,
} }
break; break;
case PROP_KEYBOARDS: case PROP_KEYBOARDS:
client_set_keyboards (client, g_value_get_boxed (value)); keyboards = g_value_get_boxed (value);
if (g_strv_length (keyboards) == 0)
keyboards = default_keyboards;
client_set_keyboards (client, (const gchar * const *)keyboards);
break; break;
default: default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
@ -305,7 +315,7 @@ client_set_keyboards (Client *client,
gboolean retval; gboolean retval;
retval = set_keyboards (client, keyboards); retval = set_keyboards (client, keyboards);
if (retval && IS_KEYBOARD_VISIBLE (client)) if (retval && IS_KEYBOARD_VISIBLE (client))
eekboard_context_show_keyboard (client->context, NULL); eekboard_client_show_keyboard (client->eekboard, NULL);
return retval; return retval;
} }
@ -347,7 +357,7 @@ client_enable_xkl (Client *client)
retval = set_keyboards_from_xkl (client); retval = set_keyboards_from_xkl (client);
if (IS_KEYBOARD_VISIBLE (client)) if (IS_KEYBOARD_VISIBLE (client))
eekboard_context_show_keyboard (client->context, NULL); eekboard_client_show_keyboard (client->eekboard, NULL);
return retval; return retval;
} }
@ -538,21 +548,21 @@ focus_listener_cb (const AtspiEvent *event,
case ATSPI_ROLE_TERMINAL: case ATSPI_ROLE_TERMINAL:
if (strncmp (event->type, "focus", 5) == 0 || event->detail1 == 1) { if (strncmp (event->type, "focus", 5) == 0 || event->detail1 == 1) {
client->acc = accessible; client->acc = accessible;
eekboard_context_show_keyboard (client->context, NULL); eekboard_client_show_keyboard (client->eekboard, NULL);
} else if (g_settings_get_boolean (client->settings, "auto-hide") && } else if (g_settings_get_boolean (client->settings, "auto-hide") &&
event->detail1 == 0 && accessible == client->acc) { event->detail1 == 0 && accessible == client->acc) {
client->acc = NULL; client->acc = NULL;
eekboard_context_hide_keyboard (client->context, NULL); eekboard_client_hide_keyboard (client->eekboard, NULL);
} }
break; break;
case ATSPI_ROLE_ENTRY: case ATSPI_ROLE_ENTRY:
if (strncmp (event->type, "focus", 5) == 0 || event->detail1 == 1) { if (strncmp (event->type, "focus", 5) == 0 || event->detail1 == 1) {
client->acc = accessible; client->acc = accessible;
eekboard_context_show_keyboard (client->context, NULL); eekboard_client_show_keyboard (client->eekboard, NULL);
} else if (g_settings_get_boolean (client->settings, "auto-hide") && } else if (g_settings_get_boolean (client->settings, "auto-hide") &&
event->detail1 == 0) { event->detail1 == 0) {
client->acc = NULL; client->acc = NULL;
eekboard_context_hide_keyboard (client->context, NULL); eekboard_client_hide_keyboard (client->eekboard, NULL);
} }
break; break;
@ -560,7 +570,7 @@ focus_listener_cb (const AtspiEvent *event,
; ;
} }
} else { } else {
eekboard_context_hide_keyboard (client->context, NULL); eekboard_client_hide_keyboard (client->eekboard, NULL);
} }
} }
@ -612,7 +622,7 @@ add_match_rule (GDBusConnection *connection,
static gboolean static gboolean
on_hide_keyboard_timeout (Client *client) on_hide_keyboard_timeout (Client *client)
{ {
eekboard_context_hide_keyboard (client->context, NULL); eekboard_client_hide_keyboard (client->eekboard, NULL);
client->hide_keyboard_timeout_id = 0; client->hide_keyboard_timeout_id = 0;
return FALSE; return FALSE;
} }
@ -635,7 +645,7 @@ focus_message_filter (GDBusConnection *connection,
g_source_remove (client->hide_keyboard_timeout_id); g_source_remove (client->hide_keyboard_timeout_id);
client->hide_keyboard_timeout_id = 0; client->hide_keyboard_timeout_id = 0;
} }
eekboard_context_show_keyboard (client->context, NULL); eekboard_client_show_keyboard (client->eekboard, NULL);
} else if (g_settings_get_boolean (client->settings, "auto-hide") && } else if (g_settings_get_boolean (client->settings, "auto-hide") &&
g_strcmp0 (member, "FocusOut") == 0) { g_strcmp0 (member, "FocusOut") == 0) {
guint delay; guint delay;
@ -779,8 +789,8 @@ set_keyboards (Client *client,
for (p = keyboards; *p != NULL; p++) { for (p = keyboards; *p != NULL; p++) {
keyboard_id = eekboard_context_add_keyboard (client->context, *p, NULL); keyboard_id = eekboard_context_add_keyboard (client->context, *p, NULL);
if (keyboard_id == 0) { if (keyboard_id == 0) {
g_slist_free (head); g_warning ("can't add keyboard %s", *p);
return FALSE; continue;
} }
client->keyboards = g_slist_prepend (client->keyboards, client->keyboards = g_slist_prepend (client->keyboards,
GUINT_TO_POINTER(keyboard_id)); GUINT_TO_POINTER(keyboard_id));
@ -848,6 +858,8 @@ get_replaced_keycode (Client *client)
{ {
guint keycode; guint keycode;
/*
//x11_stub_start
for (keycode = client->xkb->max_key_code; for (keycode = client->xkb->max_key_code;
keycode >= client->xkb->min_key_code; keycode >= client->xkb->min_key_code;
--keycode) { --keycode) {
@ -857,6 +869,8 @@ get_replaced_keycode (Client *client)
return keycode; return keycode;
} }
} }
//x11_stub_end
*/
return 0; return 0;
} }
@ -879,6 +893,8 @@ replace_keycode (Client *client,
int keysyms_per_keycode; int keysyms_per_keycode;
KeySym *syms; KeySym *syms;
/*
//x11_stub_start
g_return_val_if_fail (client->xkb->min_key_code <= keycode && g_return_val_if_fail (client->xkb->min_key_code <= keycode &&
keycode <= client->xkb->max_key_code, keycode <= client->xkb->max_key_code,
FALSE); FALSE);
@ -891,6 +907,8 @@ replace_keycode (Client *client,
XSync (xdisplay, False); XSync (xdisplay, False);
XFree (syms); XFree (syms);
*keysym = old_keysym; *keysym = old_keysym;
//x11_stub_end
*/
return TRUE; return TRUE;
} }
@ -1007,7 +1025,9 @@ send_fake_key_events (Client *client,
if (eek_symbol_is_modifier (symbol)) if (eek_symbol_is_modifier (symbol))
return; return;
/* If symbol is a text, convert chars in it to keysym */ /*
//x11_stub_start
// If symbol is a text, convert chars in it to keysym
if (EEK_IS_TEXT(symbol)) { if (EEK_IS_TEXT(symbol)) {
const gchar *utf8 = eek_text_get_text (EEK_TEXT(symbol)); const gchar *utf8 = eek_text_get_text (EEK_TEXT(symbol));
glong items_written; glong items_written;
@ -1031,6 +1051,8 @@ send_fake_key_events (Client *client,
g_free (ucs4); g_free (ucs4);
return; return;
} }
//x11_stub_end
*/
if (EEK_IS_KEYSYM(symbol)) { if (EEK_IS_KEYSYM(symbol)) {
guint xkeysym = eek_keysym_get_xkeysym (EEK_KEYSYM(symbol)); guint xkeysym = eek_keysym_get_xkeysym (EEK_KEYSYM(symbol));
@ -1121,9 +1143,13 @@ client_enable_xtest (Client *client)
return FALSE; return FALSE;
} }
/*
//x11_stub_start
if (!client->xkb) if (!client->xkb)
client->xkb = XkbGetMap (xdisplay, XkbKeySymsMask, XkbUseCoreKbd); client->xkb = XkbGetMap (xdisplay, XkbKeySymsMask, XkbUseCoreKbd);
g_assert (client->xkb); g_assert (client->xkb);
//x11_stub_end
*/
update_modifier_keycodes (client); update_modifier_keycodes (client);
@ -1137,9 +1163,13 @@ client_enable_xtest (Client *client)
void void
client_disable_xtest (Client *client) client_disable_xtest (Client *client)
{ {
/*
//x11_stub_start
if (client->xkb) { if (client->xkb) {
XkbFreeKeyboard (client->xkb, 0, TRUE); /* free_all = TRUE */ XkbFreeKeyboard (client->xkb, 0, TRUE); // free_all = TRUE
client->xkb = NULL; client->xkb = NULL;
} }
//x11_stub+end
*/
} }
#endif /* HAVE_XTEST */ #endif /* HAVE_XTEST */

View File

@ -242,7 +242,7 @@ set_geometry (ServerContextService *context)
else else
height = (width / bounds.width) * bounds.height; height = (width / bounds.width) * bounds.height;
gtk_widget_set_size_request (context->widget, width, height); gtk_window_resize (GTK_WINDOW(context->widget), width, height);
gtk_window_move (GTK_WINDOW(context->window), gtk_window_move (GTK_WINDOW(context->window),
(rect.width - width) / 2, (rect.width - width) / 2,
@ -259,9 +259,9 @@ set_geometry (ServerContextService *context)
G_CALLBACK(on_size_allocate_set_dock), G_CALLBACK(on_size_allocate_set_dock),
context); context);
} else { } else {
gtk_widget_set_size_request (context->widget, gtk_window_resize (GTK_WINDOW(context->window),
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));
@ -301,6 +301,8 @@ update_widget (ServerContextService *context)
eek_gtk_keyboard_set_theme (EEK_GTK_KEYBOARD(context->widget), theme); eek_gtk_keyboard_set_theme (EEK_GTK_KEYBOARD(context->widget), theme);
g_object_unref (theme); g_object_unref (theme);
gtk_widget_set_has_tooltip (context->widget, TRUE);
if (!context->window) { if (!context->window) {
context->window = gtk_window_new (GTK_WINDOW_TOPLEVEL); context->window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
g_signal_connect (context->window, "destroy", g_signal_connect (context->window, "destroy",
@ -330,6 +332,9 @@ server_context_service_real_show_keyboard (EekboardContextService *_context)
update_widget (context); update_widget (context);
g_assert (context->window); g_assert (context->window);
gtk_widget_show_all (context->window); gtk_widget_show_all (context->window);
EEKBOARD_CONTEXT_SERVICE_CLASS (server_context_service_parent_class)->
show_keyboard (_context);
} }
static void static void
@ -339,6 +344,9 @@ server_context_service_real_hide_keyboard (EekboardContextService *_context)
if (context->window) if (context->window)
gtk_widget_hide (context->window); gtk_widget_hide (context->window);
EEKBOARD_CONTEXT_SERVICE_CLASS (server_context_service_parent_class)->
hide_keyboard (_context);
} }
static void static void

View File

@ -28,3 +28,5 @@ eek_simple_test_LDADD = $(top_builddir)/eek/libeek.la $(GIO2_LIBS)
eek_xml_test_SOURCES = eek-xml-test.c eek_xml_test_SOURCES = eek-xml-test.c
eek_xml_test_LDADD = $(top_builddir)/eek/libeek.la $(top_builddir)/eek/libeek-xkl.la $(GIO2_LIBS) $(GTK_LIBS) eek_xml_test_LDADD = $(top_builddir)/eek/libeek.la $(top_builddir)/eek/libeek-xkl.la $(GIO2_LIBS) $(GTK_LIBS)
-include $(top_srcdir)/git.mk