[caribou] Introduced GTK3 input method module.



commit 7ab9a3caf8cdf9dc88380603cacaee890854a6ba
Author: Eitan Isaacson <eitan monotonous org>
Date:   Thu Jun 2 17:57:52 2011 -0700

    Introduced GTK3 input method module.

 .gitignore                     |    7 +++--
 Makefile.am                    |    4 +++
 configure.ac                   |   28 +++++++++++++++++++++
 im/Makefile.am                 |    1 +
 im/gtk3/Makefile.am            |   29 ++++++++++++++++++++++
 im/gtk3/caribou-im.c           |   53 ++++++++++++++++++++++++++++++++++++++++
 im/gtk3/caribou-imcontext.vala |   51 ++++++++++++++++++++++++++++++++++++++
 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



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]