summaryrefslogtreecommitdiffstats
path: root/ibus/inputcontext.py
diff options
context:
space:
mode:
Diffstat (limited to 'ibus/inputcontext.py')
-rw-r--r--ibus/inputcontext.py301
1 files changed, 301 insertions, 0 deletions
diff --git a/ibus/inputcontext.py b/ibus/inputcontext.py
new file mode 100644
index 0000000..10233da
--- /dev/null
+++ b/ibus/inputcontext.py
@@ -0,0 +1,301 @@
+# vim:set et sts=4 sw=4:
+#
+# ibus - The Input Bus
+#
+# Copyright (c) 2007-2008 Huang Peng <shawn.p.huang@gmail.com>
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this program; if not, write to the
+# Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+# Boston, MA 02111-1307 USA
+
+__all__ = (
+ "InputContext",
+ )
+
+import sys
+import gobject
+import dbus
+import dbus.lowlevel
+import object
+import common
+import serializable
+
+class InputContext(object.Object):
+ __gsignals__ = {
+ "commit-text" : (
+ gobject.SIGNAL_RUN_LAST,
+ gobject.TYPE_NONE,
+ (gobject.TYPE_PYOBJECT, )
+ ),
+ "update-preedit-text" : (
+ gobject.SIGNAL_RUN_LAST,
+ gobject.TYPE_NONE,
+ (gobject.TYPE_PYOBJECT, gobject.TYPE_UINT, gobject.TYPE_BOOLEAN)
+ ),
+ "show-preedit-text" : (
+ gobject.SIGNAL_RUN_LAST,
+ gobject.TYPE_NONE,
+ ()
+ ),
+ "hide-preedit-text" : (
+ gobject.SIGNAL_RUN_LAST,
+ gobject.TYPE_NONE,
+ ()
+ ),
+ "update-auxiliary-text" : (
+ gobject.SIGNAL_RUN_LAST,
+ gobject.TYPE_NONE,
+ (gobject.TYPE_PYOBJECT, gobject.TYPE_BOOLEAN)
+ ),
+ "show-auxiliary-text" : (
+ gobject.SIGNAL_RUN_LAST,
+ gobject.TYPE_NONE,
+ ()
+ ),
+ "hide-auxiliary-text" : (
+ gobject.SIGNAL_RUN_LAST,
+ gobject.TYPE_NONE,
+ ()
+ ),
+ "update-lookup-table" : (
+ gobject.SIGNAL_RUN_LAST,
+ gobject.TYPE_NONE,
+ (gobject.TYPE_PYOBJECT, gobject.TYPE_BOOLEAN)
+ ),
+ "show-lookup-table" : (
+ gobject.SIGNAL_RUN_LAST,
+ gobject.TYPE_NONE,
+ ()
+ ),
+ "hide-lookup-table" : (
+ gobject.SIGNAL_RUN_LAST,
+ gobject.TYPE_NONE,
+ ()
+ ),
+ "page-up-lookup-table" : (
+ gobject.SIGNAL_RUN_LAST,
+ gobject.TYPE_NONE,
+ ()
+ ),
+ "page-down-lookup-table" : (
+ gobject.SIGNAL_RUN_LAST,
+ gobject.TYPE_NONE,
+ ()
+ ),
+ "cursor-up-lookup-table" : (
+ gobject.SIGNAL_RUN_LAST,
+ gobject.TYPE_NONE,
+ ()
+ ),
+ "cursor-down-lookup-table" : (
+ gobject.SIGNAL_RUN_LAST,
+ gobject.TYPE_NONE,
+ ()
+ ),
+ "enabled" : (
+ gobject.SIGNAL_RUN_LAST,
+ gobject.TYPE_NONE,
+ ()
+ ),
+ "disabled" : (
+ gobject.SIGNAL_RUN_LAST,
+ gobject.TYPE_NONE,
+ ()
+ ),
+ }
+
+ def __init__(self, bus, path):
+ super(InputContext, self).__init__()
+
+ self.__bus = bus
+ self.__context = bus.get_dbusconn().get_object(common.IBUS_SERVICE_IBUS, path)
+ self.__signal_matches = []
+
+ m = self.__context.connect_to_signal("CommitText", self.__commit_text_cb)
+ self.__signal_matches.append(m)
+ m = self.__context.connect_to_signal("UpdatePreeditText", self.__update_preedit_text_cb)
+ self.__signal_matches.append(m)
+ m = self.__context.connect_to_signal("UpdateAuxiliaryText", self.__update_auxiliary_text_cb)
+ self.__signal_matches.append(m)
+ m = self.__context.connect_to_signal("UpdateLookupTable", self.__update_lookup_table_cb)
+ self.__signal_matches.append(m)
+
+ m = self.__context.connect_to_signal("Enabled", lambda *args: self.emit("enabled"))
+ self.__signal_matches.append(m)
+ m = self.__context.connect_to_signal("Disabled", lambda *args: self.emit("disabled"))
+ self.__signal_matches.append(m)
+ m = self.__context.connect_to_signal("ShowPreeditText", lambda *args: self.emit("show-preedit-text"))
+ self.__signal_matches.append(m)
+ m = self.__context.connect_to_signal("HidePreeditText", lambda *args: self.emit("hide-preedit-text"))
+ self.__signal_matches.append(m)
+ m = self.__context.connect_to_signal("ShowAuxiliaryText", lambda *args: self.emit("show-auxiliary-text"))
+ self.__signal_matches.append(m)
+ m = self.__context.connect_to_signal("HideAuxiliaryText", lambda *args: self.emit("hide-auxiliary-text"))
+ self.__signal_matches.append(m)
+ m = self.__context.connect_to_signal("ShowLookupTable", lambda *args: self.emit("show-lookup-table"))
+ self.__signal_matches.append(m)
+ m = self.__context.connect_to_signal("HideLookupTable", lambda *argss: self.emit("hide-lookup-table"))
+ self.__signal_matches.append(m)
+ m = self.__context.connect_to_signal("PageUpLookupTable", lambda *args: self.emit("page-up-lookup-table"))
+ self.__signal_matches.append(m)
+ m = self.__context.connect_to_signal("PageDownLookupTable", lambda *args: self.emit("page-down-lookup-table"))
+ self.__signal_matches.append(m)
+ m = self.__context.connect_to_signal("CursorUpLookupTable", lambda *args: self.emit("cursor-up-lookup-table"))
+ self.__signal_matches.append(m)
+ m = self.__context.connect_to_signal("CursorDownLookupTable", lambda *args: self.emit("cursor-down-lookup-table"))
+ self.__signal_matches.append(m)
+
+ def __commit_text_cb(self, *args):
+ text = serializable.deserialize_object(args[0])
+ self.emit("commit-text", text)
+
+ def __update_preedit_text_cb(self, *args):
+ text = serializable.deserialize_object(args[0])
+ cursor_pos = args[1]
+ visible = args[2]
+ self.emit("update-preedit-text", text, cursor_pos, visible)
+
+ def __update_auxiliary_text_cb(self, *args):
+ text = serializable.deserialize_object(args[0])
+ visible = args[1]
+ self.emit("update-auxiliray-text", text, visible)
+
+ def __update_lookup_table_cb(self, *args):
+ table = serializable.deserialize_object(args[0])
+ visible = args[1]
+ self.emit("update-lookup-table", table, visible)
+
+ def process_key_event(self, keyval, modifiers):
+ keyval = dbus.UInt32(keyval)
+ modifiers = dbus.UInt32(modifiers)
+ return self.__context.ProcessKeyEvent(keyval, modifiers)
+
+ def set_cursor_location(self, x, y, w, h):
+ x = dbus.Int32(x)
+ y = dbus.Int32(y)
+ w = dbus.Int32(w)
+ h = dbus.Int32(h)
+ return self.__context.SetCursorLocation(x, y, w, h)
+
+ def focus_in(self):
+ return self.__context.FocusIn()
+
+ def focus_out(self):
+ return self.__context.FocusOut()
+
+ def reset(self):
+ return self.__context.Reset()
+
+ def is_enabled(self):
+ return self.__context.IsEnabled()
+
+ def set_capabilities(self, caps):
+ caps = dbus.UInt32(caps)
+ return self.__context.SetCapabilities(caps)
+
+ def destroy(self):
+ self.__context.Destroy()
+ super(InputContext, self).destroy()
+
+ def get_engine(self):
+ try:
+ engine = self.__context.GetEngine()
+ engine = serializable.deserialize_object(engine)
+ return engine
+ except:
+ return None
+
+ def set_engine(self, engine):
+ return self.__context.SetEngine(engine.name)
+
+
+def test():
+ import gtk
+ import gtk.gdk
+ from bus import Bus
+ import modifier
+ import text
+ import attribute
+ import property
+ import lookuptable
+ import factory
+
+ class TestWindow(gtk.Window):
+ def __init__(self):
+ super(TestWindow,self).__init__()
+
+ self.__bus = Bus()
+ print self.__bus.get_name()
+ self.__bus.connect("disconnected", gtk.main_quit)
+ context_path = self.__bus.create_input_context("Test")
+ print context_path
+ self.__context = InputContext(self.__bus, context_path)
+ self.__context.set_capabilities (9)
+
+ self.__context.connect("commit-text", self.__commit_text_cb)
+ self.__context.connect("update-preedit-text", self.__update_preedit_text_cb)
+ self.__context.connect("show-preedit-text", self.__show_preedit_text_cb)
+ self.__context.connect("update-auxiliary-text", self.__update_auxiliary_text_cb)
+ self.__context.connect("update-lookup-table", self.__update_lookup_table_cb)
+ self.__context.connect("enabled", self.__enabled_cb)
+ self.__context.connect("disabled", self.__disabled_cb)
+
+ self.set_events(gtk.gdk.KEY_PRESS_MASK | gtk.gdk.KEY_RELEASE_MASK | gtk.gdk.FOCUS_CHANGE_MASK)
+
+ self.connect("key-press-event", self.__key_press_event_cb)
+ self.connect("key-release-event", self.__key_release_event_cb)
+ self.connect("delete-event", gtk.main_quit)
+ self.connect("focus-in-event", lambda *args: self.__context.focus_in())
+ self.connect("focus-out-event", lambda *args: self.__context.focus_out())
+
+ self.show_all()
+
+ def __commit_text_cb(self, context, text):
+ print "commit-text:", text.text
+
+ def __update_preedit_text_cb(self, context, text, cursor_pos, visible):
+ print "preedit-text:", text.text, cursor_pos, visible
+
+ def __show_preedit_text_cb(self, context):
+ print "show-preedit-text"
+
+ def __hide_preedit_text_cb(self, context):
+ print "hide-preedit-text"
+
+ def __update_auxiliary_text_cb(self, context, text, visible):
+ print "auxiliary-text:", text.text, visible
+
+ def __update_lookup_table_cb(self, context, table, visible):
+ print "update-lookup-table:", visible
+
+ def __enabled_cb(self, context):
+ print "enabled"
+ info = context.get_factory_info()
+ print "factory = %s" % info.name
+
+ def __disabled_cb(self, context):
+ print "disabled"
+
+ def __key_press_event_cb(self, widget, event):
+ self.__context.process_key_event(event.keyval, event.state)
+
+ def __key_release_event_cb(self, widget, event):
+ self.__context.process_key_event(event.keyval, event.state | modifier.RELEASE_MASK)
+
+ w = TestWindow()
+ gtk.main()
+
+if __name__ == "__main__":
+ test()
+