Permalink
Browse files

Enable ibus-setup to show the frequently used languages only in IME l…

…ist.
  • Loading branch information...
1 parent f07be51 commit dffb43ea267713e9ffff52bb3b19c11630df8d19 @fujiwarat committed Jan 31, 2013
Showing with 300 additions and 24 deletions.
  1. +168 −0 data/ibus-xkb.schemas.in
  2. +131 −24 setup/enginecombobox.py
  3. +1 −0 setup/main.py
View
168 data/ibus-xkb.schemas.in
@@ -88,5 +88,173 @@ se,si,sk,sy,sy(ku),th,tj,tr,ua,uz,vn
The list is used by ibus-gjs.</long>
</locale>
</schema>
+ <schema>
+ <key>/schemas/desktop/ibus/general/xkblayoutconfig/group_list</key>
+ <applyto>/desktop/ibus/general/xkblayoutconfig/group_list</applyto>
+ <owner>ibus</owner>
+ <type>list</type>
+ <list_type>string</list_type>
+ <default>[west_europe,south_europe,east_europe,north_europe,west_asia,center_asia,east_asia,india,australia]</default>
+ <locale name="C">
+ <short>List of system keyboard layout groups on ibus-setup</short>
+ <long>The group list is used not to show all the system
+ keyboard layouts by default. The list item will be
+ appended at the end of gconf key. e.g.
+ .../xkblayoutconfig/item1</long>
+ </locale>
+ </schema>
+ <schema>
+ <key>/schemas/desktop/ibus/general/xkblayoutconfig/west_europe</key>
+ <applyto>/desktop/ibus/general/xkblayoutconfig/west_europe</applyto>
+ <owner>ibus</owner>
+ <type>list</type>
+ <list_type>string</list_type>
+ <!--
+ <default>[ad,be,br,de,ca,ch,cz,es,fr,gn,hu,ie,ie(CloGaelach),it,latam,nl,pt,si,sk]</default>
+ -->
+ <default>[ca,cs,de,en,es,fr,gd,hu,it,nl,pt,sk,sl]</default>
+ <locale name="C">
+ <short>List of European languages on ibus-setup</short>
+ <long>ibus-setup shows the languages only in input method list
+ when you run ibus-setup on one of the languages.
+ Other languages are hidden under an extended button.</long>
+ </locale>
+ </schema>
+ <schema>
+ <key>/schemas/desktop/ibus/general/xkblayoutconfig/south_europe</key>
+ <applyto>/desktop/ibus/general/xkblayoutconfig/south_europe</applyto>
+ <owner>ibus</owner>
+ <type>list</type>
+ <list_type>string</list_type>
+ <!--
+ <default>[al,ba,bg,gr,me,mk,mt,ro,rs]</default>
+ -->
+ <default>[bg,bs,el,mk,mt,ro,sq,sr]</default>
+ <locale name="C">
+ <short>List of European languages on ibus-setup</short>
+ <long>ibus-setup shows the languages only in input method list
+ when you run ibus-setup on one of the languages.
+ Other languages are hidden under an extended button.</long>
+ </locale>
+ </schema>
+ <schema>
+ <key>/schemas/desktop/ibus/general/xkblayoutconfig/east_europe</key>
+ <applyto>/desktop/ibus/general/xkblayoutconfig/east_europe</applyto>
+ <owner>ibus</owner>
+ <type>list</type>
+ <list_type>string</list_type>
+ <!--
+ <default>[by,ee,epo,ge,ge(dsb),ge(ru),ge(os),hr,kg,kz,lt,lv,pl,pl(csb),ru,ru(cv),ru(kom),ru(sah),ru(tt),ru(xal),ua,uz]</default>
+ -->
+ <default>[be,csb,cv,et,ka,kk,ky,lt,lv,pl,ru,tt,uk,uz]</default>
+ <locale name="C">
+ <short>List of European languages on ibus-setup</short>
+ <long>ibus-setup shows the languages only in input method list
+ when you run ibus-setup on one of the languages.
+ Other languages are hidden under an extended button.</long>
+ </locale>
+ </schema>
+ <schema>
+ <key>/schemas/desktop/ibus/general/xkblayoutconfig/north_europe</key>
+ <applyto>/desktop/ibus/general/xkblayoutconfig/north_europe</applyto>
+ <owner>ibus</owner>
+ <type>list</type>
+ <list_type>string</list_type>
+ <!--
+ <default>[dk,fi,fo,is,no,no(smi),se]</default>
+ -->
+ <default>[da,fi,fo,is,no,se,sv]</default>
+ <locale name="C">
+ <short>List of European languages on ibus-setup</short>
+ <long>ibus-setup shows the languages only in input method list
+ when you run ibus-setup on one of the languages.
+ Other languages are hidden under an extended button.</long>
+ </locale>
+ </schema>
+ <schema>
+ <key>/schemas/desktop/ibus/general/xkblayoutconfig/west_asia</key>
+ <applyto>/desktop/ibus/general/xkblayoutconfig/west_asia</applyto>
+ <owner>ibus</owner>
+ <type>list</type>
+ <list_type>string</list_type>
+ <!--
+ <default>[am,ara,az,et,gh,gh(akan),gh(ewe),gh(fula),gh(ga),gh(hausa),il,iq,iq(ku),ir,ir(ku),ma,ma(tifinagh),ng,ng(hausa),ng,ng(igbo),ng(yoruba),sy,sy(ku),tj,tr]</default>
+ -->
+ <default>[am,ar,az,ber,fa,ha,he,hy,ig,ku,tg,tr,yo]</default>
+ <locale name="C">
+ <short>List of Asian languages on ibus-setup</short>
+ <long>ibus-setup shows the languages only in input method list
+ when you run ibus-setup on one of the languages.
+ Other languages are hidden under an extended button.</long>
+ </locale>
+ </schema>
+ <schema>
+ <key>/schemas/desktop/ibus/general/xkblayoutconfig/center_asia</key>
+ <applyto>/desktop/ibus/general/xkblayoutconfig/center_asia</applyto>
+ <owner>ibus</owner>
+ <type>list</type>
+ <list_type>string</list_type>
+ <!--
+ <default>[cn(tib)]</default>
+ -->
+ <default>[bo,zh]</default>
+ <locale name="C">
+ <short>List of Asian languages on ibus-setup</short>
+ <long>ibus-setup shows the languages only in input method list
+ when you run ibus-setup on one of the languages.
+ Other languages are hidden under an extended button.</long>
+ </locale>
+ </schema>
+ <schema>
+ <key>/schemas/desktop/ibus/general/xkblayoutconfig/east_asia</key>
+ <applyto>/desktop/ibus/general/xkblayoutconfig/east_asia</applyto>
+ <owner>ibus</owner>
+ <type>list</type>
+ <list_type>string</list_type>
+ <!--
+ <default>[bt,kh,la,mal,mm,th,vn]</default>
+ -->
+ <default>[dz,km,lo,my,th,vi]</default>
+ <locale name="C">
+ <short>List of Asian languages on ibus-setup</short>
+ <long>ibus-setup shows the languages only in input method list
+ when you run ibus-setup on one of the languages.
+ Other languages are hidden under an extended button.</long>
+ </locale>
+ </schema>
+ <schema>
+ <key>/schemas/desktop/ibus/general/xkblayoutconfig/india</key>
+ <applyto>/desktop/ibus/general/xkblayoutconfig/india</applyto>
+ <owner>ibus</owner>
+ <type>list</type>
+ <list_type>string</list_type>
+ <!--
+ <default>[bd,in,in(ben),in(guj),in(guru),in(jhelum),in(kan),in(mal),in(ori),in(tam),in(tel),in(urd-phonetic),in(bolnagri),lk,lk(tam_unicode),mv,np,pk]</default>
+ -->
+ <default>[bn,dv,gu,hi,kn,ml,ne,or,pa,si,ta,te,ur]</default>
+ <locale name="C">
+ <short>List of Asian languages on ibus-setup</short>
+ <long>ibus-setup shows the languages only in input method list
+ when you run ibus-setup on one of the languages.
+ Other languages are hidden under an extended button.</long>
+ </locale>
+ </schema>
+ <schema>
+ <key>/schemas/desktop/ibus/general/xkblayoutconfig/australia</key>
+ <applyto>/desktop/ibus/general/xkblayoutconfig/australia</applyto>
+ <owner>ibus</owner>
+ <type>list</type>
+ <list_type>string</list_type>
+ <!--
+ <default>[mao]</default>
+ -->
+ <default>[mi]</default>
+ <locale name="C">
+ <short>List of Asian languages on ibus-setup</short>
+ <long>ibus-setup shows the languages only in input method list
+ when you run ibus-setup on one of the languages.
+ Other languages are hidden under an extended button.</long>
+ </locale>
+ </schema>
</schemalist>
</gconfschemafile>
View
155 setup/enginecombobox.py
@@ -46,6 +46,9 @@ def __init__(self):
self.connect("notify::active", self.__notify_active_cb)
self.__model = None
+ self.__all_model = None
+ self.__config = None
+ self.__show_sub_lang = False
renderer = Gtk.CellRendererPixbuf()
renderer.set_property("xalign", 0)
@@ -59,20 +62,51 @@ def __init__(self):
self.pack_start(renderer, True)
self.set_cell_data_func(renderer, self.__name_cell_data_cb, None)
- def set_engines(self, engines):
- self.__model = Gtk.TreeStore(object)
+ def __gconf_get_lang_list_from_locale(self):
+ common_list = ['en', 'Other']
+ if self.__config == None:
+ return None
+ loc = None
+ try:
+ loc = locale.setlocale (locale.LC_ALL)
+ except:
+ pass
+ if loc == None:
+ return common_list
+ current_lang = IBus.get_language_name(loc)
+ if current_lang == None:
+ return common_list
+ group_list = self.__config.get_value("general/xkblayoutconfig",
+ "group_list")
+ if group_list == None:
+ return [loc] + common_list
+ group_list = list(group_list)
+ lang_list = None
+ for group in group_list:
+ group = str(group)
+ langs = list(self.__config.get_value("general/xkblayoutconfig",
+ group))
+ for lang in langs:
+ lang = str(lang)
+ if current_lang == IBus.get_language_name(lang):
+ lang_list = langs
+ break
+ if lang_list != None:
+ break
+ if lang_list == None:
+ return [loc] + common_list
+ return lang_list + common_list
- iter1 = self.__model.append(None)
- self.__model.set(iter1, 0, 0)
- langs = {}
- for e in engines:
- l = IBus.get_language_name(e.get_language())
- if l == None:
- l = ""
- if l not in langs:
- langs[l] = []
- langs[l].append(e)
+ def __has_engine_in_lang_list(self, engine, lang_list):
+ retval = False
+ for lang in lang_list:
+ if IBus.get_language_name(lang) == \
+ IBus.get_language_name(engine.props.language):
+ retval = True
+ break
+ return retval
+ def __model_append_langs(self, model, langs, visible):
keys = langs.keys()
keys.sort(locale.strcoll)
loc = locale.getlocale()[0]
@@ -90,46 +124,111 @@ def set_engines(self, engines):
keys.remove(IBus.get_language_name("Other"))
keys += [IBus.get_language_name("Other")]
for l in keys:
- iter1 = self.__model.append(None)
- self.__model.set(iter1, 0, l)
+ iter1 = model.append(None)
+ model.set(iter1, 0, l)
def cmp_engine(a, b):
if a.get_rank() == b.get_rank():
return locale.strcoll(a.get_longname(), b.get_longname())
return int(b.get_rank() - a.get_rank())
langs[l].sort(cmp_engine)
for e in langs[l]:
- iter2 = self.__model.append(iter1)
- self.__model.set(iter2, 0, e)
+ iter2 = model.append(iter1)
+ model.set(iter2, 0, e)
+
+ def set_engines(self, engines):
+ self.__model = Gtk.TreeStore(object)
+
+ iter1 = self.__model.append(None)
+ self.__model.set(iter1, 0, 0)
+ lang_list = self.__gconf_get_lang_list_from_locale()
+ lang = {}
+ sub_lang = {}
+ for e in engines:
+ l = IBus.get_language_name(e.props.language)
+ if lang_list == None or \
+ self.__has_engine_in_lang_list(e, lang_list):
+ if l not in lang:
+ lang[l] = []
+ lang[l].append(e)
+ else:
+ if l not in sub_lang:
+ sub_lang[l] = []
+ sub_lang[l].append(e)
+
+ self.__model_append_langs(self.__model, lang, True)
+ iter1 = self.__model.append(None)
+ self.__model.set(iter1, 0, -1)
+
+ self.__all_model = Gtk.TreeStore(object)
+ iter1 = self.__all_model.append(None)
+ self.__all_model.set(iter1, 0, 0)
+ self.__model_append_langs(self.__all_model, lang, False)
+ iter1 = self.__all_model.append(None)
+ self.__all_model.set(iter1, 0, -1)
+ self.__model_append_langs(self.__all_model, sub_lang, False)
+
+ self.__toggle_sub_lang()
- self.set_model(self.__model)
+ def __toggle_sub_lang(self):
+ self.set_model(None)
+ if self.__show_sub_lang:
+ self.set_model(self.__all_model)
+ else:
+ self.set_model(self.__model)
self.set_active(0)
def __icon_cell_data_cb(self, celllayout, renderer, model, iter, data):
- engine = self.__model.get_value(iter, 0)
+ model = self.get_model()
+ engine = model.get_value(iter, 0)
if isinstance(engine, str) or isinstance (engine, unicode):
renderer.set_property("visible", False)
renderer.set_property("sensitive", False)
elif isinstance(engine, int):
- renderer.set_property("visible", False)
- renderer.set_property("sensitive", False)
+ if engine == 0:
+ renderer.set_property("visible", False)
+ renderer.set_property("sensitive", False)
+ renderer.set_property("pixbuf", None)
+ elif engine < 0:
+ if not self.__show_sub_lang:
+ pixbuf = load_icon("go-bottom", Gtk.IconSize.LARGE_TOOLBAR)
+ else:
+ pixbuf = load_icon("go-up", Gtk.IconSize.LARGE_TOOLBAR)
+ if pixbuf == None:
+ pixbuf = load_icon(Gtk.STOCK_MISSING_IMAGE,
+ Gtk.IconSize.LARGE_TOOLBAR)
+ if pixbuf == None:
+ renderer.set_property("visible", False)
+ renderer.set_property("sensitive", False)
+ return
+ renderer.set_property("visible", True)
+ renderer.set_property("sensitive", True)
+ renderer.set_property("pixbuf", pixbuf)
else:
renderer.set_property("visible", True)
renderer.set_property("sensitive", True)
pixbuf = load_icon(engine.get_icon(), Gtk.IconSize.LARGE_TOOLBAR)
renderer.set_property("pixbuf", pixbuf)
def __name_cell_data_cb(self, celllayout, renderer, model, iter, data):
- engine = self.__model.get_value(iter, 0)
+ model = self.get_model()
+ engine = model.get_value(iter, 0)
if isinstance (engine, str) or isinstance (engine, unicode):
renderer.set_property("sensitive", False)
renderer.set_property("text", engine)
renderer.set_property("weight", Pango.Weight.NORMAL)
elif isinstance(engine, int):
renderer.set_property("sensitive", True)
- renderer.set_property("text", _("Select an input method"))
- renderer.set_property("weight", Pango.Weight.NORMAL)
+ if engine == 0:
+ renderer.set_property("text", _("Select an input method"))
+ renderer.set_property("weight", Pango.Weight.NORMAL)
+ elif engine < 0:
+ if not self.__show_sub_lang:
+ renderer.set_property("text", _("Show all input methods"))
+ else:
+ renderer.set_property("text", _("Show only input methods for your region"))
+ renderer.set_property("weight", Pango.Weight.BOLD)
else:
renderer.set_property("sensitive", True)
renderer.set_property("text", engine.get_longname())
@@ -145,10 +244,18 @@ def do_get_property(self, property):
if i == 0 or i == -1:
return None
iter = self.get_active_iter()
- return self.get_model()[iter][0]
+ model = self.get_model()
+ if model[iter][0] == -1:
+ self.__show_sub_lang = not self.__show_sub_lang
+ self.__toggle_sub_lang()
+ return None
+ return model[iter][0]
else:
raise AttributeError, 'unknown property %s' % property.name
+ def set_config(self, config):
+ self.__config = config
+
def get_active_engine(self):
return self.get_property("active-engine")
View
1 setup/main.py
@@ -209,6 +209,7 @@ def __init_general(self):
# init engine page
self.__engines = self.__bus.list_engines()
self.__combobox = self.__builder.get_object("combobox_engines")
+ self.__combobox.set_config(self.__config)
self.__combobox.set_engines(self.__engines)
engine_names = values.get("preload_engines", [])

0 comments on commit dffb43e

Please sign in to comment.