Blame ibus/inputcontext.py

Packit 3ff832
# vim:set et sts=4 sw=4:
Packit 3ff832
#
Packit 3ff832
# ibus - The Input Bus
Packit 3ff832
#
Packit 3ff832
# Copyright (c) 2007-2010 Peng Huang <shawn.p.huang@gmail.com>
Packit 3ff832
# Copyright (c) 2007-2010 Red Hat, Inc.
Packit 3ff832
#
Packit 3ff832
# This library is free software; you can redistribute it and/or
Packit 3ff832
# modify it under the terms of the GNU Lesser General Public
Packit 3ff832
# License as published by the Free Software Foundation; either
Packit 3ff832
# version 2.1 of the License, or (at your option) any later version.
Packit 3ff832
#
Packit 3ff832
# This library is distributed in the hope that it will be useful,
Packit 3ff832
# but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit 3ff832
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit 3ff832
# Lesser General Public License for more details.
Packit 3ff832
#
Packit 3ff832
# You should have received a copy of the GNU Lesser General Public
Packit 3ff832
# License along with this library; if not, write to the Free Software
Packit 3ff832
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301
Packit 3ff832
# USA
Packit 3ff832
Packit 3ff832
__all__ = (
Packit 3ff832
        "InputContext",
Packit 3ff832
    )
Packit 3ff832
Packit 3ff832
import sys
Packit 3ff832
import gobject
Packit 3ff832
import dbus
Packit 3ff832
import dbus.lowlevel
Packit 3ff832
import object
Packit 3ff832
import common
Packit 3ff832
import serializable
Packit 3ff832
from text import Text
Packit 3ff832
Packit 3ff832
class InputContext(object.Object):
Packit 3ff832
    __gtype_name__ = "PYIBusInputContext"
Packit 3ff832
    __gsignals__ = {
Packit 3ff832
        "commit-text" : (
Packit 3ff832
            gobject.SIGNAL_RUN_LAST,
Packit 3ff832
            gobject.TYPE_NONE,
Packit 3ff832
            (gobject.TYPE_PYOBJECT, )
Packit 3ff832
        ),
Packit 3ff832
        "update-preedit-text" : (
Packit 3ff832
            gobject.SIGNAL_RUN_LAST,
Packit 3ff832
            gobject.TYPE_NONE,
Packit 3ff832
            (gobject.TYPE_PYOBJECT, gobject.TYPE_UINT, gobject.TYPE_BOOLEAN)
Packit 3ff832
        ),
Packit 3ff832
        "show-preedit-text" : (
Packit 3ff832
            gobject.SIGNAL_RUN_LAST,
Packit 3ff832
            gobject.TYPE_NONE,
Packit 3ff832
            ()
Packit 3ff832
        ),
Packit 3ff832
        "hide-preedit-text" : (
Packit 3ff832
            gobject.SIGNAL_RUN_LAST,
Packit 3ff832
            gobject.TYPE_NONE,
Packit 3ff832
            ()
Packit 3ff832
        ),
Packit 3ff832
        "update-auxiliary-text" : (
Packit 3ff832
            gobject.SIGNAL_RUN_LAST,
Packit 3ff832
            gobject.TYPE_NONE,
Packit 3ff832
            (gobject.TYPE_PYOBJECT, gobject.TYPE_BOOLEAN)
Packit 3ff832
        ),
Packit 3ff832
        "show-auxiliary-text" : (
Packit 3ff832
            gobject.SIGNAL_RUN_LAST,
Packit 3ff832
            gobject.TYPE_NONE,
Packit 3ff832
            ()
Packit 3ff832
        ),
Packit 3ff832
        "hide-auxiliary-text" : (
Packit 3ff832
            gobject.SIGNAL_RUN_LAST,
Packit 3ff832
            gobject.TYPE_NONE,
Packit 3ff832
            ()
Packit 3ff832
        ),
Packit 3ff832
        "update-lookup-table" : (
Packit 3ff832
            gobject.SIGNAL_RUN_LAST,
Packit 3ff832
            gobject.TYPE_NONE,
Packit 3ff832
            (gobject.TYPE_PYOBJECT, gobject.TYPE_BOOLEAN)
Packit 3ff832
        ),
Packit 3ff832
        "show-lookup-table" : (
Packit 3ff832
            gobject.SIGNAL_RUN_LAST,
Packit 3ff832
            gobject.TYPE_NONE,
Packit 3ff832
            ()
Packit 3ff832
        ),
Packit 3ff832
        "hide-lookup-table" : (
Packit 3ff832
            gobject.SIGNAL_RUN_LAST,
Packit 3ff832
            gobject.TYPE_NONE,
Packit 3ff832
            ()
Packit 3ff832
        ),
Packit 3ff832
        "page-up-lookup-table" : (
Packit 3ff832
            gobject.SIGNAL_RUN_LAST,
Packit 3ff832
            gobject.TYPE_NONE,
Packit 3ff832
            ()
Packit 3ff832
        ),
Packit 3ff832
        "page-down-lookup-table" : (
Packit 3ff832
            gobject.SIGNAL_RUN_LAST,
Packit 3ff832
            gobject.TYPE_NONE,
Packit 3ff832
            ()
Packit 3ff832
        ),
Packit 3ff832
        "cursor-up-lookup-table" : (
Packit 3ff832
            gobject.SIGNAL_RUN_LAST,
Packit 3ff832
            gobject.TYPE_NONE,
Packit 3ff832
            ()
Packit 3ff832
        ),
Packit 3ff832
        "cursor-down-lookup-table" : (
Packit 3ff832
            gobject.SIGNAL_RUN_LAST,
Packit 3ff832
            gobject.TYPE_NONE,
Packit 3ff832
            ()
Packit 3ff832
        ),
Packit 3ff832
        "enabled" : (
Packit 3ff832
            gobject.SIGNAL_RUN_LAST,
Packit 3ff832
            gobject.TYPE_NONE,
Packit 3ff832
            ()
Packit 3ff832
        ),
Packit 3ff832
        "disabled" : (
Packit 3ff832
            gobject.SIGNAL_RUN_LAST,
Packit 3ff832
            gobject.TYPE_NONE,
Packit 3ff832
            ()
Packit 3ff832
        ),
Packit 3ff832
        "forward-key-event" : (
Packit 3ff832
            gobject.SIGNAL_RUN_LAST,
Packit 3ff832
            gobject.TYPE_NONE,
Packit 3ff832
            (gobject.TYPE_UINT, gobject.TYPE_UINT, gobject.TYPE_UINT)
Packit 3ff832
        ),
Packit 3ff832
        "delete-surrounding-text" : (
Packit 3ff832
            gobject.SIGNAL_RUN_LAST,
Packit 3ff832
            gobject.TYPE_NONE,
Packit 3ff832
            (gobject.TYPE_INT, gobject.TYPE_UINT)
Packit 3ff832
        ),
Packit 3ff832
    }
Packit 3ff832
Packit 3ff832
    def __init__(self, bus, path, watch_signals=False):
Packit 3ff832
        super(InputContext, self).__init__()
Packit 3ff832
Packit 3ff832
        self.__bus = bus
Packit 3ff832
        _context = bus.get_dbusconn().get_object(common.IBUS_SERVICE_IBUS, path)
Packit 3ff832
        self.__context = dbus.Interface(_context, dbus_interface="org.freedesktop.IBus.InputContext")
Packit 3ff832
        self.__signal_matches = []
Packit 3ff832
        self.__needs_surrounding_text = False
Packit 3ff832
        self.__surrounding_text = Text()
Packit 3ff832
        self.__surrounding_cursor_pos = 0
Packit 3ff832
        self.__selection_anchor_pos = 0
Packit 3ff832
Packit 3ff832
        if not watch_signals:
Packit 3ff832
            return
Packit 3ff832
Packit 3ff832
        m = self.__context.connect_to_signal("CommitText", self.__commit_text_cb)
Packit 3ff832
        self.__signal_matches.append(m)
Packit 3ff832
        m = self.__context.connect_to_signal("UpdatePreeditText", self.__update_preedit_text_cb)
Packit 3ff832
        self.__signal_matches.append(m)
Packit 3ff832
        m = self.__context.connect_to_signal("UpdateAuxiliaryText", self.__update_auxiliary_text_cb)
Packit 3ff832
        self.__signal_matches.append(m)
Packit 3ff832
        m = self.__context.connect_to_signal("UpdateLookupTable", self.__update_lookup_table_cb)
Packit 3ff832
        self.__signal_matches.append(m)
Packit 3ff832
        m = self.__context.connect_to_signal("RequireSurroundingText", self.__require_surrounding_text_cb)
Packit 3ff832
        self.__signal_matches.append(m)
Packit 3ff832
Packit 3ff832
        m = self.__context.connect_to_signal("ForwardKeyEvent",            lambda *args: self.emit("forward-key-event", *args))
Packit 3ff832
        self.__signal_matches.append(m)
Packit 3ff832
        m = self.__context.connect_to_signal("DeleteSurroundingText",            lambda *args: self.emit("delete-surrounding-text", *args))
Packit 3ff832
        self.__signal_matches.append(m)
Packit 3ff832
        m = self.__context.connect_to_signal("Disabled",            lambda *args: self.emit("disabled"))
Packit 3ff832
        self.__signal_matches.append(m)
Packit 3ff832
        m = self.__context.connect_to_signal("ShowPreeditText",     lambda *args: self.emit("show-preedit-text"))
Packit 3ff832
        self.__signal_matches.append(m)
Packit 3ff832
        m = self.__context.connect_to_signal("HidePreeditText",     lambda *args: self.emit("hide-preedit-text"))
Packit 3ff832
        self.__signal_matches.append(m)
Packit 3ff832
        m = self.__context.connect_to_signal("ShowAuxiliaryText",   lambda *args: self.emit("show-auxiliary-text"))
Packit 3ff832
        self.__signal_matches.append(m)
Packit 3ff832
        m = self.__context.connect_to_signal("HideAuxiliaryText",   lambda *args: self.emit("hide-auxiliary-text"))
Packit 3ff832
        self.__signal_matches.append(m)
Packit 3ff832
        m = self.__context.connect_to_signal("ShowLookupTable",     lambda *args: self.emit("show-lookup-table"))
Packit 3ff832
        self.__signal_matches.append(m)
Packit 3ff832
        m = self.__context.connect_to_signal("HideLookupTable",     lambda *argss: self.emit("hide-lookup-table"))
Packit 3ff832
        self.__signal_matches.append(m)
Packit 3ff832
        m = self.__context.connect_to_signal("PageUpLookupTable",   lambda *args: self.emit("page-up-lookup-table"))
Packit 3ff832
        self.__signal_matches.append(m)
Packit 3ff832
        m = self.__context.connect_to_signal("PageDownLookupTable", lambda *args: self.emit("page-down-lookup-table"))
Packit 3ff832
        self.__signal_matches.append(m)
Packit 3ff832
        m = self.__context.connect_to_signal("CursorUpLookupTable", lambda *args: self.emit("cursor-up-lookup-table"))
Packit 3ff832
        self.__signal_matches.append(m)
Packit 3ff832
        m = self.__context.connect_to_signal("CursorDownLookupTable", lambda *args: self.emit("cursor-down-lookup-table"))
Packit 3ff832
        self.__signal_matches.append(m)
Packit 3ff832
Packit 3ff832
    def __commit_text_cb(self, *args):
Packit 3ff832
        text = serializable.deserialize_object(args[0])
Packit 3ff832
        self.emit("commit-text", text)
Packit 3ff832
Packit 3ff832
    def __update_preedit_text_cb(self, *args):
Packit 3ff832
        text = serializable.deserialize_object(args[0])
Packit 3ff832
        cursor_pos = args[1]
Packit 3ff832
        visible = args[2]
Packit 3ff832
        self.emit("update-preedit-text", text, cursor_pos, visible)
Packit 3ff832
Packit 3ff832
    def __update_auxiliary_text_cb(self, *args):
Packit 3ff832
        text = serializable.deserialize_object(args[0])
Packit 3ff832
        visible = args[1]
Packit 3ff832
        self.emit("update-auxiliary-text", text, visible)
Packit 3ff832
Packit 3ff832
    def __update_lookup_table_cb(self, *args):
Packit 3ff832
        table = serializable.deserialize_object(args[0])
Packit 3ff832
        visible = args[1]
Packit 3ff832
        self.emit("update-lookup-table", table, visible)
Packit 3ff832
Packit 3ff832
    def __require_surrounding_text_cb(self, *args):
Packit 3ff832
        self.__needs_surrounding_text = True
Packit 3ff832
Packit 3ff832
    def needs_surrounding_text(self):
Packit 3ff832
        return self.__needs_surrounding_text
Packit 3ff832
Packit 3ff832
    def set_surrounding_text(self, text, cursor_pos, anchor_pos):
Packit 3ff832
        if self.__surrounding_text.get_text() != text or \
Packit 3ff832
                self.__surrounding_cursor_pos != cursor_pos or \
Packit 3ff832
                self.__selection_anchor_pos != anchor_pos:
Packit 3ff832
            self.__surrounding_text = Text(text)
Packit 3ff832
            self.__surrounding_cursor_pos = cursor_pos
Packit 3ff832
            self.__selection_anchor_pos = anchor_pos
Packit 3ff832
            text = serializable.serialize_object(self.__surrounding_text)
Packit 3ff832
            cursor_pos = dbus.UInt32(self.__surrounding_cursor_pos)
Packit 3ff832
            anchor_pos = dbus.UInt32(self.__selection_anchor_pos)
Packit 3ff832
            self.__context.SetSurroundingText(text, cursor_pos, anchor_pos)
Packit 3ff832
Packit 3ff832
    def process_key_event(self, keyval, keycode, modifiers):
Packit 3ff832
        keyval = dbus.UInt32(keyval)
Packit 3ff832
        keycode = dbus.UInt32(keycode)
Packit 3ff832
        modifiers = dbus.UInt32(modifiers)
Packit 3ff832
        return self.__context.ProcessKeyEvent(keyval, keycode, modifiers)
Packit 3ff832
Packit 3ff832
    def set_cursor_location(self, x, y, w, h):
Packit 3ff832
        x = dbus.Int32(x)
Packit 3ff832
        y = dbus.Int32(y)
Packit 3ff832
        w = dbus.Int32(w)
Packit 3ff832
        h = dbus.Int32(h)
Packit 3ff832
        return self.__context.SetCursorLocation(x, y, w, h)
Packit 3ff832
Packit 3ff832
    def focus_in(self):
Packit 3ff832
        return self.__context.FocusIn()
Packit 3ff832
Packit 3ff832
    def focus_out(self):
Packit 3ff832
        return self.__context.FocusOut()
Packit 3ff832
Packit 3ff832
    def reset(self):
Packit 3ff832
        return self.__context.Reset()
Packit 3ff832
Packit 3ff832
    def set_capabilities(self, caps):
Packit 3ff832
        caps = dbus.UInt32(caps)
Packit 3ff832
        return self.__context.SetCapabilities(caps)
Packit 3ff832
Packit 3ff832
    def detach_signals(self):
Packit 3ff832
        for m in self.__signal_matches:
Packit 3ff832
            m.remove()
Packit 3ff832
        del self.__signal_matches[:]
Packit 3ff832
Packit 3ff832
    def destroy(self):
Packit 3ff832
        self.detach_signals()
Packit 3ff832
        super(InputContext, self).destroy()
Packit 3ff832
Packit 3ff832
    def get_engine(self):
Packit 3ff832
        try:
Packit 3ff832
            engine = self.__context.GetEngine()
Packit 3ff832
            engine = serializable.deserialize_object(engine)
Packit 3ff832
            return engine
Packit 3ff832
        except:
Packit 3ff832
            return None
Packit 3ff832
Packit 3ff832
    def set_engine(self, engine):
Packit 3ff832
        return self.__context.SetEngine(engine.name)
Packit 3ff832
Packit 3ff832
    def introspect(self):
Packit 3ff832
        return self.__context.Introspect()
Packit 3ff832
Packit 3ff832
Packit 3ff832
Packit 3ff832
def test():
Packit 3ff832
    import gtk
Packit 3ff832
    import gtk.gdk
Packit 3ff832
    from bus import Bus
Packit 3ff832
    import modifier
Packit 3ff832
    import text
Packit 3ff832
    import attribute
Packit 3ff832
    import property
Packit 3ff832
    import lookuptable
Packit 3ff832
    import factory
Packit 3ff832
Packit 3ff832
    class TestWindow(gtk.Window):
Packit 3ff832
        def __init__(self):
Packit 3ff832
            super(TestWindow,self).__init__()
Packit 3ff832
Packit 3ff832
            self.__bus = Bus()
Packit 3ff832
            print self.__bus.get_name()
Packit 3ff832
            self.__bus.connect("disconnected", gtk.main_quit)
Packit 3ff832
            context_path = self.__bus.create_input_context("Test")
Packit 3ff832
            print context_path
Packit 3ff832
            self.__context = InputContext(self.__bus, context_path)
Packit 3ff832
            self.__context.set_capabilities (9)
Packit 3ff832
Packit 3ff832
            self.__context.connect("commit-text", self.__commit_text_cb)
Packit 3ff832
            self.__context.connect("update-preedit-text", self.__update_preedit_text_cb)
Packit 3ff832
            self.__context.connect("show-preedit-text", self.__show_preedit_text_cb)
Packit 3ff832
            self.__context.connect("update-auxiliary-text", self.__update_auxiliary_text_cb)
Packit 3ff832
            self.__context.connect("update-lookup-table", self.__update_lookup_table_cb)
Packit 3ff832
Packit 3ff832
            self.set_events(gtk.gdk.KEY_PRESS_MASK | gtk.gdk.KEY_RELEASE_MASK | gtk.gdk.FOCUS_CHANGE_MASK)
Packit 3ff832
Packit 3ff832
            self.connect("key-press-event", self.__key_press_event_cb)
Packit 3ff832
            self.connect("key-release-event", self.__key_release_event_cb)
Packit 3ff832
            self.connect("delete-event", gtk.main_quit)
Packit 3ff832
            self.connect("focus-in-event", lambda *args: self.__context.focus_in())
Packit 3ff832
            self.connect("focus-out-event", lambda *args: self.__context.focus_out())
Packit 3ff832
Packit 3ff832
            self.show_all()
Packit 3ff832
Packit 3ff832
        def __commit_text_cb(self, context, text):
Packit 3ff832
            print "commit-text:", text.text
Packit 3ff832
Packit 3ff832
        def __update_preedit_text_cb(self, context, text, cursor_pos, visible):
Packit 3ff832
            print "preedit-text:", text.text, cursor_pos, visible
Packit 3ff832
Packit 3ff832
        def __show_preedit_text_cb(self, context):
Packit 3ff832
            print "show-preedit-text"
Packit 3ff832
Packit 3ff832
        def __hide_preedit_text_cb(self, context):
Packit 3ff832
            print "hide-preedit-text"
Packit 3ff832
Packit 3ff832
        def __update_auxiliary_text_cb(self, context, text, visible):
Packit 3ff832
            print "auxiliary-text:", text.text, visible
Packit 3ff832
Packit 3ff832
        def __update_lookup_table_cb(self, context, table, visible):
Packit 3ff832
            print "update-lookup-table:", visible
Packit 3ff832
Packit 3ff832
        def __key_press_event_cb(self, widget, event):
Packit 3ff832
            self.__context.process_key_event(event.keyval, event.state)
Packit 3ff832
Packit 3ff832
        def __key_release_event_cb(self, widget, event):
Packit 3ff832
            self.__context.process_key_event(event.keyval, event.state | modifier.RELEASE_MASK)
Packit 3ff832
Packit 3ff832
    w = TestWindow()
Packit 3ff832
    gtk.main()
Packit 3ff832
Packit 3ff832
if __name__ == "__main__":
Packit 3ff832
    test()