123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418 |
- #! /usr/bin/env python
- # vim:set et sts=4 sw=4:
- #
- # ibus-panel-dbus - Another panel for ibus
- #
- # Copyright (c) 2009 Wang Hoi <zealot.hoi@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
- #IBUS_SERVICE_KIMPANEL = "org.freedesktop.IBus.Panel.KIM"
- #IBUS_PATH_KIMPANEL = "/org/freedesktop/IBus/Panel/KIM"
- from ibus import *
- from ibus.panel import *
- from ibus.bus import Bus
- from ibus.inputcontext import InputContext
- from ibus import keysyms
- #import ibus.interface
- import gtk
- import dbus
- IBUS_ICON_DIR = '/usr/share/ibus/icons/'
- from gettext import dgettext
- _ = lambda a : dgettext("ibus", a)
- N_ = lambda a : a
- def prop2string(prop):
- __prop_key = '/IBus/'+prop.get_key()
- __prop_label = prop.get_label().get_text()
- __prop_icon = prop.get_icon()
- __prop_tip = prop.get_tooltip().get_text()
- # workaround
- if len(__prop_icon)==0:
- # the setup icon
- if (prop.get_key()=='setup'):
- __prop_icon = 'configure'
- __prop = __prop_key + ':' + __prop_label + ':' + __prop_icon + ':' + __prop_tip
- return __prop
- class KIMIbusClient(dbus.service.Object):
- def __init__(self, object_path):
- dbus.service.Object.__init__(self, dbus.SessionBus(), object_path)
- @dbus.service.signal(dbus_interface='org.ibus.panel',
- signature='s')
- def ExecDialog(self, prop):
- pass
- @dbus.service.signal(dbus_interface='org.ibus.panel',
- signature='as')
- def ExecMenu(self, props):
- pass
- @dbus.service.signal(dbus_interface='org.ibus.panel',
- signature='as')
- def RegisterProperties(self, props):
- pass
- @dbus.service.signal(dbus_interface='org.ibus.panel',
- signature='s')
- def UpdateProperty(self, prop):
- pass
- @dbus.service.signal(dbus_interface='org.ibus.panel',
- signature='s')
- def RemoveProperty(self, prop):
- pass
- @dbus.service.signal(dbus_interface='org.ibus.panel',
- signature='b')
- def Enable(self, b):
- pass
- @dbus.service.signal(dbus_interface='org.ibus.panel',
- signature='b')
- def ShowAux(self, b):
- pass
- @dbus.service.signal(dbus_interface='org.ibus.panel',
- signature='b')
- def ShowPreedit(self, b):
- pass
- @dbus.service.signal(dbus_interface='org.ibus.panel',
- signature='b')
- def ShowLookupTable(self, b):
- pass
- @dbus.service.signal(dbus_interface='org.ibus.panel',
- signature='asasasbb')
- def UpdateLookupTable(self, labels,items,xs,bool1,bool2):
- pass
- @dbus.service.signal(dbus_interface='org.ibus.panel',
- signature='i')
- def UpdatePreeditCaret(self, pos):
- pass
- @dbus.service.signal(dbus_interface='org.ibus.panel',
- signature='ss')
- def UpdatePreeditText(self, test, attr):
- pass
- @dbus.service.signal(dbus_interface='org.ibus.panel',
- signature='ss')
- def UpdateAux(self, test, attr):
- pass
- @dbus.service.signal(dbus_interface='org.ibus.panel',
- signature='ii')
- def UpdateSpotLocation(self, x, y):
- pass
- @dbus.service.signal(dbus_interface='org.ibus.panel',
- signature='i')
- def UpdateScreen(self, id):
- pass
- class KIMPanel(PanelBase):
- def __init__(self):
- self.__bus = Bus()
- self.__bus.connect("disconnected", gtk.main_quit)
- super(KIMPanel, self).__init__(self.__bus)
- self.__bus.request_name(IBUS_SERVICE_PANEL, 0)
- self.__session_bus = dbus.SessionBus()
- #self.__kimproxy = self.__session_bus.get_object('org.kde.impanel',
- # '/org/kde/impanel')
- #self.__kimifce = dbus.Interface(self.__kimproxy,
- # 'org.kde.impanel')
- self.__session_bus.add_signal_receiver(self.kim_trigger_property,
- signal_name='TriggerProperty',
- dbus_interface='org.kde.impanel')
- self.__session_bus.add_signal_receiver(self.kim_panel_created,
- signal_name='PanelCreated',
- dbus_interface='org.kde.impanel')
- self.__session_bus.add_signal_receiver(self.kim_reload_config,
- signal_name='ReloadConfig',
- dbus_interface='org.kde.impanel')
- self.__session_bus.add_signal_receiver(gtk.main_quit,
- signal_name='Exit',
- dbus_interface='org.kde.impanel')
- self.__session_bus.add_signal_receiver(self.page_up,
- signal_name='LookupTablePageUp',
- dbus_interface='org.kde.impanel')
- self.__session_bus.add_signal_receiver(self.page_down,
- signal_name='LookupTablePageDown',
- dbus_interface='org.kde.impanel')
- self.__session_bus.add_signal_receiver(self.kim_select_candidate,
- signal_name='SelectCandidate',
- dbus_interface='org.kde.impanel')
- self.__kimclient = KIMIbusClient('/org/ibus/panel')
- self.__focus_ic = None
- self.__logo_prop = Property(key='Logo', label='IBus', icon=IBUS_ICON_DIR + '/ibus.svg', tooltip='IBus input method')
- self.__about_prop = Property(key='About', label=_('IBus intelligent input bus'), icon='help-about')
- self.__about_prop.set_tooltip(_("IBus is an intelligent input bus for Linux/Unix.\n\nHuang Peng <shawn.p.huang@gmail.com>"))
- self.__prop_map = {}
- self.__im_menu = []
- def focus_in(self,ic):
- self.__focus_ic = InputContext(self.__bus, ic)
- enabled = self.__focus_ic.is_enabled()
- if not enabled:
- self.__logo_prop.icon = IBUS_ICON_DIR + '/ibus.svg'
- else:
- engine = self.__focus_ic.get_engine()
- if engine:
- self.__logo_prop.icon = engine.icon
- else:
- self.__logo_prop.icon = IBUS_ICON_DIR + '/ibus.svg'
- self.__kimclient.UpdateProperty(prop2string(self.__logo_prop))
- def state_changed(self):
- print 'state_changed'
- if not self.__focus_ic:
- return
- enabled = self.__focus_ic.is_enabled()
- if enabled == False:
- self.__reset()
- self.__logo_prop.set_icon(IBUS_ICON_DIR + 'ibus.svg')
- else:
- engine = self.__focus_ic.get_engine()
- if engine:
- self.__logo_prop.set_icon(engine.icon)
- else:
- self.__logo_prop.set_icon(IBUS_ICON_DIR + 'ibus.svg')
- self.__kimclient.UpdateProperty(prop2string(self.__logo_prop))
- def focus_out(self,ic):
- #self.__focus_ic = None
- self.__logo_prop.icon = IBUS_ICON_DIR + '/ibus.svg'
- self.__kimclient.UpdateProperty(prop2string(self.__logo_prop))
- def set_cursor_location(self, x, y, w, h):
- #print 'set_cursor_location',x,y,w,h
- self.__kimclient.UpdateSpotLocation(x+w,y+h)
- def update_preedit_text(self, text, cursor_pos, visible):
- print 'update_preedit_text',cursor_pos,visible
- self.__kimclient.UpdatePreeditText(text.get_text(),'')
- self.__kimclient.UpdatePreeditCaret(cursor_pos)
- if visible:
- self.show_preedit_text()
- else:
- self.hide_preedit_text()
- def show_preedit_text(self):
- print 'show_preedit_text'
- self.__kimclient.ShowPreedit(1)
- def hide_preedit_text(self):
- print 'hide_preedit_text'
- self.__kimclient.ShowPreedit(0)
- def update_auxiliary_text(self, text, visible):
- #print 'update_auxiliary_text',visible
- self.__kimclient.UpdateAux(text.get_text(),'')
- if visible:
- self.show_auxiliary_text()
- else:
- self.hide_auxiliary_text()
- def show_auxiliary_text(self):
- print 'show_auxiliary_text'
- self.__kimclient.ShowAux(1)
- def hide_auxiliary_text(self):
- print 'hide_auxiliary_text'
- self.__kimclient.ShowAux(0)
- def update_lookup_table(self, lookup_table, visible):
- if lookup_table == None:
- lookup_table = LookupTable()
- self.__lookup_table = lookup_table
- self.__labels = []
- self.__candis = []
- self.__attrs = []
- i = 0
- for text_obj in lookup_table.get_candidates_in_current_page():
- i=i+1
- if i==10:
- i=0
- self.__labels.append(str(i))
- self.__candis.append(text_obj.get_text())
- self.__attrs.append('')
-
- self.__kimclient.UpdateLookupTable(self.__labels,
- self.__candis,self.__attrs,dbus.Boolean(1),dbus.Boolean(lookup_table.get_current_page_size() <= lookup_table.get_page_size()))
- if visible:
- self.show_lookup_table()
- else:
- self.hide_lookup_table()
- def show_lookup_table(self):
- print 'show_lookup_table'
- self.__kimclient.ShowLookupTable(1)
- def hide_lookup_table(self):
- print 'hide_lookup_table'
- self.__kimclient.ShowLookupTable(0)
- def cursor_up_lookup_table(self):
- print 'cursor_up_lookup_table'
- def cursor_down_lookup_table(self):
- print 'cursor_down_lookup_table'
- def show_candidate_window(self):
- print 'show_candidate_window'
- def hide_candidate_window(self):
- print 'hide_candidate_window'
- def show_language_bar(self):
- print 'show_language_bar'
- def hide_language_bar(self):
- print 'hide_language_bar'
- def register_properties(self, props):
- print 'register_properties'
- __props = []
- __props.append(prop2string(self.__logo_prop))
- for prop in props.get_properties():
- __props.append(prop2string(prop))
- __prop_key = '/IBus/'+prop.get_key()
- #self.__prop
- __props.append(prop2string(self.__about_prop))
- self.__kimclient.RegisterProperties(__props)
- def update_property(self, prop):
- print 'update_property'
- self.__kimclient.UpdateProperty(prop2string(prop))
- def get_status_icon(self):
- print 'get_status_icon'
- # begin of signal handler
-
- def kim_panel_created(self):
- print 'KIM: panel created'
- def kim_reload_config(self):
- print 'KIM: reload config'
- def kim_trigger_property(self,prop):
- print 'KIM: trigger property'
- if prop.startswith('/IBus/'):
- __prop_key = prop[6:]
- if __prop_key == 'Logo':
- self.__im_menu = self.__create_im_menu()
- self.__kimclient.ExecMenu(map(prop2string,self.__im_menu))
- elif __prop_key == 'About':
- self.__kimclient.ExecDialog(prop2string(self.__about_prop))
- elif __prop_key.startswith('Engine/'):
- self.__reset()
- __prop_key = __prop_key[7:]
- if __prop_key == 'None':
- self.__focus_ic.disable()
- else:
- engines = self.__bus.list_active_engines()
- for engine in engines:
- print engine.name
- if engine.name == __prop_key:
- print 'matched engine'
- self.__focus_ic.set_engine(engine)
- else:
- self.property_activate(__prop_key,PROP_STATE_CHECKED)
- def kim_select_candidate(self,index):
- print 'select_candidate:Implement me!'
- # dirty hack
- #if self.__focus_ic:
- # #engine = self.__focus_ic.get_engine()
- # #if engine:
- # # print 'select_candidate',index
- # self.__focus_ic.process_key_event(keysyms._1,0)
- pass
- def __reset(self):
- self.hide_auxiliary_text()
- self.hide_preedit_text()
- self.hide_lookup_table()
- def __create_im_menu(self):
- engines = self.__bus.list_active_engines()
- tmp = {}
- for engine in engines:
- lang = get_language_name(engine.language)
- if lang not in tmp:
- tmp[lang] = []
- tmp[lang].append(engine)
- langs = tmp.keys()
- other = tmp.get(_("Other"), [])
- if _("Other") in tmp:
- langs.remove(_("Other"))
- langs.append(_("Other"))
- im_menu = []
- for lang in langs:
- if len(tmp[lang]) == 1:
- engine = tmp[lang][0]
- item = Property(key='Engine/'+engine.name)
- item.set_label("%s - %s" % (lang, engine.longname))
- if engine.icon:
- item.set_icon(engine.icon)
- else:
- item.set_icon("engine-default")
- print prop2string(item)
- im_menu.append(item)
- else:
- pass
- item = Property(key='Engine/None',label=_('Disable'),icon=IBUS_ICON_DIR+'/ibus.svg')
- im_menu.append(item)
- return im_menu
- def launch_panel():
- panel = KIMPanel()
- gtk.main()
- if __name__ == "__main__":
- launch_panel()
|