Blame ibus/inputcontext.py

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