Compare commits
56 Commits
eekboard-0
...
eekboard-0
| Author | SHA1 | Date | |
|---|---|---|---|
| cf4d1109d3 | |||
| c7c6d06907 | |||
| 384d43bb80 | |||
| 29c55b6ca3 | |||
| 910b0be5a5 | |||
| 706fa6310b | |||
| 248699d771 | |||
| 6343e37bc1 | |||
| f562e8c212 | |||
| 8ff00226e2 | |||
| c72c75083c | |||
| 862a54eac3 | |||
| 12bc18e1ba | |||
| f045bd0d50 | |||
| dfe06468ed | |||
| 3fda8da1a5 | |||
| d0a5715f8c | |||
| 6b83bb8503 | |||
| 69f1dba96a | |||
| dcbdd7ff63 | |||
| 9b28a011e7 | |||
| 350598dc55 | |||
| ae9df021c2 | |||
| d7cb78ecf5 | |||
| ef2e9acf1e | |||
| 7f52069e41 | |||
| 9a5c0d9cdc | |||
| 551fb17e02 | |||
| b5b9864033 | |||
| a2d2ef3a5e | |||
| b09a586357 | |||
| 70f3bc5308 | |||
| 8bc7b754bc | |||
| 3d5160455a | |||
| 983cc22761 | |||
| 6d80e4cacb | |||
| 1c5a271177 | |||
| e4891ccf6b | |||
| 48bfc7485f | |||
| 2e297ab1ef | |||
| 828fc553b4 | |||
| 08e1a6c69a | |||
| 039ea44520 | |||
| 65c1abbe27 | |||
| 0ab5a0f114 | |||
| 94219bd31e | |||
| 7c2457e659 | |||
| a156453301 | |||
| c2e53ec9a9 | |||
| 687b2a83b4 | |||
| a1f7d628bb | |||
| 789ee66836 | |||
| 9ec42b66f3 | |||
| b2b44a0810 | |||
| 59076afcb5 | |||
| 5ab24250bc |
4
.gitignore
vendored
4
.gitignore
vendored
@ -34,6 +34,8 @@ eek/eek-special-keysym-labels.h
|
||||
eek/eek-unicode-keysym-labels.h
|
||||
eek/eek-keyname-keysym-labels.h
|
||||
eek/*.pc
|
||||
eek/*.gir
|
||||
eek/*.typelib
|
||||
tests/eek-simple-test
|
||||
tests/eek-xkb-test
|
||||
src/eekboard
|
||||
@ -51,4 +53,4 @@ po/*.gmo
|
||||
po/Makefile.in.in
|
||||
po/POTFILES
|
||||
po/stamp-it
|
||||
|
||||
bindings/vala/*.vapi
|
||||
|
||||
@ -18,4 +18,5 @@
|
||||
|
||||
ACLOCAL_AMFLAGS = -I m4
|
||||
SUBDIRS = eek src tests bindings docs po
|
||||
DISTCHECK_CONFIGURE_FLAGS = --enable-introspection
|
||||
DISTCHECK_CONFIGURE_FLAGS = --enable-gtk-doc --enable-introspection
|
||||
EXTRA_DIST = eekboard-sample.conf
|
||||
|
||||
13
TODO
13
TODO
@ -1,19 +1,14 @@
|
||||
- packaging
|
||||
-- GIR
|
||||
-- .spec
|
||||
-- debian
|
||||
-- add more tests
|
||||
|
||||
- eekboard
|
||||
-- a11y
|
||||
-- display current configuration
|
||||
-- add command line options
|
||||
-- notify user if there is no focused window
|
||||
-- rewrite in Vala
|
||||
|
||||
- libeek
|
||||
-- matchbox-keyboard layout engine
|
||||
-- CSS based themes
|
||||
-- Caribou layout engine (XML)
|
||||
-- matchbox-keyboard layout engine (XML)
|
||||
-- delay initialization of XKB and XKL layouts
|
||||
-- add eek_keyboard_find_by_position(), that takes account of section
|
||||
rotation, in addition to eek_container_find_by_position()
|
||||
-- add mechanism to change appearances (colors?) of UI widgets
|
||||
depending on modifier states
|
||||
|
||||
@ -19,6 +19,7 @@ which gnome-autogen.sh || {
|
||||
}
|
||||
|
||||
ACLOCAL_FLAGS="$ACLOCAL_FLAGS -I m4"
|
||||
REQUIRED_AUTOMAKE_VERSION=1.8
|
||||
REQUIRED_AUTOMAKE_VERSION=1.10
|
||||
REQUIRED_AUTOCONF_VERSION=2.60
|
||||
|
||||
. gnome-autogen.sh
|
||||
|
||||
97
configure.ac
97
configure.ac
@ -16,15 +16,60 @@
|
||||
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
|
||||
# 02110-1301 USA
|
||||
|
||||
AC_INIT([eekboard], [0.0.3], [ueno@unixuser.org])
|
||||
AC_INIT([eekboard], [0.0.7], [ueno@unixuser.org])
|
||||
AC_CONFIG_SRCDIR([configure.ac])
|
||||
AC_PREREQ(2.63)
|
||||
AM_INIT_AUTOMAKE
|
||||
AM_PROG_CC_C_O
|
||||
AC_CONFIG_MACRO_DIR([m4])
|
||||
m4_ifdef([AM_SILENT_RULES],[AM_SILENT_RULES([yes])])
|
||||
LT_INIT
|
||||
IT_PROG_INTLTOOL([0.35.0])
|
||||
|
||||
AC_MSG_CHECKING([which gtk+ version to compile against])
|
||||
AC_ARG_WITH([gtk],
|
||||
[AS_HELP_STRING([--with-gtk=2.0|3.0],[which gtk+ version to compile against (default: 2.0)])],
|
||||
[case "$with_gtk" in
|
||||
2.0|3.0) ;;
|
||||
*) AC_MSG_ERROR([invalid gtk version specified]) ;;
|
||||
esac],
|
||||
[with_gtk=2.0])
|
||||
AC_MSG_RESULT([$with_gtk])
|
||||
|
||||
case "$with_gtk" in
|
||||
2.0) GTK_API_VERSION=2.0
|
||||
GTK_REQUIRED=2.14.0
|
||||
EEK_API_VERSION=0.1
|
||||
EEK_API_MAJOR_VERSION=0
|
||||
EEK_API_MINOR_VERSION=1
|
||||
EEK_API_PC_VERSION=0.1
|
||||
EEK_LIBRARY_SUFFIX="-$EEK_API_VERSION"
|
||||
;;
|
||||
3.0) GTK_API_VERSION=3.0
|
||||
GTK_REQUIRED=2.91.0
|
||||
# EEK_API_VERSION=0.90
|
||||
# EEK_API_MAJOR_VERSION=0
|
||||
# EEK_API_MINOR_VERSION=90
|
||||
# EEK_API_PC_VERSION=0.90
|
||||
EEK_API_VERSION=0.1
|
||||
EEK_API_MAJOR_VERSION=0
|
||||
EEK_API_MINOR_VERSION=1
|
||||
EEK_API_PC_VERSION=0.1
|
||||
EEK_LIBRARY_SUFFIX="-$EEK_API_VERSION"
|
||||
;;
|
||||
esac
|
||||
|
||||
AC_SUBST([GTK_API_VERSION])
|
||||
AC_SUBST([EEK_API_VERSION])
|
||||
AC_SUBST([EEK_API_MAJOR_VERSION])
|
||||
AC_SUBST([EEK_API_MINOR_VERSION])
|
||||
AC_SUBST([EEK_API_PC_VERSION])
|
||||
AC_SUBST([EEK_LIBRARY_SUFFIX])
|
||||
AC_SUBST([EEK_LIBRARY_SUFFIX_U],[AS_TR_SH([$EEK_LIBRARY_SUFFIX])])
|
||||
|
||||
AM_CONDITIONAL([HAVE_GTK_2],[test "$with_gtk" = "2.0"])
|
||||
AM_CONDITIONAL([HAVE_GTK_3],[test "$with_gtk" = "3.0"])
|
||||
|
||||
PKG_CHECK_MODULES([GLIB2], [glib-2.0], ,
|
||||
[AC_MSG_ERROR([GLib2 not found])])
|
||||
PKG_CHECK_MODULES([GOBJECT2], [gobject-2.0], ,
|
||||
@ -33,14 +78,38 @@ PKG_CHECK_MODULES([CAIRO], [cairo], ,
|
||||
[AC_MSG_ERROR([Cairo not found])])
|
||||
PKG_CHECK_MODULES([PANGO], [pango], ,
|
||||
[AC_MSG_ERROR([Pango not found])])
|
||||
PKG_CHECK_MODULES([GTK2], [gtk+-2.0 gdk-2.0], ,
|
||||
[AC_MSG_ERROR([GTK2 not found])])
|
||||
PKG_CHECK_MODULES([GTK], [
|
||||
gtk+-$GTK_API_VERSION >= $GTK_REQUIRED
|
||||
gdk-$GTK_API_VERSION >= $GTK_REQUIRED], ,
|
||||
[AC_MSG_ERROR([GTK not found])])
|
||||
PKG_CHECK_MODULES([GCONF2], [gconf-2.0], ,
|
||||
[AC_MSG_ERROR([GConf not found])])
|
||||
PKG_CHECK_MODULES([XKB], [x11], ,
|
||||
[AC_MSG_ERROR([XKB support not found])])
|
||||
PKG_CHECK_MODULES([LIBXKLAVIER], [libxklavier x11], ,
|
||||
[AC_MSG_ERROR([Libxklavier not found])])
|
||||
PKG_CHECK_MODULES([LIBFAKEKEY], [libfakekey], ,
|
||||
[AC_MSG_ERROR([libfakekey not found])])
|
||||
PKG_CHECK_MODULES([CSPI], [cspi-1.0], ,
|
||||
[AC_MSG_ERROR([AT-SPI C not found])])
|
||||
|
||||
PKG_CHECK_MODULES([NOTIFY], [libnotify], ,
|
||||
[AC_MSG_ERROR([libnotify not found])])
|
||||
|
||||
dnl libnotify >= 0.7.0 omitted the feature to attach notification to widget.
|
||||
need_libnotify_attach_workaround=0
|
||||
save_CFLAGS="$CFLAGS"
|
||||
CFLAGS="$NOTIFY_CFLAGS"
|
||||
save_LIBS="$LIBS"
|
||||
LIBS="$NOTIFY_LIBS"
|
||||
AC_TRY_LINK([#include <libnotify/notification.h>],
|
||||
[notify_notification_new (NULL, NULL, NULL);], ,
|
||||
[need_libnotify_attach_workaround=1])
|
||||
CFLAGS="$save_CFLAGS"
|
||||
LIBS="$save_LIBS"
|
||||
AC_DEFINE_UNQUOTED([NEED_LIBNOTIFY_ATTACH_WORKAROUND],
|
||||
$need_libnotify_attach_workaround,
|
||||
[Define if notify_notification_new work around is needed])
|
||||
|
||||
AC_MSG_CHECKING([whether you enable Vala language support])
|
||||
AC_ARG_ENABLE(vala,
|
||||
@ -69,24 +138,20 @@ if test x$enable_clutter = xyes; then
|
||||
PKG_CHECK_MODULES([CLUTTER], [clutter-1.0], ,
|
||||
[AC_MSG_ERROR([Clutter not found -- install it or add --disable-clutter])])
|
||||
AC_DEFINE([HAVE_CLUTTER], [1], [Define if Clutter is found])
|
||||
PKG_CHECK_MODULES([CLUTTER_GTK], [clutter-gtk-0.90],
|
||||
[enable_clutter_gtk=yes])
|
||||
if test x$enable_clutter_gtk = xno; then
|
||||
PKG_CHECK_MODULES([CLUTTER_GTK], [clutter-gtk-0.10],
|
||||
[enable_clutter_gtk=yes])
|
||||
fi
|
||||
if test x$enable_clutter_gtk = xyes; then
|
||||
AC_DEFINE([HAVE_CLUTTER_GTK], [1], [Define if Clutter-Gtk is found])
|
||||
fi
|
||||
have_clutter_gtk=0
|
||||
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
|
||||
AM_CONDITIONAL(HAVE_CLUTTER, [test x$enable_clutter = xyes])
|
||||
AM_CONDITIONAL(HAVE_CLUTTER_GTK, [test x$enable_clutter_gtk = xyes])
|
||||
|
||||
GTK_DOC_CHECK([1.14],[--flavour no-tmpl])
|
||||
|
||||
EEK_API_VERSION=0.1
|
||||
AC_SUBST(EEK_API_VERSION)
|
||||
|
||||
dnl to re-generate eek/*-keysym-labels.txt
|
||||
AC_CHECK_PROGS([PYTHON], [python])
|
||||
|
||||
|
||||
@ -8,7 +8,7 @@
|
||||
<bookinfo>
|
||||
<title>libeek Reference Manual</title>
|
||||
<releaseinfo>
|
||||
for libeek 0.0.3.
|
||||
for libeek 0.0.5.
|
||||
</releaseinfo>
|
||||
<copyright>
|
||||
<year>2010</year>
|
||||
|
||||
200
eek/Makefile.am
200
eek/Makefile.am
@ -27,97 +27,97 @@ lib_LTLIBRARIES += libeek-clutter.la
|
||||
endif
|
||||
|
||||
libeek_la_SOURCES = \
|
||||
eek-layout.c \
|
||||
eek-layout.h \
|
||||
eek-element.c \
|
||||
eek-element.h \
|
||||
eek-container.c \
|
||||
eek-container.h \
|
||||
eek-keyboard.c \
|
||||
eek-keyboard.h \
|
||||
eek-section.c \
|
||||
eek-section.h \
|
||||
eek-key.c \
|
||||
eek-key.h \
|
||||
eek-types.h \
|
||||
eek-types.c \
|
||||
eek-keysym.h \
|
||||
eek-keysym.c \
|
||||
eek-special-keysym-labels.h \
|
||||
eek-unicode-keysym-labels.h \
|
||||
eek-keyname-keysym-labels.h
|
||||
$(srcdir)/eek-layout.c \
|
||||
$(srcdir)/eek-layout.h \
|
||||
$(srcdir)/eek-element.c \
|
||||
$(srcdir)/eek-element.h \
|
||||
$(srcdir)/eek-container.c \
|
||||
$(srcdir)/eek-container.h \
|
||||
$(srcdir)/eek-keyboard.c \
|
||||
$(srcdir)/eek-keyboard.h \
|
||||
$(srcdir)/eek-section.c \
|
||||
$(srcdir)/eek-section.h \
|
||||
$(srcdir)/eek-key.c \
|
||||
$(srcdir)/eek-key.h \
|
||||
$(srcdir)/eek-types.h \
|
||||
$(srcdir)/eek-types.c \
|
||||
$(srcdir)/eek-keysym.h \
|
||||
$(srcdir)/eek-keysym.c \
|
||||
$(srcdir)/eek-special-keysym-labels.h \
|
||||
$(srcdir)/eek-unicode-keysym-labels.h \
|
||||
$(srcdir)/eek-keyname-keysym-labels.h
|
||||
libeek_la_CFLAGS = $(GOBJECT2_CFLAGS)
|
||||
libeek_la_LIBADD = $(GOBJECT2_LIBS)
|
||||
libeek_la_LIBADD = $(GOBJECT2_LIBS) -lm
|
||||
|
||||
if HAVE_CLUTTER
|
||||
libeek_clutter_la_SOURCES = \
|
||||
eek-clutter-keyboard.c \
|
||||
eek-clutter-keyboard.h \
|
||||
eek-clutter-section.c \
|
||||
eek-clutter-section.h \
|
||||
eek-clutter-key.c \
|
||||
eek-clutter-key.h \
|
||||
eek-clutter-key-actor.c \
|
||||
eek-clutter-key-actor.h \
|
||||
eek-clutter-drawing-context.c \
|
||||
eek-clutter-drawing-context.h \
|
||||
eek-drawing.h \
|
||||
eek-drawing.c \
|
||||
eek-clutter.h
|
||||
$(srcdir)/eek-clutter-keyboard.c \
|
||||
$(srcdir)/eek-clutter-keyboard.h \
|
||||
$(srcdir)/eek-clutter-section.c \
|
||||
$(srcdir)/eek-clutter-section.h \
|
||||
$(srcdir)/eek-clutter-key.c \
|
||||
$(srcdir)/eek-clutter-key.h \
|
||||
$(srcdir)/eek-clutter-key-actor.c \
|
||||
$(srcdir)/eek-clutter-key-actor.h \
|
||||
$(srcdir)/eek-clutter-drawing-context.c \
|
||||
$(srcdir)/eek-clutter-drawing-context.h \
|
||||
$(srcdir)/eek-drawing.h \
|
||||
$(srcdir)/eek-drawing.c \
|
||||
$(srcdir)/eek-clutter.h
|
||||
|
||||
libeek_clutter_la_CFLAGS = $(CLUTTER_CFLAGS) $(CAIRO_LIBS) $(PANGO_LIBS)
|
||||
libeek_clutter_la_LIBADD = libeek.la $(CLUTTER_LIBS) $(CAIRO_LIBS) $(PANGO_LIBS)
|
||||
endif
|
||||
|
||||
libeek_gtk_la_SOURCES = \
|
||||
eek-gtk-keyboard.c \
|
||||
eek-gtk-keyboard.h \
|
||||
eek-drawing.h \
|
||||
eek-drawing.c \
|
||||
eek-gtk.h
|
||||
$(srcdir)/eek-gtk-keyboard.c \
|
||||
$(srcdir)/eek-gtk-keyboard.h \
|
||||
$(srcdir)/eek-drawing.h \
|
||||
$(srcdir)/eek-drawing.c \
|
||||
$(srcdir)/eek-gtk.h
|
||||
|
||||
libeek_gtk_la_CFLAGS = $(GTK2_CFLAGS) $(CAIRO_LIBS) $(PANGO_LIBS)
|
||||
libeek_gtk_la_LIBADD = libeek.la $(GTK2_LIBS) $(CAIRO_LIBS) $(PANGO_LIBS)
|
||||
libeek_gtk_la_CFLAGS = $(GTK_CFLAGS) $(CAIRO_LIBS) $(PANGO_LIBS)
|
||||
libeek_gtk_la_LIBADD = libeek.la $(GTK_LIBS) $(CAIRO_LIBS) $(PANGO_LIBS)
|
||||
|
||||
libeek_xkb_la_SOURCES = \
|
||||
eek-xkb-layout.h \
|
||||
eek-xkb-layout.c
|
||||
$(srcdir)/eek-xkb-layout.h \
|
||||
$(srcdir)/eek-xkb-layout.c
|
||||
|
||||
libeek_xkb_la_CFLAGS = $(GTK2_CFLAGS) $(XKB_CFLAGS)
|
||||
libeek_xkb_la_LIBADD = libeek.la $(GTK2_LIBS) $(XKB_LIBS)
|
||||
libeek_xkb_la_CFLAGS = $(XKB_CFLAGS) $(GTK_CFLAGS)
|
||||
libeek_xkb_la_LIBADD = libeek.la $(XKB_LIBS) $(GTK_LIBS)
|
||||
|
||||
libeek_xkl_la_SOURCES = \
|
||||
eek-xkl-layout.h \
|
||||
eek-xkl-layout.c
|
||||
$(srcdir)/eek-xkl-layout.h \
|
||||
$(srcdir)/eek-xkl-layout.c
|
||||
|
||||
libeek_xkl_la_CFLAGS = $(GTK2_CFLAGS) $(LIBXKLAVIER_CFLAGS)
|
||||
libeek_xkl_la_LIBADD = libeek-xkb.la $(GTK2_LIBS) $(LIBXKLAVIER_LIBS)
|
||||
libeek_xkl_la_CFLAGS = $(LIBXKLAVIER_CFLAGS) $(GTK_CFLAGS)
|
||||
libeek_xkl_la_LIBADD = libeek-xkb.la $(LIBXKLAVIER_LIBS) $(GTK_LIBS)
|
||||
|
||||
eekdir = $(includedir)/eek-$(EEK_API_VERSION)/eek
|
||||
eek_HEADERS = \
|
||||
$(top_srcdir)/eek/eek-element.h \
|
||||
$(top_srcdir)/eek/eek-container.h \
|
||||
$(top_srcdir)/eek/eek-keyboard.h \
|
||||
$(top_srcdir)/eek/eek-section.h \
|
||||
$(top_srcdir)/eek/eek-key.h \
|
||||
$(top_srcdir)/eek/eek-layout.h \
|
||||
$(top_srcdir)/eek/eek-keysym.h \
|
||||
$(top_srcdir)/eek/eek-types.h \
|
||||
$(top_srcdir)/eek/eek-gtk-keyboard.h \
|
||||
$(top_srcdir)/eek/eek-xkb-layout.h \
|
||||
$(top_srcdir)/eek/eek-xkl-layout.h \
|
||||
$(top_srcdir)/eek/eek.h \
|
||||
$(top_srcdir)/eek/eek-gtk.h \
|
||||
$(top_srcdir)/eek/eek-xkb.h \
|
||||
$(top_srcdir)/eek/eek-xkl.h
|
||||
$(srcdir)/eek-element.h \
|
||||
$(srcdir)/eek-container.h \
|
||||
$(srcdir)/eek-keyboard.h \
|
||||
$(srcdir)/eek-section.h \
|
||||
$(srcdir)/eek-key.h \
|
||||
$(srcdir)/eek-layout.h \
|
||||
$(srcdir)/eek-keysym.h \
|
||||
$(srcdir)/eek-types.h \
|
||||
$(srcdir)/eek-gtk-keyboard.h \
|
||||
$(srcdir)/eek-xkb-layout.h \
|
||||
$(srcdir)/eek-xkl-layout.h \
|
||||
$(srcdir)/eek.h \
|
||||
$(srcdir)/eek-gtk.h \
|
||||
$(srcdir)/eek-xkb.h \
|
||||
$(srcdir)/eek-xkl.h
|
||||
|
||||
if HAVE_CLUTTER
|
||||
eek_HEADERS += \
|
||||
$(top_srcdir)/eek/eek-clutter-keyboard.h \
|
||||
$(top_srcdir)/eek/eek-clutter-section.h \
|
||||
$(top_srcdir)/eek/eek-clutter-key.h \
|
||||
$(top_srcdir)/eek/eek-clutter-drawing-context.h \
|
||||
$(top_srcdir)/eek/eek-clutter.h
|
||||
$(srcdir)/eek-clutter-keyboard.h \
|
||||
$(srcdir)/eek-clutter-section.h \
|
||||
$(srcdir)/eek-clutter-key.h \
|
||||
$(srcdir)/eek-clutter-drawing-context.h \
|
||||
$(srcdir)/eek-clutter.h
|
||||
endif
|
||||
|
||||
eek-keysym.c: eek-special-keysym-labels.h eek-unicode-keysym-labels.h eek-keyname-keysym-labels.h
|
||||
@ -153,53 +153,53 @@ CLEANFILES =
|
||||
|
||||
-include $(INTROSPECTION_MAKEFILE)
|
||||
INTROSPECTION_GIRS =
|
||||
INTROSPECTION_SCANNER_ARGS = --add-include-path=$(srcdir)
|
||||
INTROSPECTION_SCANNER_ARGS = --add-include-path=$(builddir)
|
||||
INTROSPECTION_COMPILER_ARGS = --includedir=$(srcdir)
|
||||
|
||||
if HAVE_INTROSPECTION
|
||||
|
||||
Eek-0.1.gir: libeek.la
|
||||
Eek_0_1_gir_SCANNERFLAGS = --strip-prefix=Eek --pkg=glib-2.0
|
||||
Eek_0_1_gir_INCLUDES = GLib-2.0 GObject-2.0
|
||||
Eek_0_1_gir_CFLAGS = $(libeek_la_CFLAGS)
|
||||
Eek_0_1_gir_LIBS = libeek.la
|
||||
Eek_0_1_gir_FILES = $(libeek_la_SOURCES)
|
||||
Eek@EEK_LIBRARY_SUFFIX@.gir: libeek.la
|
||||
Eek@EEK_LIBRARY_SUFFIX_U@_gir_SCANNERFLAGS = --strip-prefix=Eek --pkg=glib-2.0
|
||||
Eek@EEK_LIBRARY_SUFFIX_U@_gir_INCLUDES = GLib-2.0 GObject-2.0
|
||||
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_FILES = $(libeek_la_SOURCES)
|
||||
|
||||
EekGtk-0.1.gir: libeek-gtk.la Eek-0.1.gir
|
||||
EekGtk_0_1_gir_INCLUDES = GObject-2.0 Gtk-2.0 Eek-0.1
|
||||
EekGtk_0_1_gir_CFLAGS = $(libeek_gtk_la_CFLAGS)
|
||||
EekGtk_0_1_gir_LIBS = libeek-gtk.la
|
||||
EekGtk_0_1_gir_FILES = $(libeek_gtk_la_SOURCES)
|
||||
EekGtk@EEK_LIBRARY_SUFFIX@.gir: libeek-gtk.la Eek@EEK_LIBRARY_SUFFIX@.gir
|
||||
EekGtk@EEK_LIBRARY_SUFFIX_U@_gir_INCLUDES = GObject-2.0 Gtk-@GTK_API_VERSION@ Eek@EEK_LIBRARY_SUFFIX@
|
||||
EekGtk@EEK_LIBRARY_SUFFIX_U@_gir_CFLAGS = $(libeek_gtk_la_CFLAGS)
|
||||
EekGtk@EEK_LIBRARY_SUFFIX_U@_gir_LIBS = libeek-gtk.la
|
||||
EekGtk@EEK_LIBRARY_SUFFIX_U@_gir_FILES = $(libeek_gtk_la_SOURCES)
|
||||
|
||||
if HAVE_CLUTTER
|
||||
EekClutter-0.1.gir: libeek-clutter.la Eek-0.1.gir
|
||||
EekClutter_0_1_gir_INCLUDES = GObject-2.0 Clutter-1.0 Eek-0.1
|
||||
EekClutter_0_1_gir_CFLAGS = $(libeek_clutter_la_CFLAGS)
|
||||
EekClutter_0_1_gir_LIBS = libeek-clutter.la
|
||||
EekClutter_0_1_gir_FILES = $(libeek_clutter_la_SOURCES)
|
||||
EekClutter@EEK_LIBRARY_SUFFIX@.gir: libeek-clutter.la Eek@EEK_LIBRARY_SUFFIX@.gir
|
||||
EekClutter@EEK_LIBRARY_SUFFIX_U@_gir_INCLUDES = GObject-2.0 Clutter-1.0 Eek@EEK_LIBRARY_SUFFIX@
|
||||
EekClutter@EEK_LIBRARY_SUFFIX_U@_gir_CFLAGS = $(libeek_clutter_la_CFLAGS)
|
||||
EekClutter@EEK_LIBRARY_SUFFIX_U@_gir_LIBS = libeek-clutter.la
|
||||
EekClutter@EEK_LIBRARY_SUFFIX_U@_gir_FILES = $(libeek_clutter_la_SOURCES)
|
||||
endif
|
||||
|
||||
EekXkb-0.1.gir: libeek-xkb.la Eek-0.1.gir
|
||||
EekXkb_0_1_gir_INCLUDES = GObject-2.0 Eek-0.1
|
||||
EekXkb_0_1_gir_CFLAGS = $(libeek_xkb_la_CFLAGS)
|
||||
EekXkb_0_1_gir_LIBS = libeek-xkb.la
|
||||
EekXkb_0_1_gir_FILES = $(libeek_xkb_la_SOURCES)
|
||||
EekXkb@EEK_LIBRARY_SUFFIX@.gir: libeek-xkb.la Eek@EEK_LIBRARY_SUFFIX@.gir
|
||||
EekXkb@EEK_LIBRARY_SUFFIX_U@_gir_INCLUDES = GObject-2.0 Eek@EEK_LIBRARY_SUFFIX@
|
||||
EekXkb@EEK_LIBRARY_SUFFIX_U@_gir_CFLAGS = $(libeek_xkb_la_CFLAGS)
|
||||
EekXkb@EEK_LIBRARY_SUFFIX_U@_gir_LIBS = libeek-xkb.la
|
||||
EekXkb@EEK_LIBRARY_SUFFIX_U@_gir_FILES = $(libeek_xkb_la_SOURCES)
|
||||
|
||||
EekXkl-0.1.gir: libeek-xkl.la EekXkb-0.1.gir
|
||||
EekXkl_0_1_gir_INCLUDES = GObject-2.0 EekXkb-0.1
|
||||
EekXkl_0_1_gir_CFLAGS = $(libeek_xkl_la_CFLAGS)
|
||||
EekXkl_0_1_gir_LIBS = libeek-xkl.la
|
||||
EekXkl_0_1_gir_FILES = $(libeek_xkl_la_SOURCES)
|
||||
EekXkl@EEK_LIBRARY_SUFFIX@.gir: libeek-xkl.la EekXkb@EEK_LIBRARY_SUFFIX@.gir
|
||||
EekXkl@EEK_LIBRARY_SUFFIX_U@_gir_INCLUDES = GObject-2.0 EekXkb@EEK_LIBRARY_SUFFIX@
|
||||
EekXkl@EEK_LIBRARY_SUFFIX_U@_gir_CFLAGS = $(libeek_xkl_la_CFLAGS)
|
||||
EekXkl@EEK_LIBRARY_SUFFIX_U@_gir_LIBS = libeek-xkl.la
|
||||
EekXkl@EEK_LIBRARY_SUFFIX_U@_gir_FILES = $(libeek_xkl_la_SOURCES)
|
||||
|
||||
INTROSPECTION_GIRS += \
|
||||
Eek-0.1.gir \
|
||||
EekGtk-0.1.gir \
|
||||
EekXkb-0.1.gir \
|
||||
EekXkl-0.1.gir
|
||||
Eek@EEK_LIBRARY_SUFFIX@.gir \
|
||||
EekGtk@EEK_LIBRARY_SUFFIX@.gir \
|
||||
EekXkb@EEK_LIBRARY_SUFFIX@.gir \
|
||||
EekXkl@EEK_LIBRARY_SUFFIX@.gir
|
||||
|
||||
if HAVE_CLUTTER
|
||||
INTROSPECTION_GIRS += \
|
||||
EekClutter-0.1.gir
|
||||
EekClutter@EEK_LIBRARY_SUFFIX@.gir
|
||||
endif
|
||||
|
||||
girdir = $(datadir)/gir-1.0
|
||||
|
||||
@ -52,6 +52,7 @@ struct _EekClutterKeyActorPrivate
|
||||
EekClutterDrawingContext *context;
|
||||
EekKey *key;
|
||||
ClutterActor *texture;
|
||||
gboolean is_pressed;
|
||||
};
|
||||
|
||||
static ClutterActor *get_texture (EekClutterKeyActor *actor);
|
||||
@ -103,28 +104,6 @@ eek_clutter_key_actor_real_paint (ClutterActor *self)
|
||||
g_object_unref (layout);
|
||||
}
|
||||
|
||||
/* FIXME: This is a workaround for the bug
|
||||
* http://bugzilla.openedhand.com/show_bug.cgi?id=2137 A developer
|
||||
* says this is not a right way to solve the original problem.
|
||||
*/
|
||||
static void
|
||||
eek_clutter_key_actor_real_get_preferred_width (ClutterActor *self,
|
||||
gfloat for_height,
|
||||
gfloat *min_width_p,
|
||||
gfloat *natural_width_p)
|
||||
{
|
||||
PangoLayout *layout;
|
||||
|
||||
/* Draw the label on the key - just to validate the glyph cache. */
|
||||
layout = clutter_actor_create_pango_layout (self, NULL);
|
||||
draw_key_on_layout (EEK_CLUTTER_KEY_ACTOR(self), layout);
|
||||
cogl_pango_ensure_glyph_cache_for_layout (layout);
|
||||
g_object_unref (layout);
|
||||
|
||||
CLUTTER_ACTOR_CLASS (eek_clutter_key_actor_parent_class)->
|
||||
get_preferred_width (self, for_height, min_width_p, natural_width_p);
|
||||
}
|
||||
|
||||
static void
|
||||
eek_clutter_key_actor_real_pressed (EekClutterKeyActor *self)
|
||||
{
|
||||
@ -181,12 +160,6 @@ eek_clutter_key_actor_class_init (EekClutterKeyActorClass *klass)
|
||||
sizeof (EekClutterKeyActorPrivate));
|
||||
|
||||
actor_class->paint = eek_clutter_key_actor_real_paint;
|
||||
/* FIXME: This is a workaround for the bug
|
||||
* http://bugzilla.openedhand.com/show_bug.cgi?id=2137 A developer
|
||||
* says this is not a right way to solve the original problem.
|
||||
*/
|
||||
actor_class->get_preferred_width =
|
||||
eek_clutter_key_actor_real_get_preferred_width;
|
||||
|
||||
gobject_class->dispose = eek_clutter_key_actor_dispose;
|
||||
|
||||
@ -223,8 +196,11 @@ on_button_press_event (ClutterActor *actor,
|
||||
EekClutterKeyActorPrivate *priv =
|
||||
EEK_CLUTTER_KEY_ACTOR_GET_PRIVATE(actor);
|
||||
|
||||
/* priv->key will send back PRESSED event of actor. */
|
||||
g_signal_emit_by_name (priv->key, "pressed");
|
||||
if (!priv->is_pressed) {
|
||||
priv->is_pressed = TRUE;
|
||||
/* priv->key will send back PRESSED event of actor. */
|
||||
g_signal_emit_by_name (priv->key, "pressed");
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
@ -235,8 +211,27 @@ on_button_release_event (ClutterActor *actor,
|
||||
EekClutterKeyActorPrivate *priv =
|
||||
EEK_CLUTTER_KEY_ACTOR_GET_PRIVATE(actor);
|
||||
|
||||
/* priv->key will send back RELEASED event of actor. */
|
||||
g_signal_emit_by_name (priv->key, "released");
|
||||
if (priv->is_pressed) {
|
||||
priv->is_pressed = FALSE;
|
||||
/* priv->key will send back RELEASED event of actor. */
|
||||
g_signal_emit_by_name (priv->key, "released");
|
||||
}
|
||||
}
|
||||
|
||||
static gboolean
|
||||
on_leave_event (ClutterActor *actor,
|
||||
ClutterEvent *event,
|
||||
gpointer user_data)
|
||||
{
|
||||
EekClutterKeyActorPrivate *priv =
|
||||
EEK_CLUTTER_KEY_ACTOR_GET_PRIVATE(actor);
|
||||
|
||||
if (priv->is_pressed) {
|
||||
priv->is_pressed = FALSE;
|
||||
/* priv->key will send back RELEASED event of actor. */
|
||||
g_signal_emit_by_name (priv->key, "released");
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static void
|
||||
@ -247,12 +242,15 @@ eek_clutter_key_actor_init (EekClutterKeyActor *self)
|
||||
priv = self->priv = EEK_CLUTTER_KEY_ACTOR_GET_PRIVATE(self);
|
||||
priv->key = NULL;
|
||||
priv->texture = NULL;
|
||||
|
||||
|
||||
clutter_actor_set_reactive (CLUTTER_ACTOR(self), TRUE);
|
||||
|
||||
g_signal_connect (self, "button-press-event",
|
||||
G_CALLBACK (on_button_press_event), NULL);
|
||||
g_signal_connect (self, "button-release-event",
|
||||
G_CALLBACK (on_button_release_event), NULL);
|
||||
g_signal_connect (self, "leave-event",
|
||||
G_CALLBACK (on_leave_event), NULL);
|
||||
}
|
||||
|
||||
ClutterActor *
|
||||
|
||||
@ -231,23 +231,16 @@ eek_container_find (EekContainer *container,
|
||||
user_data);
|
||||
}
|
||||
|
||||
struct _FbpData
|
||||
{
|
||||
EekKey *key;
|
||||
gint x, y;
|
||||
};
|
||||
typedef struct _FbpData FbpData;
|
||||
|
||||
static gint
|
||||
compare_element_by_position (EekElement *element, gpointer user_data)
|
||||
{
|
||||
EekBounds bounds;
|
||||
FbpData *data = user_data;
|
||||
EekPoint *point = user_data;
|
||||
|
||||
eek_element_get_bounds (element, &bounds);
|
||||
if (bounds.x <= data->x && bounds.y <= data->y &&
|
||||
data->x <= (bounds.x + bounds.width) &&
|
||||
data->y <= (bounds.y + bounds.height))
|
||||
if (bounds.x <= point->x && bounds.y <= point->y &&
|
||||
point->x <= (bounds.x + bounds.width) &&
|
||||
point->y <= (bounds.y + bounds.height))
|
||||
return 0;
|
||||
return -1;
|
||||
}
|
||||
@ -258,13 +251,13 @@ eek_container_find_by_position (EekContainer *container,
|
||||
gdouble y)
|
||||
{
|
||||
EekBounds bounds;
|
||||
FbpData data;
|
||||
EekPoint point;
|
||||
|
||||
g_return_val_if_fail (EEK_IS_CONTAINER(container), NULL);
|
||||
eek_element_get_bounds (EEK_ELEMENT(container), &bounds);
|
||||
data.x = x - bounds.x;
|
||||
data.y = y - bounds.y;
|
||||
point.x = x - bounds.x;
|
||||
point.y = y - bounds.y;
|
||||
return eek_container_find (container,
|
||||
compare_element_by_position,
|
||||
&data);
|
||||
&point);
|
||||
}
|
||||
|
||||
@ -351,3 +351,45 @@ eek_element_get_absolute_position (EekElement *element,
|
||||
*x = ax;
|
||||
*y = ay;
|
||||
}
|
||||
|
||||
/**
|
||||
* eek_element_set_position:
|
||||
* @element: an #EekElement
|
||||
* @x: X coordinate of top left corner
|
||||
* @y: Y coordinate of top left corner
|
||||
*
|
||||
* Set the relative position of @element.
|
||||
*/
|
||||
void
|
||||
eek_element_set_position (EekElement *element,
|
||||
gdouble x,
|
||||
gdouble y)
|
||||
{
|
||||
EekBounds bounds;
|
||||
|
||||
eek_element_get_bounds (element, &bounds);
|
||||
bounds.x = x;
|
||||
bounds.y = y;
|
||||
eek_element_set_bounds (element, &bounds);
|
||||
}
|
||||
|
||||
/**
|
||||
* eek_element_set_size:
|
||||
* @element: an #EekElement
|
||||
* @width: width of @element
|
||||
* @height: height of @element
|
||||
*
|
||||
* Set the size of @element.
|
||||
*/
|
||||
void
|
||||
eek_element_set_size (EekElement *element,
|
||||
gdouble width,
|
||||
gdouble height)
|
||||
{
|
||||
EekBounds bounds;
|
||||
|
||||
eek_element_get_bounds (element, &bounds);
|
||||
bounds.width = width;
|
||||
bounds.height = height;
|
||||
eek_element_set_bounds (element, &bounds);
|
||||
}
|
||||
|
||||
@ -81,6 +81,13 @@ void eek_element_set_bounds (EekElement *element,
|
||||
void eek_element_get_bounds (EekElement *element,
|
||||
EekBounds *bounds);
|
||||
|
||||
void eek_element_set_position (EekElement *element,
|
||||
gdouble x,
|
||||
gdouble y);
|
||||
void eek_element_set_size (EekElement *element,
|
||||
gdouble width,
|
||||
gdouble height);
|
||||
|
||||
void eek_element_get_absolute_position (EekElement *element,
|
||||
gdouble *x,
|
||||
gdouble *y);
|
||||
|
||||
@ -25,6 +25,6 @@ Name: libeek-gtk
|
||||
Description: A Library to Create Keyboard-like UI (GTK Support)
|
||||
URL: http://ueno.github.com/eekboard/
|
||||
Version: @VERSION@
|
||||
Requires: eek-@EEK_API_VERSION@ gtk+-2.0
|
||||
Requires: eek-@EEK_API_VERSION@ gtk+-@GTK_API_VERSION@
|
||||
Libs: -L${libdir} -leek-gtk
|
||||
Cflags: -I${includedir}/eek-@EEK_API_VERSION@
|
||||
|
||||
@ -41,27 +41,32 @@ G_DEFINE_TYPE (EekGtkKeyboard, eek_gtk_keyboard, EEK_TYPE_KEYBOARD);
|
||||
#define EEK_GTK_KEYBOARD_GET_PRIVATE(obj) \
|
||||
(G_TYPE_INSTANCE_GET_PRIVATE ((obj), EEK_TYPE_GTK_KEYBOARD, EekGtkKeyboardPrivate))
|
||||
|
||||
#define SCALE 1.5
|
||||
enum {
|
||||
KEY_SURFACE_NORMAL = 0,
|
||||
KEY_SURFACE_LARGE,
|
||||
KEY_SURFACE_LAST
|
||||
};
|
||||
|
||||
static const gdouble key_surface_scale[KEY_SURFACE_LAST] = {
|
||||
1.0,
|
||||
1.5
|
||||
};
|
||||
|
||||
struct _EekGtkKeyboardPrivate
|
||||
{
|
||||
GtkWidget *widget;
|
||||
|
||||
/* pixmap of entire keyboard (for expose event) */
|
||||
GdkPixmap *pixmap;
|
||||
|
||||
/* mapping from outline pointer to pixmap */
|
||||
GHashTable *outline_textures;
|
||||
|
||||
/* mapping from outline pointer to large pixmap */
|
||||
GHashTable *large_outline_textures;
|
||||
cairo_surface_t *keyboard_surface;
|
||||
GHashTable *key_surfaces;
|
||||
|
||||
PangoFontDescription *fonts[EEK_KEYSYM_CATEGORY_LAST];
|
||||
|
||||
gdouble scale;
|
||||
|
||||
EekKey *key;
|
||||
};
|
||||
|
||||
static void prepare_keyboard_pixmap (EekGtkKeyboard *keyboard);
|
||||
static void prepare_keyboard_surface (EekGtkKeyboard *keyboard);
|
||||
|
||||
static void
|
||||
eek_gtk_keyboard_real_set_keysym_index (EekKeyboard *self,
|
||||
@ -77,18 +82,26 @@ eek_gtk_keyboard_real_set_keysym_index (EekKeyboard *self,
|
||||
EekGtkKeyboard *keyboard = EEK_GTK_KEYBOARD(self);
|
||||
EekGtkKeyboardPrivate *priv =
|
||||
EEK_GTK_KEYBOARD_GET_PRIVATE(keyboard);
|
||||
GtkStyle *style;
|
||||
GtkStateType state;
|
||||
GtkAllocation allocation;
|
||||
cairo_t *cr;
|
||||
|
||||
prepare_keyboard_pixmap (keyboard);
|
||||
state = gtk_widget_get_state (GTK_WIDGET (priv->widget));
|
||||
gtk_widget_get_allocation (GTK_WIDGET (priv->widget), &allocation);
|
||||
gdk_draw_drawable (gtk_widget_get_window (priv->widget),
|
||||
gtk_widget_get_style (priv->widget)->fg_gc[state],
|
||||
priv->pixmap,
|
||||
0, 0,
|
||||
0, 0,
|
||||
allocation.width, allocation.height);
|
||||
if (!priv->widget || !gtk_widget_get_realized (priv->widget))
|
||||
return;
|
||||
|
||||
prepare_keyboard_surface (keyboard);
|
||||
gtk_widget_get_allocation (priv->widget, &allocation);
|
||||
|
||||
cr = gdk_cairo_create (GDK_DRAWABLE (gtk_widget_get_window (priv->widget)));
|
||||
style = gtk_widget_get_style (priv->widget);
|
||||
state = gtk_widget_get_state (priv->widget);
|
||||
gdk_cairo_set_source_color (cr, &style->fg[state]);
|
||||
|
||||
cairo_set_source_surface (cr, priv->keyboard_surface, 0, 0);
|
||||
cairo_rectangle (cr, 0, 0, allocation.width, allocation.height);
|
||||
cairo_fill (cr);
|
||||
cairo_destroy (cr);
|
||||
}
|
||||
}
|
||||
|
||||
@ -110,8 +123,8 @@ eek_gtk_keyboard_finalize (GObject *object)
|
||||
EekGtkKeyboardPrivate *priv = EEK_GTK_KEYBOARD_GET_PRIVATE(object);
|
||||
gint i;
|
||||
|
||||
g_hash_table_unref (priv->outline_textures);
|
||||
g_hash_table_unref (priv->large_outline_textures);
|
||||
cairo_surface_destroy (priv->keyboard_surface);
|
||||
g_hash_table_destroy (priv->key_surfaces);
|
||||
|
||||
for (i = 0; i < EEK_KEYSYM_CATEGORY_LAST; i++)
|
||||
pango_font_description_free (priv->fonts[i]);
|
||||
@ -132,6 +145,17 @@ eek_gtk_keyboard_class_init (EekGtkKeyboardClass *klass)
|
||||
gobject_class->finalize = eek_gtk_keyboard_finalize;
|
||||
}
|
||||
|
||||
static void
|
||||
key_surface_free (gpointer user_data)
|
||||
{
|
||||
cairo_surface_t **key_surfaces = user_data;
|
||||
gint i;
|
||||
|
||||
for (i = 0; i < KEY_SURFACE_LAST; i++)
|
||||
cairo_surface_destroy (key_surfaces[i]);
|
||||
g_slice_free1 (sizeof (cairo_surface_t *) * KEY_SURFACE_LAST, key_surfaces);
|
||||
}
|
||||
|
||||
static void
|
||||
eek_gtk_keyboard_init (EekGtkKeyboard *self)
|
||||
{
|
||||
@ -139,19 +163,15 @@ eek_gtk_keyboard_init (EekGtkKeyboard *self)
|
||||
|
||||
priv = self->priv = EEK_GTK_KEYBOARD_GET_PRIVATE(self);
|
||||
priv->widget = NULL;
|
||||
priv->pixmap = NULL;
|
||||
priv->outline_textures =
|
||||
priv->keyboard_surface = NULL;
|
||||
priv->key_surfaces =
|
||||
g_hash_table_new_full (g_direct_hash,
|
||||
g_direct_equal,
|
||||
NULL,
|
||||
g_object_unref);
|
||||
priv->large_outline_textures =
|
||||
g_hash_table_new_full (g_direct_hash,
|
||||
g_direct_equal,
|
||||
NULL,
|
||||
g_object_unref);
|
||||
key_surface_free);
|
||||
memset (priv->fonts, 0, sizeof priv->fonts);
|
||||
priv->scale = 1.0;
|
||||
priv->key = NULL;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -173,6 +193,9 @@ struct _DrawingContext
|
||||
};
|
||||
typedef struct _DrawingContext DrawingContext;
|
||||
|
||||
static void on_key_pressed (EekKey *key, gpointer user_data);
|
||||
static void on_key_released (EekKey *key, gpointer user_data);
|
||||
|
||||
static void
|
||||
prepare_keyboard_pixmap_key_callback (EekElement *element,
|
||||
gpointer user_data)
|
||||
@ -183,31 +206,44 @@ prepare_keyboard_pixmap_key_callback (EekElement *element,
|
||||
EekKey *key = EEK_KEY(element);
|
||||
EekBounds bounds;
|
||||
EekOutline *outline;
|
||||
GdkPixmap *texture;
|
||||
cairo_surface_t **key_surfaces;
|
||||
|
||||
eek_element_get_bounds (element, &bounds);
|
||||
|
||||
outline = eek_key_get_outline (key);
|
||||
texture = g_hash_table_lookup (priv->outline_textures, outline);
|
||||
if (!texture) {
|
||||
cairo_t *cr;
|
||||
g_signal_connect (key, "pressed", G_CALLBACK(on_key_pressed),
|
||||
context->keyboard);
|
||||
g_signal_connect (key, "released", G_CALLBACK(on_key_released),
|
||||
context->keyboard);
|
||||
|
||||
texture =
|
||||
gdk_pixmap_new (gtk_widget_get_window (GTK_WIDGET (priv->widget)),
|
||||
bounds.width, bounds.height, -1);
|
||||
cr = gdk_cairo_create (GDK_DRAWABLE (texture));
|
||||
gdk_cairo_set_source_color (cr, context->bg);
|
||||
cairo_rectangle (cr, 0, 0, bounds.width, bounds.height);
|
||||
gdk_cairo_set_source_color (cr, context->fg);
|
||||
eek_draw_outline (cr, outline);
|
||||
cairo_destroy (cr);
|
||||
g_hash_table_insert (priv->outline_textures, outline, texture);
|
||||
outline = eek_key_get_outline (key);
|
||||
key_surfaces = g_hash_table_lookup (priv->key_surfaces, outline);
|
||||
if (!key_surfaces) {
|
||||
cairo_t *cr;
|
||||
gint i;
|
||||
|
||||
key_surfaces = g_slice_alloc (sizeof (cairo_surface_t *) *
|
||||
KEY_SURFACE_LAST);
|
||||
for (i = 0; i < KEY_SURFACE_LAST; i++) {
|
||||
gdouble scale = key_surface_scale[i];
|
||||
key_surfaces[i] = cairo_image_surface_create (CAIRO_FORMAT_ARGB32,
|
||||
bounds.width * scale,
|
||||
bounds.height * scale);
|
||||
cr = cairo_create (key_surfaces[i]);
|
||||
cairo_scale (cr, priv->scale * scale, priv->scale * scale);
|
||||
gdk_cairo_set_source_color (cr, context->bg);
|
||||
cairo_rectangle (cr, 0, 0, bounds.width, bounds.height);
|
||||
gdk_cairo_set_source_color (cr, context->fg);
|
||||
eek_draw_outline (cr, outline);
|
||||
cairo_destroy (cr);
|
||||
}
|
||||
|
||||
g_hash_table_insert (priv->key_surfaces, outline, key_surfaces);
|
||||
}
|
||||
|
||||
cairo_save (context->cr);
|
||||
cairo_translate (context->cr, bounds.x, bounds.y);
|
||||
|
||||
gdk_cairo_set_source_pixmap (context->cr, texture, 0, 0);
|
||||
cairo_translate (context->cr, bounds.x, bounds.y);
|
||||
cairo_set_source_surface (context->cr, key_surfaces[0], 0, 0);
|
||||
cairo_rectangle (context->cr, 0, 0, bounds.width, bounds.height);
|
||||
cairo_fill (context->cr);
|
||||
|
||||
@ -240,48 +276,119 @@ prepare_keyboard_pixmap_section_callback (EekElement *element,
|
||||
}
|
||||
|
||||
static void
|
||||
drawing_context_init (DrawingContext *context, EekGtkKeyboard *keyboard)
|
||||
drawing_context_init (DrawingContext *context,
|
||||
cairo_t *cr,
|
||||
EekGtkKeyboard *keyboard)
|
||||
{
|
||||
EekGtkKeyboardPrivate *priv = keyboard->priv;
|
||||
GtkStyle *style;
|
||||
GtkStateType state;
|
||||
|
||||
state = gtk_widget_get_state (GTK_WIDGET (priv->widget));
|
||||
context->cr = cr;
|
||||
context->keyboard = keyboard;
|
||||
context->fg = >k_widget_get_style (GTK_WIDGET (priv->widget))->fg[state];
|
||||
context->bg = >k_widget_get_style (GTK_WIDGET (priv->widget))->bg[state];
|
||||
|
||||
style = gtk_widget_get_style (priv->widget);
|
||||
state = gtk_widget_get_state (priv->widget);
|
||||
context->fg = &style->fg[state];
|
||||
context->bg = &style->bg[state];
|
||||
}
|
||||
|
||||
static void
|
||||
prepare_keyboard_pixmap (EekGtkKeyboard *keyboard)
|
||||
prepare_keyboard_surface (EekGtkKeyboard *keyboard)
|
||||
{
|
||||
EekGtkKeyboardPrivate *priv = keyboard->priv;
|
||||
GtkAllocation allocation;
|
||||
GtkStyle *style;
|
||||
GtkStateType state;
|
||||
DrawingContext context;
|
||||
cairo_t *cr;
|
||||
|
||||
gtk_widget_get_allocation (GTK_WIDGET (priv->widget), &allocation);
|
||||
priv->pixmap =
|
||||
gdk_pixmap_new (gtk_widget_get_window (GTK_WIDGET (priv->widget)),
|
||||
allocation.width, allocation.height, -1);
|
||||
gtk_widget_get_allocation (priv->widget, &allocation);
|
||||
priv->keyboard_surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32,
|
||||
allocation.width,
|
||||
allocation.height);
|
||||
|
||||
/* blank background */
|
||||
state = gtk_widget_get_state (GTK_WIDGET (priv->widget));
|
||||
gdk_draw_rectangle
|
||||
(priv->pixmap,
|
||||
gtk_widget_get_style (GTK_WIDGET(priv->widget))->base_gc[state],
|
||||
TRUE,
|
||||
0, 0, allocation.width, allocation.height);
|
||||
cr = cairo_create (priv->keyboard_surface);
|
||||
cairo_scale (cr, priv->scale, priv->scale);
|
||||
|
||||
style = gtk_widget_get_style (priv->widget);
|
||||
state = gtk_widget_get_state (priv->widget);
|
||||
gdk_cairo_set_source_color (cr, &style->base[state]);
|
||||
|
||||
cairo_rectangle (cr, 0, 0, allocation.width, allocation.height);
|
||||
cairo_fill (cr);
|
||||
|
||||
/* draw sections on the canvas */
|
||||
drawing_context_init (&context, keyboard);
|
||||
context.cr = gdk_cairo_create (GDK_DRAWABLE (priv->pixmap));
|
||||
cairo_scale (context.cr, priv->scale, priv->scale);
|
||||
drawing_context_init (&context, cr, keyboard);
|
||||
eek_container_foreach_child (EEK_CONTAINER(keyboard),
|
||||
prepare_keyboard_pixmap_section_callback,
|
||||
&context);
|
||||
cairo_destroy (context.cr);
|
||||
cairo_destroy (cr);
|
||||
}
|
||||
|
||||
static void
|
||||
redraw_keyboard (cairo_t *cr,
|
||||
EekGtkKeyboard *keyboard,
|
||||
gint x,
|
||||
gint y,
|
||||
gint width,
|
||||
gint height)
|
||||
{
|
||||
EekGtkKeyboardPrivate *priv =
|
||||
EEK_GTK_KEYBOARD_GET_PRIVATE(keyboard);
|
||||
GtkStyle *style;
|
||||
GtkStateType state;
|
||||
|
||||
style = gtk_widget_get_style (priv->widget);
|
||||
state = gtk_widget_get_state (priv->widget);
|
||||
|
||||
if (!priv->keyboard_surface) {
|
||||
PangoFontDescription *base_font;
|
||||
PangoContext *context;
|
||||
PangoLayout *layout;
|
||||
|
||||
/* compute font sizes which fit in each key shape */
|
||||
context = gtk_widget_get_pango_context (priv->widget);
|
||||
layout = pango_layout_new (context);
|
||||
base_font = style->font_desc;
|
||||
pango_layout_set_font_description (layout, base_font);
|
||||
eek_get_fonts (EEK_KEYBOARD(keyboard), layout, priv->fonts);
|
||||
g_object_unref (layout);
|
||||
|
||||
prepare_keyboard_surface (keyboard);
|
||||
}
|
||||
g_return_if_fail (priv->keyboard_surface);
|
||||
|
||||
gdk_cairo_set_source_color (cr, &style->fg[state]);
|
||||
|
||||
cairo_set_source_surface (cr,
|
||||
priv->keyboard_surface,
|
||||
x, y);
|
||||
cairo_rectangle (cr, x, y, width, height);
|
||||
cairo_fill (cr);
|
||||
}
|
||||
|
||||
#if GTK_CHECK_VERSION (2, 91, 2)
|
||||
static gboolean
|
||||
on_draw (GtkWidget *widget,
|
||||
cairo_t *cr,
|
||||
gpointer user_data)
|
||||
{
|
||||
EekGtkKeyboard *keyboard = user_data;
|
||||
EekGtkKeyboardPrivate *priv =
|
||||
EEK_GTK_KEYBOARD_GET_PRIVATE(keyboard);
|
||||
GtkAllocation allocation;
|
||||
|
||||
g_return_val_if_fail (widget == priv->widget, FALSE);
|
||||
|
||||
gtk_widget_get_allocation (priv->widget, &allocation);
|
||||
|
||||
redraw_keyboard (cr, keyboard, 0, 0, allocation.width, allocation.height);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
#else
|
||||
static gboolean
|
||||
on_expose_event (GtkWidget *widget,
|
||||
GdkEventExpose *event,
|
||||
@ -290,160 +397,181 @@ on_expose_event (GtkWidget *widget,
|
||||
EekGtkKeyboard *keyboard = user_data;
|
||||
EekGtkKeyboardPrivate *priv =
|
||||
EEK_GTK_KEYBOARD_GET_PRIVATE(keyboard);
|
||||
GtkStateType state = gtk_widget_get_state (widget);
|
||||
cairo_t *cr;
|
||||
|
||||
if (!priv->pixmap) {
|
||||
/* compute font sizes which fit in each key shape */
|
||||
PangoFontDescription *base_font;
|
||||
PangoContext *context;
|
||||
PangoLayout *layout;
|
||||
g_return_val_if_fail (widget == priv->widget, FALSE);
|
||||
|
||||
cr = gdk_cairo_create (GDK_DRAWABLE (gtk_widget_get_window (priv->widget)));
|
||||
redraw_keyboard (cr, keyboard,
|
||||
event->area.x, event->area.y,
|
||||
event->area.width, event->area.height);
|
||||
cairo_destroy (cr);
|
||||
|
||||
context = gtk_widget_get_pango_context (priv->widget);
|
||||
layout = pango_layout_new (context);
|
||||
base_font = gtk_widget_get_style (priv->widget)->font_desc;
|
||||
pango_layout_set_font_description (layout, base_font);
|
||||
eek_get_fonts (EEK_KEYBOARD(keyboard), layout, priv->fonts);
|
||||
g_object_unref (layout);
|
||||
|
||||
prepare_keyboard_pixmap (keyboard);
|
||||
}
|
||||
g_return_val_if_fail (priv->pixmap, FALSE);
|
||||
|
||||
gdk_draw_drawable (gtk_widget_get_window (widget),
|
||||
gtk_widget_get_style (widget)->fg_gc[state],
|
||||
priv->pixmap,
|
||||
event->area.x, event->area.y,
|
||||
event->area.x, event->area.y,
|
||||
event->area.width, event->area.height);
|
||||
return TRUE;
|
||||
}
|
||||
#endif
|
||||
|
||||
static void
|
||||
key_enlarge (EekGtkKeyboard *keyboard, EekKey *key)
|
||||
redraw_key (cairo_t *cr,
|
||||
EekKey *key,
|
||||
gint key_surface_type,
|
||||
EekGtkKeyboard *keyboard)
|
||||
{
|
||||
EekGtkKeyboardPrivate *priv =
|
||||
EEK_GTK_KEYBOARD_GET_PRIVATE(keyboard);
|
||||
EekBounds bounds;
|
||||
EekOutline *outline;
|
||||
gdouble ax, ay;
|
||||
GdkPixmap *pixmap, *texture;
|
||||
DrawingContext context;
|
||||
gdouble x, y;
|
||||
int width, height;
|
||||
GtkStyle *style;
|
||||
GtkStateType state;
|
||||
cairo_t *cr;
|
||||
cairo_surface_t **key_surfaces, *large_surface;
|
||||
|
||||
drawing_context_init (&context, keyboard);
|
||||
|
||||
eek_element_get_bounds (EEK_ELEMENT(key), &bounds);
|
||||
eek_element_get_absolute_position (EEK_ELEMENT(key), &ax, &ay);
|
||||
g_return_if_fail (priv->keyboard_surface);
|
||||
|
||||
outline = eek_key_get_outline (key);
|
||||
texture = g_hash_table_lookup (priv->large_outline_textures, outline);
|
||||
if (!texture) {
|
||||
texture =
|
||||
gdk_pixmap_new (gtk_widget_get_window (GTK_WIDGET (priv->widget)),
|
||||
bounds.width * SCALE, bounds.height * SCALE, -1);
|
||||
cr = gdk_cairo_create (GDK_DRAWABLE (texture));
|
||||
cairo_scale (cr, SCALE, SCALE);
|
||||
gdk_cairo_set_source_color (cr, context.bg);
|
||||
cairo_rectangle (cr, 0, 0, bounds.width, bounds.height);
|
||||
gdk_cairo_set_source_color (cr, context.fg);
|
||||
eek_draw_outline (cr, outline);
|
||||
cairo_destroy (cr);
|
||||
g_hash_table_insert (priv->large_outline_textures, outline, texture);
|
||||
key_surfaces = g_hash_table_lookup (priv->key_surfaces, outline);
|
||||
g_return_if_fail (key_surfaces);
|
||||
|
||||
large_surface = key_surfaces[KEY_SURFACE_LARGE];
|
||||
width = cairo_image_surface_get_width (large_surface);
|
||||
height = cairo_image_surface_get_height (large_surface);
|
||||
|
||||
eek_element_get_bounds (EEK_ELEMENT(key), &bounds);
|
||||
eek_element_get_absolute_position (EEK_ELEMENT(key), &x, &y);
|
||||
|
||||
x -= (width - bounds.width) / 2;
|
||||
y -= (height - bounds.height) / 2;
|
||||
|
||||
style = gtk_widget_get_style (priv->widget);
|
||||
state = gtk_widget_get_state (priv->widget);
|
||||
gdk_cairo_set_source_color (cr, &style->fg[state]);
|
||||
|
||||
switch (key_surface_type) {
|
||||
case KEY_SURFACE_NORMAL:
|
||||
cairo_set_source_surface (cr, priv->keyboard_surface, 0, 0);
|
||||
cairo_scale (cr, priv->scale, priv->scale);
|
||||
cairo_rectangle (cr, x, y, width, height);
|
||||
cairo_fill (cr);
|
||||
break;
|
||||
|
||||
case KEY_SURFACE_LARGE:
|
||||
cairo_scale (cr, priv->scale, priv->scale);
|
||||
cairo_set_source_surface (cr, large_surface, x, y);
|
||||
cairo_rectangle (cr, x, y, width, height);
|
||||
cairo_fill (cr);
|
||||
|
||||
cairo_move_to (cr, x, y);
|
||||
gdk_cairo_set_source_color (cr, &style->fg[state]);
|
||||
|
||||
cairo_scale (cr,
|
||||
priv->scale * key_surface_scale[KEY_SURFACE_LARGE],
|
||||
priv->scale * key_surface_scale[KEY_SURFACE_LARGE]);
|
||||
eek_draw_key_label (cr, key, priv->fonts);
|
||||
break;
|
||||
}
|
||||
|
||||
pixmap =
|
||||
gdk_pixmap_new (gtk_widget_get_window (GTK_WIDGET (priv->widget)),
|
||||
bounds.width * SCALE * priv->scale,
|
||||
bounds.height * SCALE * priv->scale, -1);
|
||||
cr = gdk_cairo_create (GDK_DRAWABLE (pixmap));
|
||||
cairo_scale (cr, priv->scale, priv->scale);
|
||||
gdk_cairo_set_source_pixmap (cr, texture, 0, 0);
|
||||
cairo_rectangle (cr, 0, 0, bounds.width * SCALE, bounds.height * SCALE);
|
||||
cairo_fill (cr);
|
||||
|
||||
cairo_move_to (cr, 0, 0);
|
||||
cairo_scale (cr, SCALE, SCALE);
|
||||
gdk_cairo_set_source_color (cr, context.fg);
|
||||
eek_draw_key_label (cr, key, priv->fonts);
|
||||
cairo_destroy (cr);
|
||||
|
||||
state = gtk_widget_get_state (GTK_WIDGET (priv->widget));
|
||||
gdk_draw_drawable (gtk_widget_get_window (priv->widget),
|
||||
gtk_widget_get_style (priv->widget)->fg_gc[state],
|
||||
pixmap,
|
||||
0, 0,
|
||||
(ax - (bounds.width * SCALE - bounds.width) / 2) *
|
||||
priv->scale,
|
||||
(ay - (bounds.height * SCALE - bounds.height) / 2) *
|
||||
priv->scale,
|
||||
bounds.width * SCALE * priv->scale,
|
||||
bounds.height * SCALE * priv->scale);
|
||||
g_object_unref (pixmap);
|
||||
}
|
||||
|
||||
static void
|
||||
key_shrink (EekGtkKeyboard *keyboard, EekKey *key)
|
||||
on_key_pressed (EekKey *key, gpointer user_data)
|
||||
{
|
||||
EekGtkKeyboardPrivate *priv =
|
||||
EEK_GTK_KEYBOARD_GET_PRIVATE(keyboard);
|
||||
EekBounds bounds;
|
||||
gdouble ax, ay;
|
||||
GtkStateType state;
|
||||
EekGtkKeyboard *keyboard = user_data;
|
||||
EekGtkKeyboardPrivate *priv = EEK_GTK_KEYBOARD_GET_PRIVATE(keyboard);
|
||||
cairo_t *cr;
|
||||
|
||||
g_return_if_fail (priv->pixmap);
|
||||
eek_element_get_bounds (EEK_ELEMENT(key), &bounds);
|
||||
eek_element_get_absolute_position (EEK_ELEMENT(key), &ax, &ay);
|
||||
state = gtk_widget_get_state (GTK_WIDGET (priv->widget));
|
||||
cr = gdk_cairo_create (GDK_DRAWABLE (gtk_widget_get_window (priv->widget)));
|
||||
redraw_key (cr, key, KEY_SURFACE_LARGE, keyboard);
|
||||
cairo_destroy (cr);
|
||||
|
||||
ax -= (bounds.width * SCALE - bounds.width) / 2;
|
||||
ay -= (bounds.height * SCALE - bounds.height) / 2;
|
||||
priv->key = key;
|
||||
}
|
||||
|
||||
gdk_draw_drawable (gtk_widget_get_window (priv->widget),
|
||||
gtk_widget_get_style (priv->widget)->fg_gc[state],
|
||||
priv->pixmap,
|
||||
ax * priv->scale, ay * priv->scale,
|
||||
ax * priv->scale, ay * priv->scale,
|
||||
bounds.width * SCALE * priv->scale,
|
||||
bounds.height * SCALE * priv->scale);
|
||||
static void
|
||||
on_key_released (EekKey *key, gpointer user_data)
|
||||
{
|
||||
EekGtkKeyboard *keyboard = user_data;
|
||||
EekGtkKeyboardPrivate *priv = EEK_GTK_KEYBOARD_GET_PRIVATE(keyboard);
|
||||
cairo_t *cr;
|
||||
|
||||
if (priv->key) {
|
||||
cr = gdk_cairo_create (GDK_DRAWABLE (gtk_widget_get_window (priv->widget)));
|
||||
redraw_key (cr, priv->key, KEY_SURFACE_NORMAL, keyboard);
|
||||
cairo_destroy (cr);
|
||||
priv->key = NULL;
|
||||
}
|
||||
cr = gdk_cairo_create (GDK_DRAWABLE (gtk_widget_get_window (priv->widget)));
|
||||
redraw_key (cr, key, KEY_SURFACE_NORMAL, keyboard);
|
||||
cairo_destroy (cr);
|
||||
}
|
||||
|
||||
static void
|
||||
press_key (EekGtkKeyboard *keyboard, EekKey *key)
|
||||
{
|
||||
EekGtkKeyboardPrivate *priv = EEK_GTK_KEYBOARD_GET_PRIVATE(keyboard);
|
||||
if (priv->key != key)
|
||||
g_signal_emit_by_name (key, "pressed", keyboard);
|
||||
}
|
||||
|
||||
static void
|
||||
release_key (EekGtkKeyboard *keyboard)
|
||||
{
|
||||
EekGtkKeyboardPrivate *priv = EEK_GTK_KEYBOARD_GET_PRIVATE(keyboard);
|
||||
|
||||
if (priv->key)
|
||||
g_signal_emit_by_name (priv->key, "released", keyboard);
|
||||
}
|
||||
|
||||
static gboolean
|
||||
on_key_event (GtkWidget *widget,
|
||||
GdkEventKey *event,
|
||||
gpointer user_data)
|
||||
{
|
||||
EekGtkKeyboard *keyboard = user_data;
|
||||
EekKey *key;
|
||||
|
||||
key = eek_keyboard_find_key_by_keycode (EEK_KEYBOARD(keyboard),
|
||||
event->hardware_keycode);
|
||||
if (!key)
|
||||
return FALSE;
|
||||
switch (event->type) {
|
||||
case GDK_KEY_PRESS:
|
||||
press_key (keyboard, key);
|
||||
return TRUE;
|
||||
case GDK_KEY_RELEASE:
|
||||
release_key (keyboard);
|
||||
return TRUE;
|
||||
default:
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
static gboolean
|
||||
on_button_event (GtkWidget *widget,
|
||||
GdkEventButton *event,
|
||||
gpointer user_data)
|
||||
GdkEventButton *event,
|
||||
gpointer user_data)
|
||||
{
|
||||
EekElement *keyboard = user_data, *section, *key;
|
||||
EekGtkKeyboard *keyboard = EEK_GTK_KEYBOARD(user_data);
|
||||
EekGtkKeyboardPrivate *priv = EEK_GTK_KEYBOARD_GET_PRIVATE(keyboard);
|
||||
EekBounds bounds;
|
||||
EekKey *key;
|
||||
gdouble x, y;
|
||||
|
||||
x = (gdouble)event->x / priv->scale;
|
||||
y = (gdouble)event->y / priv->scale;
|
||||
section = eek_container_find_by_position (EEK_CONTAINER(keyboard), x, y);
|
||||
if (section) {
|
||||
eek_element_get_bounds (keyboard, &bounds);
|
||||
x -= bounds.x;
|
||||
y -= bounds.y;
|
||||
key = eek_container_find_by_position (EEK_CONTAINER(section),
|
||||
x,
|
||||
y);
|
||||
if (key)
|
||||
switch (event->type) {
|
||||
case GDK_BUTTON_PRESS:
|
||||
key_enlarge (EEK_GTK_KEYBOARD(keyboard), EEK_KEY(key));
|
||||
g_signal_emit_by_name (keyboard, "key-pressed", key);
|
||||
return TRUE;
|
||||
case GDK_BUTTON_RELEASE:
|
||||
key_shrink (EEK_GTK_KEYBOARD(keyboard), EEK_KEY(key));
|
||||
g_signal_emit_by_name (keyboard, "key-released", key);
|
||||
return TRUE;
|
||||
default:
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
key = eek_keyboard_find_key_by_position (EEK_KEYBOARD(keyboard), x, y);
|
||||
if (key)
|
||||
switch (event->type) {
|
||||
case GDK_BUTTON_PRESS:
|
||||
press_key (EEK_GTK_KEYBOARD(keyboard), key);
|
||||
return TRUE;
|
||||
case GDK_BUTTON_RELEASE:
|
||||
release_key (EEK_GTK_KEYBOARD(keyboard));
|
||||
return TRUE;
|
||||
default:
|
||||
return FALSE;
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static void
|
||||
on_size_allocate (GtkWidget *widget,
|
||||
GtkAllocation *allocation,
|
||||
@ -453,19 +581,19 @@ on_size_allocate (GtkWidget *widget,
|
||||
EekGtkKeyboardPrivate *priv =
|
||||
EEK_GTK_KEYBOARD_GET_PRIVATE(keyboard);
|
||||
EekBounds bounds;
|
||||
GdkPixmap *pixmap;
|
||||
|
||||
if (priv->pixmap) {
|
||||
pixmap = priv->pixmap;
|
||||
priv->pixmap = NULL;
|
||||
g_object_unref (pixmap);
|
||||
if (priv->keyboard_surface) {
|
||||
cairo_surface_destroy (priv->keyboard_surface);
|
||||
priv->keyboard_surface = NULL;
|
||||
}
|
||||
g_hash_table_remove_all (priv->key_surfaces);
|
||||
|
||||
eek_element_get_bounds (EEK_ELEMENT(keyboard), &bounds);
|
||||
priv->scale = allocation->width > allocation->height ?
|
||||
allocation->width / bounds.width :
|
||||
allocation->height / bounds.height;
|
||||
}
|
||||
|
||||
GtkWidget *
|
||||
eek_gtk_keyboard_get_widget (EekGtkKeyboard *keyboard)
|
||||
{
|
||||
@ -480,12 +608,22 @@ eek_gtk_keyboard_get_widget (EekGtkKeyboard *keyboard)
|
||||
gtk_widget_set_events (priv->widget,
|
||||
GDK_EXPOSURE_MASK |
|
||||
GDK_KEY_PRESS_MASK |
|
||||
GDK_KEY_RELEASE_MASK |
|
||||
GDK_BUTTON_PRESS_MASK |
|
||||
GDK_BUTTON_RELEASE_MASK);
|
||||
#if GTK_CHECK_VERSION (2, 91, 2)
|
||||
g_signal_connect (priv->widget, "draw",
|
||||
G_CALLBACK (on_draw), keyboard);
|
||||
#else
|
||||
g_signal_connect (priv->widget, "expose_event",
|
||||
G_CALLBACK (on_expose_event), keyboard);
|
||||
#endif
|
||||
g_signal_connect (priv->widget, "size-allocate",
|
||||
G_CALLBACK (on_size_allocate), keyboard);
|
||||
g_signal_connect (priv->widget, "key-press-event",
|
||||
G_CALLBACK (on_key_event), keyboard);
|
||||
g_signal_connect (priv->widget, "key-release-event",
|
||||
G_CALLBACK (on_key_event), keyboard);
|
||||
g_signal_connect (priv->widget, "button-press-event",
|
||||
G_CALLBACK (on_button_event), keyboard);
|
||||
g_signal_connect (priv->widget, "button-release-event",
|
||||
|
||||
@ -20,6 +20,7 @@
|
||||
#ifndef EEK_GTK_KEYBOARD_H
|
||||
#define EEK_GTK_KEYBOARD_H 1
|
||||
|
||||
#include <glib.h>
|
||||
#include <gtk/gtk.h>
|
||||
#include "eek-keyboard.h"
|
||||
|
||||
|
||||
@ -226,13 +226,17 @@ eek_key_real_get_keysym_index (EekKey *self,
|
||||
static void
|
||||
eek_key_real_pressed (EekKey *key)
|
||||
{
|
||||
#if DEBUG
|
||||
g_debug ("pressed %X", eek_key_get_keycode (key));
|
||||
#endif
|
||||
}
|
||||
|
||||
static void
|
||||
eek_key_real_released (EekKey *key)
|
||||
{
|
||||
#if DEBUG
|
||||
g_debug ("released %X", eek_key_get_keycode (key));
|
||||
#endif
|
||||
}
|
||||
|
||||
static void
|
||||
|
||||
@ -484,3 +484,69 @@ eek_keyboard_find_key_by_keycode (EekKeyboard *keyboard,
|
||||
return EEK_KEYBOARD_GET_CLASS(keyboard)->find_key_by_keycode (keyboard,
|
||||
keycode);
|
||||
}
|
||||
|
||||
struct _FkbpData {
|
||||
gdouble x;
|
||||
gdouble y;
|
||||
EekKey *key;
|
||||
};
|
||||
typedef struct _FkbpData FkbpData;
|
||||
|
||||
static gint
|
||||
compare_section_by_position (EekElement *element, gpointer user_data)
|
||||
{
|
||||
EekSection *section = EEK_SECTION(element);
|
||||
EekPoint *point = user_data;
|
||||
gint angle;
|
||||
EekBounds bounds;
|
||||
EekPoint rotated;
|
||||
|
||||
eek_element_get_bounds (element, &bounds);
|
||||
rotated.x = point->x - bounds.x;
|
||||
rotated.y = point->y - bounds.y;
|
||||
angle = eek_section_get_angle (section);
|
||||
eek_point_rotate (&rotated, -angle);
|
||||
|
||||
if (0 <= rotated.x && 0 <= rotated.y &&
|
||||
rotated.x <= bounds.width &&
|
||||
rotated.y <= bounds.height)
|
||||
return 0;
|
||||
return -1;
|
||||
}
|
||||
|
||||
static void
|
||||
fkbp_foreach_child_callback (EekElement *element,
|
||||
gpointer user_data)
|
||||
{
|
||||
FkbpData *data = user_data;
|
||||
EekPoint point;
|
||||
|
||||
if (!data->key) {
|
||||
point.x = data->x;
|
||||
point.y = data->y;
|
||||
if (compare_section_by_position (element, &point) == 0) {
|
||||
data->key = eek_section_find_key_by_position (EEK_SECTION(element),
|
||||
point.x,
|
||||
point.y);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
EekKey *
|
||||
eek_keyboard_find_key_by_position (EekKeyboard *keyboard,
|
||||
gdouble x,
|
||||
gdouble y)
|
||||
{
|
||||
FkbpData data;
|
||||
EekBounds bounds;
|
||||
|
||||
eek_element_get_bounds (EEK_ELEMENT(keyboard), &bounds);
|
||||
data.x = x - bounds.x;
|
||||
data.y = y - bounds.y;
|
||||
data.key = NULL;
|
||||
/* eek_container_find() cannot be used here since sections may overlap. */
|
||||
eek_container_foreach_child (EEK_CONTAINER(keyboard),
|
||||
fkbp_foreach_child_callback,
|
||||
&data);
|
||||
return data.key;
|
||||
}
|
||||
|
||||
@ -83,22 +83,25 @@ struct _EekKeyboardClass
|
||||
gpointer pdummy[24];
|
||||
};
|
||||
|
||||
GType eek_keyboard_get_type (void) G_GNUC_CONST;
|
||||
GType eek_keyboard_get_type (void) G_GNUC_CONST;
|
||||
|
||||
void eek_keyboard_set_keysym_index (EekKeyboard *keyboard,
|
||||
gint group,
|
||||
gint level);
|
||||
void eek_keyboard_get_keysym_index (EekKeyboard *keyboard,
|
||||
gint *group,
|
||||
gint *level);
|
||||
void eek_keyboard_set_keysym_index (EekKeyboard *keyboard,
|
||||
gint group,
|
||||
gint level);
|
||||
void eek_keyboard_get_keysym_index (EekKeyboard *keyboard,
|
||||
gint *group,
|
||||
gint *level);
|
||||
|
||||
EekSection *eek_keyboard_create_section (EekKeyboard *keyboard);
|
||||
EekSection *eek_keyboard_create_section (EekKeyboard *keyboard);
|
||||
|
||||
void eek_keyboard_set_layout (EekKeyboard *keyboard,
|
||||
EekLayout *layout);
|
||||
void eek_keyboard_realize (EekKeyboard *keyboard);
|
||||
EekKey *eek_keyboard_find_key_by_keycode (EekKeyboard *keyboard,
|
||||
guint keycode);
|
||||
void eek_keyboard_set_layout (EekKeyboard *keyboard,
|
||||
EekLayout *layout);
|
||||
void eek_keyboard_realize (EekKeyboard *keyboard);
|
||||
EekKey *eek_keyboard_find_key_by_keycode (EekKeyboard *keyboard,
|
||||
guint keycode);
|
||||
EekKey *eek_keyboard_find_key_by_position (EekKeyboard *keyboard,
|
||||
gdouble x,
|
||||
gdouble y);
|
||||
|
||||
G_END_DECLS
|
||||
#endif /* EEK_KEYBOARD_H */
|
||||
|
||||
@ -438,3 +438,26 @@ eek_section_find_key_by_keycode (EekSection *section,
|
||||
return EEK_SECTION_GET_CLASS(section)->find_key_by_keycode (section,
|
||||
keycode);
|
||||
}
|
||||
|
||||
EekKey *
|
||||
eek_section_find_key_by_position (EekSection *section,
|
||||
gdouble x,
|
||||
gdouble y)
|
||||
{
|
||||
gint angle;
|
||||
EekBounds bounds;
|
||||
EekPoint point;
|
||||
EekElement *key;
|
||||
|
||||
eek_element_get_bounds (EEK_ELEMENT(section), &bounds);
|
||||
point.x = x - bounds.x;
|
||||
point.y = y - bounds.y;
|
||||
angle = eek_section_get_angle (section);
|
||||
eek_point_rotate (&point, -angle);
|
||||
key = eek_container_find_by_position (EEK_CONTAINER(section),
|
||||
point.x + bounds.x,
|
||||
point.y + bounds.y);
|
||||
if (!key)
|
||||
return NULL;
|
||||
return EEK_KEY(key);
|
||||
}
|
||||
|
||||
@ -86,27 +86,30 @@ struct _EekSectionClass
|
||||
gpointer pdummy[24];
|
||||
};
|
||||
|
||||
GType eek_section_get_type (void) G_GNUC_CONST;
|
||||
GType eek_section_get_type (void) G_GNUC_CONST;
|
||||
|
||||
void eek_section_set_angle (EekSection *section,
|
||||
gint angle);
|
||||
gint eek_section_get_angle (EekSection *section);
|
||||
void eek_section_set_angle (EekSection *section,
|
||||
gint angle);
|
||||
gint eek_section_get_angle (EekSection *section);
|
||||
|
||||
gint eek_section_get_n_rows (EekSection *section);
|
||||
void eek_section_add_row (EekSection *section,
|
||||
gint num_columns,
|
||||
EekOrientation orientation);
|
||||
void eek_section_get_row (EekSection *section,
|
||||
gint index,
|
||||
gint *num_columns,
|
||||
EekOrientation *orientation);
|
||||
gint eek_section_get_n_rows (EekSection *section);
|
||||
void eek_section_add_row (EekSection *section,
|
||||
gint num_columns,
|
||||
EekOrientation orientation);
|
||||
void eek_section_get_row (EekSection *section,
|
||||
gint index,
|
||||
gint *num_columns,
|
||||
EekOrientation *orientation);
|
||||
|
||||
EekKey *eek_section_create_key (EekSection *section,
|
||||
gint column,
|
||||
gint row);
|
||||
EekKey *eek_section_create_key (EekSection *section,
|
||||
gint column,
|
||||
gint row);
|
||||
|
||||
EekKey *eek_section_find_key_by_keycode (EekSection *section,
|
||||
guint keycode);
|
||||
EekKey *eek_section_find_key_by_keycode (EekSection *section,
|
||||
guint keycode);
|
||||
EekKey *eek_section_find_key_by_position (EekSection *section,
|
||||
gdouble x,
|
||||
gdouble y);
|
||||
|
||||
G_END_DECLS
|
||||
#endif /* EEK_SECTION_H */
|
||||
|
||||
@ -28,6 +28,7 @@
|
||||
#endif /* HAVE_CONFIG_H */
|
||||
|
||||
#include "eek-types.h"
|
||||
#include <math.h>
|
||||
|
||||
/* EekKeysymMatrix */
|
||||
static EekKeysymMatrix *
|
||||
@ -81,6 +82,18 @@ eek_point_get_type (void)
|
||||
return our_type;
|
||||
}
|
||||
|
||||
void
|
||||
eek_point_rotate (EekPoint *point, gint angle)
|
||||
{
|
||||
gdouble r, phi;
|
||||
|
||||
phi = atan2 (point->y, point->x);
|
||||
r = sqrt (point->x * point->x + point->y * point->y);
|
||||
phi += angle * M_PI / 180;
|
||||
point->x = r * cos (phi);
|
||||
point->y = r * sin (phi);
|
||||
}
|
||||
|
||||
/* EekBounds */
|
||||
static EekBounds *
|
||||
eek_bounds_copy (const EekBounds *bounds)
|
||||
|
||||
@ -24,6 +24,12 @@
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
#define EEK_TYPE_KEYSYM_MATRIX (eek_keysym_matrix_get_type ())
|
||||
#define EEK_TYPE_POINT (eek_point_get_type ())
|
||||
#define EEK_TYPE_BOUNDS (eek_bounds_get_type ())
|
||||
#define EEK_TYPE_OUTLINE (eek_outline_get_type ())
|
||||
|
||||
|
||||
/**
|
||||
* EekOrientation:
|
||||
* @EEK_ORIENTATION_VERTICAL: the elements will be arranged vertically
|
||||
@ -45,6 +51,11 @@ typedef struct _EekKey EekKey;
|
||||
typedef struct _EekSection EekSection;
|
||||
typedef struct _EekKeyboard EekKeyboard;
|
||||
|
||||
typedef struct _EekKeysymMatrix EekKeysymMatrix;
|
||||
typedef struct _EekPoint EekPoint;
|
||||
typedef struct _EekBounds EekBounds;
|
||||
typedef struct _EekOutline EekOutline;
|
||||
|
||||
/**
|
||||
* EekKeysymMatrix:
|
||||
* @data: array of keysyms
|
||||
@ -59,9 +70,7 @@ struct _EekKeysymMatrix
|
||||
gint num_groups;
|
||||
gint num_levels;
|
||||
};
|
||||
typedef struct _EekKeysymMatrix EekKeysymMatrix;
|
||||
|
||||
#define EEK_TYPE_KEYSYM_MATRIX (eek_keysym_matrix_get_type ())
|
||||
GType eek_keysym_matrix_get_type (void) G_GNUC_CONST;
|
||||
|
||||
/**
|
||||
@ -76,10 +85,10 @@ struct _EekPoint
|
||||
gdouble x;
|
||||
gdouble y;
|
||||
};
|
||||
typedef struct _EekPoint EekPoint;
|
||||
|
||||
#define EEK_TYPE_POINT (eek_point_get_type ())
|
||||
GType eek_point_get_type (void) G_GNUC_CONST;
|
||||
void eek_point_rotate (EekPoint *point,
|
||||
gint angle);
|
||||
|
||||
/**
|
||||
* EekBounds:
|
||||
@ -88,18 +97,17 @@ GType eek_point_get_type (void) G_GNUC_CONST;
|
||||
* @width: width of the box
|
||||
* @height: height of the box
|
||||
*
|
||||
* 2D bounding box
|
||||
* The rectangle containing an element's bounding box.
|
||||
*/
|
||||
struct _EekBounds
|
||||
{
|
||||
/*< public >*/
|
||||
gdouble x;
|
||||
gdouble y;
|
||||
gdouble width;
|
||||
gdouble height;
|
||||
};
|
||||
typedef struct _EekBounds EekBounds;
|
||||
|
||||
#define EEK_TYPE_BOUNDS (eek_bounds_get_type ())
|
||||
GType eek_bounds_get_type (void) G_GNUC_CONST;
|
||||
|
||||
G_INLINE_FUNC gdouble
|
||||
@ -122,9 +130,7 @@ struct _EekOutline
|
||||
EekPoint *points;
|
||||
gint num_points;
|
||||
};
|
||||
typedef struct _EekOutline EekOutline;
|
||||
|
||||
#define EEK_TYPE_OUTLINE (eek_outline_get_type ())
|
||||
GType eek_outline_get_type (void) G_GNUC_CONST;
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
@ -25,6 +25,6 @@ Name: libeek-xkb
|
||||
Description: A Library to Create Keyboard-like UI (XKB Support)
|
||||
URL: http://ueno.github.com/eekboard/
|
||||
Version: @VERSION@
|
||||
Requires: eek-@EEK_API_VERSION@ gtk+-x11-2.0
|
||||
Requires: eek-@EEK_API_VERSION@ gtk+-x11-@GTK_API_VERSION@
|
||||
Libs: -L${libdir} -leek-xkb
|
||||
Cflags: -I${includedir}/eek-@EEK_API_VERSION@
|
||||
|
||||
@ -31,6 +31,7 @@
|
||||
#include <X11/XKBlib.h>
|
||||
#include <X11/extensions/XKBgeom.h>
|
||||
#include <string.h>
|
||||
#include <stdarg.h>
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "config.h"
|
||||
@ -613,38 +614,68 @@ eek_xkb_layout_set_names (EekXkbLayout *layout, XkbComponentNamesRec *names)
|
||||
/**
|
||||
* eek_xkb_layout_set_names_full:
|
||||
* @layout: an #EekXkbLayout
|
||||
* @keymap: keymap component name
|
||||
* @keycodes: keycodes component name
|
||||
* @types: types component name
|
||||
* @compat: compat component name
|
||||
* @symbols: symbols component name
|
||||
* @geometry: geometry component name
|
||||
* @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,
|
||||
const gchar *keymap,
|
||||
const gchar *keycodes,
|
||||
const gchar *types,
|
||||
const gchar *compat,
|
||||
const gchar *symbols,
|
||||
const gchar *geometry)
|
||||
...)
|
||||
{
|
||||
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;
|
||||
|
||||
names.keymap = (char *)keymap;
|
||||
names.keycodes = (char *)keycodes;
|
||||
names.types = (char *)types;
|
||||
names.compat = (char *)compat;
|
||||
names.symbols = (char *)symbols;
|
||||
names.geometry = (char *)geometry;
|
||||
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);
|
||||
}
|
||||
|
||||
|
||||
@ -63,12 +63,10 @@ gboolean eek_xkb_layout_set_names (EekXkbLayout *layout,
|
||||
|
||||
gboolean eek_xkb_layout_set_names_full
|
||||
(EekXkbLayout *layout,
|
||||
const gchar *keymap,
|
||||
const gchar *keycodes,
|
||||
const gchar *types,
|
||||
const gchar *compat,
|
||||
const gchar *symbols,
|
||||
const gchar *geometry);
|
||||
...);
|
||||
gboolean eek_xkb_layout_set_names_full_valist
|
||||
(EekXkbLayout *layout,
|
||||
va_list var_args);
|
||||
|
||||
gboolean eek_xkb_layout_set_keycodes
|
||||
(EekXkbLayout *layout,
|
||||
|
||||
@ -244,23 +244,6 @@ eek_xkl_layout_class_init (EekXklLayoutClass *klass)
|
||||
g_object_class_install_property (gobject_class, PROP_OPTIONS, pspec);
|
||||
}
|
||||
|
||||
/* Disabled since the current EekXklLayout implementation does not
|
||||
change the server setting. */
|
||||
#if 0
|
||||
static void
|
||||
on_state_changed (XklEngine *xklengine,
|
||||
XklEngineStateChange type,
|
||||
gint value,
|
||||
gboolean restore,
|
||||
gpointer user_data)
|
||||
{
|
||||
EekLayout *layout = user_data;
|
||||
|
||||
if (type == GROUP_CHANGED)
|
||||
g_signal_emit_by_name (layout, "group_changed", value);
|
||||
}
|
||||
#endif
|
||||
|
||||
static void
|
||||
eek_xkl_layout_init (EekXklLayout *self)
|
||||
{
|
||||
@ -274,13 +257,6 @@ eek_xkl_layout_init (EekXklLayout *self)
|
||||
g_return_if_fail (display);
|
||||
|
||||
priv->engine = xkl_engine_get_instance (display);
|
||||
/* Disabled since the current EekXklLayout implementation does not
|
||||
change the server setting. */
|
||||
#if 0
|
||||
g_signal_connect (priv->engine, "X-state-changed",
|
||||
G_CALLBACK(on_state_changed), self);
|
||||
xkl_engine_start_listen (priv->engine, XKLL_TRACK_KEYBOARD_STATE);
|
||||
#endif
|
||||
xkl_config_rec_get_from_server (priv->config, priv->engine);
|
||||
set_xkb_component_names (self, priv->config);
|
||||
}
|
||||
@ -400,7 +376,11 @@ eek_xkl_layout_set_model (EekXklLayout *layout,
|
||||
|
||||
g_return_val_if_fail (priv, FALSE);
|
||||
config = xkl_config_rec_new ();
|
||||
config->model = (gchar *)model;
|
||||
/* config->model will be freed on g_object_unref (config) */
|
||||
if (model)
|
||||
config->model = g_strdup (model);
|
||||
else
|
||||
config->model = NULL;
|
||||
success = eek_xkl_layout_set_config (layout, config);
|
||||
g_object_unref (config);
|
||||
return success;
|
||||
@ -424,7 +404,11 @@ eek_xkl_layout_set_layouts (EekXklLayout *layout,
|
||||
|
||||
g_return_val_if_fail (priv, FALSE);
|
||||
config = xkl_config_rec_new ();
|
||||
config->layouts = layouts;
|
||||
/* config->layouts will be freed on g_object_unref (config) */
|
||||
if (layouts)
|
||||
config->layouts = g_strdupv (layouts);
|
||||
else
|
||||
config->layouts = layouts;
|
||||
success = eek_xkl_layout_set_config (layout, config);
|
||||
g_object_unref (config);
|
||||
return success;
|
||||
@ -448,7 +432,11 @@ eek_xkl_layout_set_variants (EekXklLayout *layout,
|
||||
|
||||
g_return_val_if_fail (priv, FALSE);
|
||||
config = xkl_config_rec_new ();
|
||||
config->variants = variants;
|
||||
/* config->variants will be freed on g_object_unref (config) */
|
||||
if (variants)
|
||||
config->variants = g_strdupv (variants);
|
||||
else
|
||||
config->variants = NULL;
|
||||
success = eek_xkl_layout_set_config (layout, config);
|
||||
g_object_unref (config);
|
||||
return success;
|
||||
@ -472,7 +460,11 @@ eek_xkl_layout_set_options (EekXklLayout *layout,
|
||||
|
||||
g_return_val_if_fail (priv, FALSE);
|
||||
config = xkl_config_rec_new ();
|
||||
config->options = options;
|
||||
/* config->options will be freed on g_object_unref (config) */
|
||||
if (options)
|
||||
config->options = options;
|
||||
else
|
||||
config->options = NULL;
|
||||
success = eek_xkl_layout_set_config (layout, config);
|
||||
g_object_unref (config);
|
||||
return success;
|
||||
@ -549,7 +541,7 @@ eek_xkl_layout_get_model (EekXklLayout *layout)
|
||||
EekXklLayoutPrivate *priv = EEK_XKL_LAYOUT_GET_PRIVATE (layout);
|
||||
|
||||
g_return_val_if_fail (priv, NULL);
|
||||
return priv->config->model;
|
||||
return g_strdup (priv->config->model);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -565,7 +557,7 @@ eek_xkl_layout_get_layouts (EekXklLayout *layout)
|
||||
EekXklLayoutPrivate *priv = EEK_XKL_LAYOUT_GET_PRIVATE (layout);
|
||||
|
||||
g_return_val_if_fail (priv, NULL);
|
||||
return priv->config->layouts;
|
||||
return g_strdupv (priv->config->layouts);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -581,7 +573,7 @@ eek_xkl_layout_get_variants (EekXklLayout *layout)
|
||||
EekXklLayoutPrivate *priv = EEK_XKL_LAYOUT_GET_PRIVATE (layout);
|
||||
|
||||
g_return_val_if_fail (priv, NULL);
|
||||
return priv->config->variants;
|
||||
return g_strdupv (priv->config->variants);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -597,7 +589,7 @@ eek_xkl_layout_get_options (EekXklLayout *layout)
|
||||
EekXklLayoutPrivate *priv = EEK_XKL_LAYOUT_GET_PRIVATE (layout);
|
||||
|
||||
g_return_val_if_fail (priv, NULL);
|
||||
return priv->config->options;
|
||||
return g_strdupv (priv->config->options);
|
||||
}
|
||||
|
||||
static gboolean
|
||||
|
||||
23
eekboard-sample.conf
Normal file
23
eekboard-sample.conf
Normal file
@ -0,0 +1,23 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<eekboard>
|
||||
<config>
|
||||
<name>Thai Kinesis</name>
|
||||
<model>kinesis</model>
|
||||
<layouts>pc+us+th(pat)</layouts>
|
||||
</config>
|
||||
<config>
|
||||
<name>Tifinagh Typematrix</name>
|
||||
<model>tm2030USB-106</model>
|
||||
<layouts>pc+us+ma(tifinagh-extended-phonetic)</layouts>
|
||||
</config>
|
||||
<config>
|
||||
<name>Indic Bengali Microsoft Natural</name>
|
||||
<model>microsoft</model>
|
||||
<layouts>pc+us+in(ben)</layouts>
|
||||
</config>
|
||||
<config>
|
||||
<name>US Generic 104-key PC</name>
|
||||
<model>pc104</model>
|
||||
<layouts>pc+us</layouts>
|
||||
</config>
|
||||
</eekboard>
|
||||
54
po/ja.po
54
po/ja.po
@ -6,10 +6,10 @@
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: eekboard 0.0.0\n"
|
||||
"Project-Id-Version: eekboard 0.0.3\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2010-06-21 12:42+0900\n"
|
||||
"PO-Revision-Date: 2010-06-21 12:45+0900\n"
|
||||
"POT-Creation-Date: 2010-06-23 16:52+0900\n"
|
||||
"PO-Revision-Date: 2010-06-23 16:55+0900\n"
|
||||
"Last-Translator: Daiki Ueno <ueno@unixuser.org>\n"
|
||||
"Language-Team: Japanese\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
@ -17,46 +17,74 @@ msgstr ""
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
|
||||
#: ../src/eekboard.c:195
|
||||
#: ../src/eekboard.c:198
|
||||
msgid "_File"
|
||||
msgstr "ファイル"
|
||||
|
||||
#: ../src/eekboard.c:196
|
||||
#: ../src/eekboard.c:199
|
||||
msgid "_Keyboard"
|
||||
msgstr "キーボード"
|
||||
|
||||
#: ../src/eekboard.c:197
|
||||
#: ../src/eekboard.c:200
|
||||
msgid "_Help"
|
||||
msgstr "ヘルプ"
|
||||
|
||||
#: ../src/eekboard.c:199
|
||||
#: ../src/eekboard.c:202
|
||||
msgid "Country"
|
||||
msgstr "国"
|
||||
|
||||
#: ../src/eekboard.c:201
|
||||
#: ../src/eekboard.c:204
|
||||
msgid "Language"
|
||||
msgstr "言語"
|
||||
|
||||
#: ../src/eekboard.c:203
|
||||
#: ../src/eekboard.c:206
|
||||
msgid "Model"
|
||||
msgstr "モデル"
|
||||
|
||||
#: ../src/eekboard.c:205
|
||||
#: ../src/eekboard.c:208
|
||||
msgid "Layout"
|
||||
msgstr "レイアウト"
|
||||
|
||||
#: ../src/eekboard.c:207
|
||||
#: ../src/eekboard.c:210
|
||||
msgid "Option"
|
||||
msgstr "オプション"
|
||||
|
||||
#: ../src/eekboard.c:214
|
||||
#: ../src/eekboard.c:217
|
||||
msgid "Monitor Key Typing"
|
||||
msgstr "打鍵をモニタ"
|
||||
|
||||
#: ../src/eekboard.c:232
|
||||
msgid "Keyboard model to display"
|
||||
msgstr "表示するキーボードのモデル"
|
||||
|
||||
#: ../src/eekboard.c:234
|
||||
msgid "Keyboard layouts to display, separated with commas"
|
||||
msgstr "表示するキーボードのレイアウト,カンマ区切り"
|
||||
|
||||
#: ../src/eekboard.c:236
|
||||
msgid "Keyboard layout options to display, separated with commas"
|
||||
msgstr "表示するキーボードのオプション,カンマ区切り"
|
||||
|
||||
#: ../src/eekboard.c:238
|
||||
msgid "List keyboard models"
|
||||
msgstr "キーボードのモデルを一覧"
|
||||
|
||||
#: ../src/eekboard.c:240
|
||||
msgid "List all available keyboard layouts and variants"
|
||||
msgstr "利用可能なキーボードのレイアウトとバリアントを一覧"
|
||||
|
||||
#: ../src/eekboard.c:242
|
||||
msgid "List all available keyboard layout options"
|
||||
msgstr "利用可能なキーボードのレイアウトオプションを一覧"
|
||||
|
||||
#: ../src/eekboard.c:244
|
||||
msgid "Display version"
|
||||
msgstr "バージョンを表示"
|
||||
|
||||
#: ../src/eekboard.c:261
|
||||
msgid "A virtual keyboard for GNOME"
|
||||
msgstr "GNOME 向け仮想キーボード"
|
||||
|
||||
#: ../src/eekboard.c:236
|
||||
#: ../src/eekboard.c:265
|
||||
msgid "Eekboard web site"
|
||||
msgstr "Eekboard のウェブサイト"
|
||||
|
||||
@ -22,27 +22,28 @@ eekboard_CFLAGS = \
|
||||
-I$(top_srcdir) \
|
||||
$(GOBJECT2_CFLAGS) \
|
||||
$(GTK2_CFLAGS) \
|
||||
$(GCONF2_CFLAGS) \
|
||||
$(XKB_CFLAGS) \
|
||||
$(LIBXKLAVIER_CFLAGS) \
|
||||
$(LIBFAKEKEY_CFLAGS)
|
||||
$(LIBFAKEKEY_CFLAGS) \
|
||||
$(CSPI_CFLAGS) \
|
||||
$(NOTIFY_CFLAGS)
|
||||
|
||||
eekboard_LDFLAGS = \
|
||||
$(top_builddir)/eek/libeek.la \
|
||||
$(top_builddir)/eek/libeek-xkl.la \
|
||||
$(top_builddir)/eek/libeek-gtk.la \
|
||||
$(GOBJECT2_LIBS) \
|
||||
$(GTK2_CFLAGS) \
|
||||
$(GTK2_LIBS) \
|
||||
$(GCONF2_LIBS) \
|
||||
$(XKB_LIBS) \
|
||||
$(LIBXKLAVIER_LIBS) \
|
||||
$(LIBFAKEKEY_LIBS)
|
||||
$(LIBFAKEKEY_LIBS) \
|
||||
$(CSPI_LIBS) \
|
||||
$(NOTIFY_LIBS)
|
||||
|
||||
if HAVE_CLUTTER
|
||||
eekboard_CFLAGS += $(CLUTTER_CFLAGS)
|
||||
eekboard_LDFLAGS += $(CLUTTER_LIBS)
|
||||
endif
|
||||
|
||||
if HAVE_CLUTTER_GTK
|
||||
eekboard_CFLAGS += $(CLUTTER_GTK_CFLAGS)
|
||||
eekboard_LDFLAGS += $(top_builddir)/eek/libeek-clutter.la $(CLUTTER_GTK_LIBS)
|
||||
eekboard_CFLAGS += $(CLUTTER_CFLAGS) $(CLUTTER_GTK_CFLAGS)
|
||||
eekboard_LDFLAGS += $(CLUTTER_LIBS) $(top_builddir)/eek/libeek-clutter.la $(CLUTTER_GTK_LIBS)
|
||||
endif
|
||||
endif
|
||||
|
||||
863
src/eekboard.c
863
src/eekboard.c
File diff suppressed because it is too large
Load Diff
@ -16,7 +16,7 @@
|
||||
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
|
||||
# 02110-1301 USA
|
||||
|
||||
INCLUDES = -I$(top_srcdir) $(GOBJECT2_CFLAGS) $(GTK2_CFLAGS) $(XKB_CFLAGS)
|
||||
INCLUDES = -I$(top_srcdir) $(GOBJECT2_CFLAGS) $(GTK_CFLAGS) $(XKB_CFLAGS)
|
||||
|
||||
TESTS = eek-simple-test eek-xkb-test
|
||||
noinst_PROGRAMS = $(TESTS)
|
||||
|
||||
@ -17,7 +17,7 @@
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
|
||||
* 02110-1301 USA
|
||||
*/
|
||||
#include "eek.h"
|
||||
#include "eek/eek.h"
|
||||
|
||||
static void
|
||||
test_create (void)
|
||||
|
||||
@ -17,7 +17,7 @@
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
|
||||
* 02110-1301 USA
|
||||
*/
|
||||
#include "eek-xkb.h"
|
||||
#include "eek/eek-xkb.h"
|
||||
|
||||
/* For gdk_x11_display_get_xdisplay(). See main(). */
|
||||
#include <gtk/gtk.h>
|
||||
|
||||
Reference in New Issue
Block a user