summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHuang Peng <shawn.p.huang@gmail.com>2008-05-29 11:08:46 +0800
committerHuang Peng <shawn.p.huang@gmail.com>2008-05-29 11:08:46 +0800
commitd92da3d2a855ca4927363401f53214d445ad6da3 (patch)
tree8123e876088e3cddcca80e68429e5763423ef37a
parent221a099a790009fc5930b287ec943f2b90af916a (diff)
downloadibus-d92da3d2a855ca4927363401f53214d445ad6da3.tar.gz
ibus-d92da3d2a855ca4927363401f53214d445ad6da3.tar.xz
ibus-d92da3d2a855ca4927363401f53214d445ad6da3.zip
WIP.
-rw-r--r--ibusdaemon/bus.py80
-rw-r--r--ibusdaemon/client.py106
-rw-r--r--ibusdaemon/engine.py12
-rw-r--r--ibusdaemon/enginefactory.py2
-rw-r--r--ibusdaemon/panel.py43
-rw-r--r--panel/candidatewindow.py3
6 files changed, 190 insertions, 56 deletions
diff --git a/ibusdaemon/bus.py b/ibusdaemon/bus.py
index 0db476a..c404b60 100644
--- a/ibusdaemon/bus.py
+++ b/ibusdaemon/bus.py
@@ -15,9 +15,10 @@ class IBus (ibus.Object):
self._client_manager = ClientManager ()
self._factory_manager = FactoryManager ()
self._panel = DummyPanel ()
-
+
self._focused_client = None
self._last_focused_client = None
+ self._client_handlers = []
self._last_key = None
@@ -44,14 +45,30 @@ class IBus (ibus.Object):
ibusconn = self._lookup_ibus_connection (dbusconn)
client = self._client_manager.register_client (name, ibusconn)
factory = self._factory_manager.get_default_factory ()
- client.set_engine_factory (factory)
+ engine = factory.create_engine ()
+ client.set_engine (engine)
def focus_in (self, dbusconn):
client = self._lookup_client (dbusconn)
-
+
if self._focused_client != client and self._focused_client != None:
+ for id in self._client_handlers:
+ client.disconnect (id)
+ del self._client_handlers[:]
self._focused_client.focus_out ()
-
+
+ # Install all callback functions
+ id = client.connect ("preedit-changed", self._preedit_changed_cb)
+ self._client_handlers.append (id)
+ id = client.connect ("aux-string-changed", self._aux_string_changed_cb)
+ self._client_handlers.append (id)
+ id = client.connect ("update-lookup-table", self._update_lookup_table_cb)
+ self._client_handlers.append (id)
+ id = client.connect ("show-lookup-table", self._show_lookup_table_cb)
+ self._client_handlers.append (id)
+ id = client.connect ("hide-lookup-table", self._hide_lookup_table_cb)
+ self._client_handlers.append (id)
+
self._focused_client = client
self._last_focused_client = client
client.focus_in ()
@@ -59,9 +76,12 @@ class IBus (ibus.Object):
def focus_out (self, dbusconn):
client = self._lookup_client (dbusconn)
if client == self._focused_client:
+ for id in self._client_handlers:
+ client.disconnect (id)
+ del self._client_handlers[:]
self._focused_client = None
client.focus_out ()
-
+
def reset (self, dbusconn):
client = self._lookup_client (dbusconn)
client.reset ()
@@ -79,19 +99,20 @@ class IBus (ibus.Object):
return
else:
client.process_key_event (keyval, is_press, state, reply_cb, error_cb)
-
+
def set_cursor_location (self, x, y, w, h, dbusconn):
client = self._lookup_client (dbusconn)
client.set_cursor_location (x, y, w, h)
-
+
def _filter_hotkeys (self, client, keyval, is_press, state):
if is_press and keyval == keysyms.space \
and state == keysyms.CONTROL_MASK:
enable = not client.is_enabled ()
client.set_enable (enable)
- if client.get_engine_factory () == None and enable:
- factory = self._factory_manager.get_default_factory()
- client.set_engine_factory (factory)
+ if client.get_engine () == None and enable:
+ factory = self._factory_manager.get_default_factory ()
+ engine = factory.create_engine ()
+ client.set_engine (engine)
return True
return False
@@ -102,6 +123,31 @@ class IBus (ibus.Object):
raise ibus.IBusException ("not register the client")
return self._clients[dbusconn]
+ def _preedit_changed_cb (self, client, text, attrs, cursor_pos):
+ assert self._focused_client == client
+
+ self._panel.set_preedit_string (text, attrs, cursor_pos)
+
+ def _aux_string_changed_cb (self, client, text, attrs):
+ assert self._focused_client == client
+
+ self._pabel.set_aux_string (text, attrs)
+
+ def _update_lookup_table_cb (self, client, lookup_table):
+ assert self._focused_client == client
+
+ self._pabel.update_lookup_table (lookup_table)
+
+ def _show_lookup_table_cb (self, client, lookup_table):
+ assert self._focused_client == client
+
+ self._pabel.show_candidate_window ()
+
+ def _hide_lookup_table_cb (self, client, lookup_table):
+ assert self._focused_client == client
+
+ self._pabel.hide_candidate_window ()
+
##########################################################
# methods for im engines
##########################################################
@@ -116,7 +162,7 @@ class IBus (ibus.Object):
def _lookup_engine (self, dbusconn, path):
ibusconn = self._lookup_ibus_connection (dbusconn)
return self._factory_manager.lookup_engine (ibusconn, path)
-
+
##########################################################
# methods for panel
@@ -141,7 +187,7 @@ class IBusProxy (ibus.IIBus):
def __init__ (self):
ibus.IIBus.__init__ (self)
self._ibus = IBus ()
-
+
def new_connection (self, dbusconn):
self._ibus.new_connection (dbusconn)
@@ -156,16 +202,16 @@ class IBusProxy (ibus.IIBus):
def RegisterClient (self, client_name, dbusconn):
self._ibus.register_client (client_name, dbusconn)
-
+
def RegisterFactories (self, object_paths, dbusconn):
self._ibus.register_factories (object_paths, dbusconn)
def UnregisterEngines (self, object_paths, dbusconn):
self._ibus.unregister_engines (object_paths, dbusconn)
-
+
def RegisterPanel (self, object_path, replace, dbusconn):
self._ibus.register_panel (object_path, replace, dbusconn)
-
+
def ProcessKeyEvent (self, keyval, is_press, state, \
dbusconn, reply_cb, error_cb):
try:
@@ -176,7 +222,7 @@ class IBusProxy (ibus.IIBus):
def SetCursorLocation (self, x, y, w, h, dbusconn):
self._ibus.set_cursor_location (x, y, w, h, dbusconn)
-
+
def FocusIn (self, dbusconn):
self._ibus.focus_in (dbusconn)
@@ -188,4 +234,4 @@ class IBusProxy (ibus.IIBus):
def IsEnabled (self, dbusconn):
return self._ibus.is_enabled (dbusconn)
-
+
diff --git a/ibusdaemon/client.py b/ibusdaemon/client.py
index 160d973..297957a 100644
--- a/ibusdaemon/client.py
+++ b/ibusdaemon/client.py
@@ -1,18 +1,62 @@
+import gobject
import ibus
class Client (ibus.Object):
+ __gsignals__ = {
+ "preedit-changed" : (
+ gobject.SIGNAL_RUN_FIRST,
+ gobject.TYPE_NONE,
+ (gobject.TYPE_STRING, gobject.TYPE_PYOBJECT, gobject.TYPE_UINT)),
+ "aux-string-changed" : (
+ gobject.SIGNAL_RUN_FIRST,
+ gobject.TYPE_NONE,
+ (gobject.TYPE_STRING, gobject.TYPE_PYOBJECT)),
+ "update-lookup-table" : (
+ gobject.SIGNAL_RUN_FIRST,
+ gobject.TYPE_NONE,
+ (gobject.TYPE_PYOBJECT, )),
+ "show-lookup-table" : (
+ gobject.SIGNAL_RUN_FIRST,
+ gobject.TYPE_NONE,
+ ()),
+ "hide-lookup-table" : (
+ gobject.SIGNAL_RUN_FIRST,
+ gobject.TYPE_NONE,
+ ())
+ }
+
def __init__ (self, name, ibusconn):
ibus.Object.__init__ (self)
-
+
self._ibusconn = ibusconn
self._ibusconn.connect ("destroy", self._ibusconn_destroy_cb)
-
+
# init default values
self._enable = False
- self._factory = None
self._engine = None
self._engine_handler_ids = []
+ # client state
+ self._aux_string = None
+ self._aux_attrs = None
+
+ self._use_preedit = True
+ self._preedit_string = None
+ self._preedit_attrs = None
+ self._cursor_pos = 0
+
+ self._lookup_table = None
+ self._show_lookup_table = False
+
+ def get_preedit_string (self):
+ return self._preedit_string, self._preedit_attrs, self._cursor_pos
+
+ def get_use_preedit (self):
+ return self._use_preedit
+
+ def get_aux_string (self):
+ return self._aux_string, self._aux_attrs
+
def process_key_event (self, keyval, is_press, state,
reply_cb, error_cb):
if self._engine != None and self._enable:
@@ -53,35 +97,34 @@ class Client (ibus.Object):
def commit_string (self, text):
self._ibusconn.emit_dbus_signal ("CommitString", text)
- def preedit_changed (self, text, attrs, cursor):
- self._ibusconn.emit_dbus_signal ("PreeditChanged", text, attrs.get_array (), cursor)
+ def preedit_changed (self, text, attrs, cursor_pos):
+ if self._use_preedit:
+ self._ibusconn.emit_dbus_signal ("PreeditChanged", text, attrs, cursor_pos)
+ else:
+ # show preedit on panel
+ self.emit ("preedit-changed", text, attrs, cursor_pos)
- def set_engine_factory (self, factory):
- if self._factory == factory:
+ def set_engine (self, engine):
+ if self._engine == engine:
return
-
+
if self._engine != None:
self._remove_engine_handlers ()
self._engine.destroy ()
self._engine = None
- self._factory = factory
+ self._engine = engine
+ self._install_engine_handlers ()
- if self._factory:
- self._engine = self._factory.create_engine ()
- self._install_engine_handlers ()
-
- def get_engine_factory (self):
- return self._factory
+ def get_engine (self):
+ return self._engine
def _engine_destroy_cb (self, engine):
if self._engine == engine:
self._remove_engine_handlers ()
self._engine = None
- self._factory = None
def _ibusconn_destroy_cb (self, ibusconn):
- self._factory = None
if self._engine != None:
self._remove_engine_handlers ()
self._engine.destroy ()
@@ -90,20 +133,25 @@ class Client (ibus.Object):
def _commit_string_cb (self, engine, text):
self.commit_string (text)
- def _preedit_changed_cb (self, engine, text, attrs, cursor):
- self.preedit_changed (self, text, attrs, cursor)
+ def _preedit_changed_cb (self, engine, text, attrs, cursor_pos):
+ self.preedit_changed (self, text, attrs, cursor_pos)
def _aux_string_changed_cb (self, engine, text, attrs):
- pass
+ self._aux_string = text
+ self._aux_attrs = attrs
+ self.emit ("aux-string-changed", text, attrs)
+
+ def _update_lookup_table_cb (self, engine, lookup_table):
+ self._lookup_table = lookup_table
+ self.emit ("update-lookup-table", lookup_table)
- def _update_lookup_table (self, engine, lookup_table):
- pass
-
- def _show_lookup_table (self, engine):
- pass
-
- def _hide_lookup_table (self, engine):
- pass
+ def _show_lookup_table_cb (self, engine):
+ self._show_lookup_table = True
+ self.emit ("show-lookup-table")
+
+ def _hide_lookup_table_cb (self, engine):
+ self._show_lookup_table = False
+ self.emit ("hide-lookup-table")
def _remove_engine_handlers (self):
assert self._engine != None
@@ -126,4 +174,4 @@ class Client (ibus.Object):
self._engine_handler_ids.append (id)
id = self._engine.connect ("hide-lookup-table", self._hide_lookup_table_cb)
self._engine_handler_ids.append (id)
-
+gobject.type_register (Client)
diff --git a/ibusdaemon/engine.py b/ibusdaemon/engine.py
index df488b0..13a1bc1 100644
--- a/ibusdaemon/engine.py
+++ b/ibusdaemon/engine.py
@@ -11,7 +11,7 @@ class Engine (ibus.Object):
"forward-key-event" : (
gobject.SIGNAL_RUN_FIRST,
gobject.TYPE_NONE,
- (gobject.TYPE_UINT, gobject.TYPE_UINT, gobject.TYPE_UINT )),
+ (gobject.TYPE_UINT, gobject.TYPE_BOOLEAN, gobject.TYPE_UINT )),
"preedit-changed" : (
gobject.SIGNAL_RUN_FIRST,
gobject.TYPE_NONE,
@@ -34,14 +34,18 @@ class Engine (ibus.Object):
())
}
- def __init__ (self, ibusconn, object_path):
+ def __init__ (self, factory, ibusconn, object_path):
ibus.Object.__init__ (self)
+ self._factory = factory
self._ibusconn = ibusconn
self._object_path = object_path
self._engine = ibusconn.get_object (self._object_path)
self._lookup_table = ibus.LookupTable ()
self._ibusconn.connect ("destroy", self._ibusconn_destroy_cb)
+ def get_factory (self):
+ return self._factory
+
def handle_dbus_signal (self, message):
if message.is_signal (ibus.IBUS_ENGINE_IFACE, "CommitString"):
args = message.get_args_list ()
@@ -49,14 +53,12 @@ class Engine (ibus.Object):
return True
elif message.is_signal (ibus.IBUS_ENGINE_IFACE, "ForwardKeyEvent"):
args = message.get_args_list ()
- self.emit ("forward-key-event", args[0], arg[1], arg[2])
+ self.emit ("forward-key-event", args[0], bool (arg[1]), arg[2])
return True
elif message.is_signal (ibus.IBUS_ENGINE_IFACE, "PreeditChanged"):
- attrs = ibus.attr_list_from_dbus_value (args[1])
self.emit ("preedit-changed", args[0], args[1], args[2])
return True
elif message.is_signal (ibus.IBUS_ENGINE_IFACE, "AuxStringChanged"):
- attrs = ibus.attr_list_from_dbus_value (args[1])
self.emit ("aux-string-changed", args[0], args[1])
return True
elif message.is_signal (ibus.IBUS_ENGINE_IFACE, "UpdateLookupTable"):
diff --git a/ibusdaemon/enginefactory.py b/ibusdaemon/enginefactory.py
index 4ae0c95..30ec711 100644
--- a/ibusdaemon/enginefactory.py
+++ b/ibusdaemon/enginefactory.py
@@ -27,7 +27,7 @@ class EngineFactory (ibus.Object):
def create_engine (self):
object_path = self._factory.CreateEngine ()
- engine = Engine (self._ibusconn, object_path)
+ engine = Engine (self, self._ibusconn, object_path)
self._engines[object_path] = engine
return engine
diff --git a/ibusdaemon/panel.py b/ibusdaemon/panel.py
index f7182da..83b85e2 100644
--- a/ibusdaemon/panel.py
+++ b/ibusdaemon/panel.py
@@ -1,6 +1,7 @@
import weakref
import gobject
import ibus
+from ibus import interface
class Panel (ibus.Object):
def __init__ (self, ibusconn, object_path):
@@ -8,13 +9,42 @@ class Panel (ibus.Object):
self._ibusconn = ibusconn
self._object_path = object_path
self._panel = self._ibusconn.get_object (self._object_path)
- self._lookup_table = ibus.LookupTable ()
self._ibusconn.connect ("destroy", self._ibusconn_destroy_cb)
self._ibusconn.connect ("dbus-signal", self._dbus_signal_cb)
+ def set_preedit_string (self, text, attrs, cursor_pos):
+ self._panel.SetPreeditString (text, attrs, cursor_pos)
+
+ def show_preedit_string (self):
+ self._panel.ShowPreeditString ()
+
+ def hide_preedit_string (self):
+ slef._panel.HidePreeditString ()
+
+ def set_aux_string (self, text, attrs):
+ self._panel.SetAuxString (text, attrs)
+
+ def show_aux_string (self):
+ self._panel.ShowAuxString ()
+
+ def hide_aux_string (self):
+ slef._panel.HideAuxString ()
+
def update_lookup_table (self, lookup_table):
- self._lookup_table = lookup_table
+ self._panel.UpdateLookupTable (lookup_table)
+
+ def show_candidate_window (self):
+ self._panel.ShowCandidateWindow ()
+
+ def hide_candidate_window (self):
+ self._panel.HideCandidateWindow ()
+
+ def show_language_bar (self):
+ self._panel.ShowLanguageBar ()
+
+ def hide_language_bar (self):
+ self._panel.HideLanguageBar ()
def destroy (self):
if self._ibusconn != None:
@@ -30,7 +60,14 @@ class Panel (ibus.Object):
self.destroy ()
def _dbus_signal_cb (self, ibusconn, message):
- pass
+ if message.is_signal (interface.IBUS_PANEL_IFACE, "PageUp"):
+ pass
+ elif message.is_signal (interface.IBUS_PANEL_IFACE, "PageDown"):
+ pass
+ elif message.is_signal (interface.IBUS_PANEL_IFACE, "CursorBack"):
+ pass
+ elif message.is_signal (interface.IBUS_PANEL_IFACE, "CursorForward"):
+ pass
# methods for cmp
# def __lt__ (self, other):
diff --git a/panel/candidatewindow.py b/panel/candidatewindow.py
index 63a1d63..6642406 100644
--- a/panel/candidatewindow.py
+++ b/panel/candidatewindow.py
@@ -75,7 +75,8 @@ class CandidateWindow (gtk.Window):
gobject.type_register (CandidateWindow, "IBusCandidateWindow")
if __name__ == "__main__":
- # gtk.rc_parse ("./themes/default/gtkrc")
+ # style_string = """"""
+ # gtk.rc_parse_string (style_string)
window = CandidateWindow ()
window.show_all ()
gtk.main ()