if panel == self._panel:
self._panel = DummyPanel ()
+ ##########################################################
+ # general methods
+ ##########################################################
+ def get_factories (self):
+ return self._factory_manager.get_factories ()
+
+ def get_factory_info (self, factory_path):
+ return self._factory_manager.get_factory_info (factory_path)
+
+ def set_factory (self, factory_path):
+ if self._focused_client == None:
+ return
+ factory = self._factory_manager.get_factory (factory_path)
+ engine = factory.create_engine ()
+ self._focused_client.set_engine (engine)
+
class IBusProxy (ibus.IIBus):
SUPPORTS_MULTIPLE_CONNECTIONS = True
def IsEnabled (self, dbusconn):
return self._ibus.is_enabled (dbusconn)
+ def GetFactories (self, dbusconn):
+ return self._ibus.get_factories ()
+
+ def GetFactoryInfo (self, factory_path, dbusconn):
+ return self._ibus.get_factory_info (factory_path)
+
+ def SetFactory (self, factory_path, dbusconn):
+ return self._ibus.set_factory (factory_path)
def register_factories (self, object_paths, ibusconn):
if ibusconn in self._factories:
raise ibus.IBusException ("this conn has registered factories!")
-
+
self._ibusconn_factory_dict[ibusconn] = []
for object_path in object_paths:
i = 0
return factories[i]
-
+
+ def get_factories (self):
+ return self._factories.keys ()
+
+ def get_factory_info (self, factory_path):
+ factory = self._factories[factory_path]
+ return factory.get_info ()
+
+ def get_factory (self, factory_path):
+ factory = self._factories[factory_path]
+ return factory
+
def _get_sorted_factories (self, resort = False):
if not self._sorted_factories or resort:
factories = self._factories.values ()
import gtk.gdk as gdk
import gobject
import ibus
+from lang import LANGUAGES
from ibus import interface
from languagebar import LanguageBarWindow
from candidatewindow import CandidateWindow
class Panel (ibus.Object):
- def __init__ (self, proxy):
+ def __init__ (self, proxy, _ibus):
gobject.GObject.__init__ (self)
self._proxy = proxy
+ self._ibus = _ibus
self._language_bar = LanguageBarWindow ()
self._language_bar.connect ("property-activate",
lambda widget, prop_name: self._proxy.PropertyActivate (prop_name))
+
self._candidate_panel = CandidateWindow ()
self._candidate_panel.connect ("cursor-up",
lambda widget: self._proxy.CursorUp ())
self._candidate_panel.connect ("cursor-down",
lambda widget: self._proxy.CursorDown ())
+ self._status_icon = gtk.StatusIcon ()
+ self._status_icon.connect ("popup-menu", self._status_icon_popup_menu_cb)
+ self._status_icon.connect ("activate", self._status_icon_activate_cb)
+ self._status_icon.set_from_icon_name ("engine-default")
+ self._status_icon.set_tooltip ("ibus - enabled")
+ self._status_icon.set_visible (True)
+
def set_cursor_location (self, x, y, w, h):
self._candidate_panel.move (x + w, y + h)
def do_destroy (self):
gtk.main_quit ()
+ def _popup_factory_menu (self, button, active_time):
+ menu = gtk.Menu ()
+ factories = self._ibus.GetFactories ()
+ if not factories:
+ item = gtk.MenuItem (label = "no im")
+ item.set_sensitive (False)
+ menu.add (item)
+ else:
+ for factory in factories:
+ name, lang, icon, authors, credits = self._ibus.GetFactoryInfo (factory)
+ item = gtk.ImageMenuItem ("%s - %s" % (LANGUAGES.get (lang, lang), name))
+ if not icon:
+ icon = "engine-default"
+ item.set_image (gtk.image_new_from_icon_name (icon, gtk.ICON_SIZE_MENU))
+ item.connect ("activate", self._menu_item_activate_cb, factory)
+ menu.add (item)
+
+ menu.show_all ()
+ menu.set_take_focus (False)
+ menu.popup (None, None, gtk.status_icon_position_menu, button, active_time, self._status_icon)
+
+ def _status_icon_activate_cb (self, status_icon):
+ self._popup_factory_menu (0, gtk.get_current_event_time ())
+ def _status_icon_popup_menu_cb (self, status_icon, button, active_time):
+ self._popup_factory_menu (button, active_time)
+
+
+ def _menu_item_activate_cb (self, item, factory):
+ gobject.idle_add (self._ibus.SetFactory, factory, priority = gobject.PRIORITY_LOW)
+
gobject.type_register (Panel, "IBusPanel")
class PanelProxy (interface.IPanel):
- def __init__ (self, dbusconn, object_path):
+ def __init__ (self, dbusconn, object_path, _ibus):
interface.IPanel.__init__ (self, dbusconn, object_path)
self._dbusconn = dbusconn
- self._panel = Panel (self)
+ self._panel = Panel (self, _ibus)
def SetCursorLocation (self, x, y, w, h):
self._panel.set_cursor_location (x, y, w, h)