summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEitan Isaacson <eitan@monotonous.org>2011-06-02 17:57:52 -0700
committerEitan Isaacson <eitan@monotonous.org>2011-06-06 18:52:23 -0700
commit7ab9a3caf8cdf9dc88380603cacaee890854a6ba (patch)
treed761babf041aae293ae77c1410d3b75fc30f43de
parent843bb24cc3383ff11d76f81f956ef2cfe7ce13cb (diff)
downloadcaribou-7ab9a3caf8cdf9dc88380603cacaee890854a6ba.tar.gz
Introduced GTK3 input method module.
-rw-r--r--.gitignore7
-rw-r--r--Makefile.am4
-rw-r--r--configure.ac28
-rw-r--r--im/Makefile.am1
-rw-r--r--im/gtk3/Makefile.am29
-rw-r--r--im/gtk3/caribou-im.c53
-rw-r--r--im/gtk3/caribou-imcontext.vala51
7 files changed, 170 insertions, 3 deletions
diff --git a/.gitignore b/.gitignore
index 3878274..a183c86 100644
--- a/.gitignore
+++ b/.gitignore
@@ -20,27 +20,28 @@ po/Makefile.in.in
po/POTFILES
po/stamp-it
*.gmo
+*.la
m4/intltool.m4
*.tar.gz
data/*.desktop
po/.intltool-merge-cache
data/*.gschema.*
depcomp
-libcaribou/.deps/
+.deps/
caribou-enum-types.[ch]
caribou-marshal.[ch]
libtool
ltmain.sh
m4
-libcaribou/.libs/
+.libs/
libcaribou/*.gir
libcaribou/*.typelib
*.lo
*.o
-libcaribou/libcaribou.la
libcaribou/*.[ch]
caribou-1.0.vapi
caribou-internals-1.0.vapi
caribou-internals.h
*.stamp
data/org.gnome.Caribou.Antler.service
+caribou-imcontext.[ch]
diff --git a/Makefile.am b/Makefile.am
index 8b57e28..5a1866e 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -1,3 +1,7 @@
ACLOCAL_AMFLAGS = -I m4 ${ACLOCAL_FLAGS}
SUBDIRS = caribou bin data po libcaribou
+
+if ENABLE_IM_MODULES
+SUBDIRS += im
+endif \ No newline at end of file
diff --git a/configure.ac b/configure.ac
index d8d5af1..8babf66 100644
--- a/configure.ac
+++ b/configure.ac
@@ -57,6 +57,32 @@ AC_SUBST(GETTEXT_PACKAGE)
AC_DEFINE_UNQUOTED(GETTEXT_PACKAGE, "$GETTEXT_PACKAGE", [The gettext package])
AM_GLIB_GNU_GETTEXT
+dnl == IM modules ==
+AC_ARG_ENABLE(im_modules,
+ AS_HELP_STRING([--disable-im-modules],
+ [Do not build im modules]),
+ [enable_im_modules=$enableval],
+ [enable_im_modules=yes]
+)
+AM_CONDITIONAL([ENABLE_IM_MODULES], [test x"$enable_im_modules" = x"yes"])
+
+if test x"$enable_im_modules" = x"yes"; then
+ PKG_CHECK_MODULES(GTK2, [
+ gtk+-2.0
+ ])
+ PKG_CHECK_MODULES(GTK3, [
+ gtk+-3.0
+ ])
+ gtk2_binary_version=`$PKG_CONFIG --variable=gtk_binary_version gtk+-2.0`
+ GTK2_IM_MODULEDIR="$libdir"/gtk-2.0/$gtk2_binary_version/immodules
+ AC_SUBST(GTK2_IM_MODULEDIR)
+
+ gtk3_binary_version=`$PKG_CONFIG --variable=gtk_binary_version gtk+-3.0`
+ GTK3_IM_MODULEDIR="$libdir"/gtk-3.0/$gtk3_binary_version/immodules
+ AC_SUBST(GTK3_IM_MODULEDIR)
+fi
+
+dnl == GSettings ==
GLIB_GSETTINGS
dnl == intltool check ==
@@ -87,4 +113,6 @@ data/layouts/Makefile
data/layouts/touch/Makefile
data/layouts/scan/Makefile
libcaribou/Makefile
+im/Makefile
+im/gtk3/Makefile
])
diff --git a/im/Makefile.am b/im/Makefile.am
new file mode 100644
index 0000000..8c1607e
--- /dev/null
+++ b/im/Makefile.am
@@ -0,0 +1 @@
+SUBDIRS = gtk3
diff --git a/im/gtk3/Makefile.am b/im/gtk3/Makefile.am
new file mode 100644
index 0000000..5f2780f
--- /dev/null
+++ b/im/gtk3/Makefile.am
@@ -0,0 +1,29 @@
+immoduledir = @GTK3_IM_MODULEDIR@
+immodule_LTLIBRARIES = im-caribou.la
+
+im_caribou_la_SOURCES = \
+ caribou-im.c \
+ caribou-imcontext.vala \
+ $(NULL)
+
+im_caribou_la_VALAFLAGS = \
+ -h caribou-imcontext.h \
+ --pkg gtk+-3.0 \
+ $(VALAGLAFS)
+
+im_caribou_la_CFLAGS = \
+ @GTK3_CFLAGS@ \
+ -DG_LOG_DOMAIN=\"CARIBOU\" \
+ $(NULL)
+
+im_caribou_la_LIBADD = \
+ @GTK3_LIBS@ \
+ $(NULL)
+
+im_caribou_la_LDFLAGS = \
+ -avoid-version \
+ -module \
+ $(NULL)
+
+EXTRA_DIST = \
+ $(NULL)
diff --git a/im/gtk3/caribou-im.c b/im/gtk3/caribou-im.c
new file mode 100644
index 0000000..24a3def
--- /dev/null
+++ b/im/gtk3/caribou-im.c
@@ -0,0 +1,53 @@
+#include <gtk/gtk.h>
+#include <gtk/gtkimmodule.h>
+#include "caribou-imcontext.h"
+
+#define CARIBOU_LOCALDIR ""
+static const GtkIMContextInfo caribou_im_info = {
+ "caribou",
+ "Caribou OSK helper module",
+ "caribou",
+ "",
+ "*"
+};
+
+static const GtkIMContextInfo *info_list[] = {
+ &caribou_im_info
+};
+
+G_MODULE_EXPORT const gchar*
+g_module_check_init (GModule *module)
+{
+ return glib_check_version (GLIB_MAJOR_VERSION,
+ GLIB_MINOR_VERSION,
+ 0);
+}
+
+G_MODULE_EXPORT void
+im_module_init (GTypeModule *type_module)
+{
+ g_type_module_use (type_module);
+}
+
+G_MODULE_EXPORT void
+im_module_exit (void)
+{
+}
+
+G_MODULE_EXPORT GtkIMContext *
+im_module_create (const gchar *context_id)
+{
+ if (g_strcmp0 (context_id, "caribou") == 0) {
+ CaribouIMContext *context = caribou_im_context_new ();
+ return (GtkIMContext *) context;
+ }
+ return NULL;
+}
+
+G_MODULE_EXPORT void
+im_module_list (const GtkIMContextInfo ***contexts,
+ gint *n_contexts)
+{
+ *contexts = info_list;
+ *n_contexts = G_N_ELEMENTS (info_list);
+}
diff --git a/im/gtk3/caribou-imcontext.vala b/im/gtk3/caribou-imcontext.vala
new file mode 100644
index 0000000..170b304
--- /dev/null
+++ b/im/gtk3/caribou-imcontext.vala
@@ -0,0 +1,51 @@
+namespace Caribou {
+ [DBus(name = "org.gnome.Caribou.Keyboard")]
+ interface Keyboard : Object {
+ public abstract void set_cursor_location (int x, int y, int w, int h) throws IOError;
+ public abstract void set_entry_location (int x, int y, int w, int h) throws IOError;
+ public abstract void show () throws IOError;
+ public abstract void hide () throws IOError;
+ }
+
+ class IMContext : Gtk.IMContextSimple {
+ private Gdk.Window window;
+ private Keyboard keyboard;
+
+ public IMContext () {
+ }
+
+ public override void focus_in () {
+ int x, y;
+ window.get_origin (out x, out y);
+ stdout.printf ("focus_in %d %d\n", x, y);
+ try {
+ keyboard.show ();
+ keyboard.set_entry_location (x, y,
+ window.get_width (),
+ window.get_height ());
+ } catch (IOError e) {
+ stderr.printf ("%s\n", e.message);
+ }
+ }
+
+ public override void focus_out () {
+ try {
+ keyboard.hide ();
+ } catch (IOError e) {
+ stderr.printf ("%s\n", e.message);
+ }
+ }
+
+ public override void set_client_window (Gdk.Window window) {
+ this.window = window;
+ try {
+ keyboard = Bus.get_proxy_sync (BusType.SESSION,
+ "org.gnome.Caribou.Antler",
+ "/org/gnome/Caribou/Antler");
+ } catch (Error e) {
+ stderr.printf ("%s\n", e.message);
+ }
+ stdout.printf ("set_client_window\n");
+ }
+ }
+} \ No newline at end of file