=== modified file 'ui/gtk/panel.py' --- ui/gtk/panel.py 2009-12-05 18:44:50 +0000 +++ ui/gtk/panel.py 2010-07-24 10:43:59 +0000 @@ -34,6 +34,11 @@ from candidatepanel import CandidatePanel from engineabout import EngineAbout +try: + import appindicator +except: + pass + from gettext import dgettext _ = lambda a : dgettext("ibus", a) N_ = lambda a : a @@ -106,12 +111,21 @@ lambda widget, index, button, state: self.candidate_clicked(index, button, state)) - 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(ICON_KEYBOARD) - self.__status_icon.set_tooltip(_("IBus input method framework")) - self.__status_icon.set_visible(True) + self.__appindicator = None + self.__status_icon = None + self.__previous_focus_ic = None + + try: + self.__appindicator = appindicator.Indicator("ibus", ICON_KEYBOARD, appindicator.CATEGORY_APPLICATION_STATUS) + self.__appindicator.set_status(appindicator.STATUS_ACTIVE) + self.__appindicator_update_menu() + except: + 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(ICON_KEYBOARD) + self.__status_icon.set_tooltip(_("IBus input method framework")) + self.__status_icon.set_visible(True) self.__config_load_lookup_table_orientation() self.__config_load_show() @@ -188,10 +202,13 @@ if not icon_name: icon_name = ICON_ENGINE self.__language_bar.set_im_icon(icon_name) - if icon_name.startswith("/"): - self.__status_icon.set_from_file(icon_name) + if self.__appindicator: + self.__appindicator.set_icon(icon_name) else: - self.__status_icon.set_from_icon_name(icon_name) + if icon_name.startswith("/"): + self.__status_icon.set_from_file(icon_name) + else: + self.__status_icon.set_from_icon_name(icon_name) def __set_im_name(self, name): self.__language_bar.set_im_name(name) @@ -214,6 +231,9 @@ self.__set_im_icon(ICON_KEYBOARD) self.__set_im_name(None) self.__language_bar.focus_in() + if self.__appindicator: + self.__previous_focus_ic = self.__focus_ic + self.__appindicator_update_menu() def focus_out(self, ic): self.reset() @@ -292,7 +312,13 @@ def __config_load_show_icon_on_systray(self): value = self.__config.get_value("panel", "show_icon_on_systray", True) - self.__status_icon.set_visible(True if value else False) + if self.__appindicator: + if value: + self.__appindicator.set_status(appindicator.STATUS_ACTIVE) + else: + self.__appindicator.set_status(appindicator.STATUS_PASSIVE) + else: + self.__status_icon.set_visible(True if value else False) def __config_load_show_im_name(self): value = self.__config.get_value("panel", "show_im_name", False) @@ -321,28 +347,29 @@ def __config_reloaded_cb(self, bus): pass - def __create_sys_menu(self): - menu = gtk.Menu() + def __create_sys_menu(self, menu): item = gtk.ImageMenuItem(gtk.STOCK_PREFERENCES) item.connect("activate", self.__sys_menu_item_activate_cb, gtk.STOCK_PREFERENCES) - menu.add(item) + item.show() + menu.append(item) item = gtk.ImageMenuItem(gtk.STOCK_ABOUT) item.connect("activate", self.__sys_menu_item_activate_cb, gtk.STOCK_ABOUT) - menu.add(item) - menu.add(gtk.SeparatorMenuItem()) + item.show() + menu.append(item) + menu.append(gtk.SeparatorMenuItem()) item = gtk.MenuItem(_("Restart")) item.connect("activate", self.__sys_menu_item_activate_cb, "Restart") - menu.add(item) + item.show() + menu.append(item) item = gtk.ImageMenuItem(gtk.STOCK_QUIT) item.connect("activate", self.__sys_menu_item_activate_cb, gtk.STOCK_QUIT) - menu.add(item) + item.show() + menu.append(item) - menu.show_all() - menu.set_take_focus(False) return menu def __create_im_menu(self): @@ -372,10 +399,11 @@ else: item.set_image(_icon.IconWidget(ICON_ENGINE, size[0])) item.connect("activate", self.__im_menu_item_activate_cb, engine) - menu.add(item) + item.show() + menu.append(item) else: item = gtk.MenuItem(lang) - menu.add(item) + menu.append(item) submenu = gtk.Menu() item.set_submenu(submenu) for engine in tmp[lang]: @@ -385,19 +413,21 @@ else: item.set_image(_icon.IconWidget(ICON_ENGINE, size[0])) item.connect("activate", self.__im_menu_item_activate_cb, engine) - submenu.add(item) + item.show() + submenu.append(item) item = gtk.ImageMenuItem(_("Turn off input method")) item.set_image(_icon.IconWidget("gtk-close", size[0])) item.connect("activate", self.__im_menu_item_activate_cb, None) - menu.add(item) + item.show() + menu.append(item) - menu.show_all() - menu.set_take_focus(False) return menu def __get_im_menu_cb(self, languagebar): menu = self.__create_im_menu() + menu.set_take_focus(False) + menu.show_all() return menu def __show_engine_about_cb(self, langagebar): @@ -414,7 +444,12 @@ self.__config.set_value("panel", "y", y) def __status_icon_popup_menu_cb(self, status_icon, button, active_time): - menu = self.__create_sys_menu() + menu = gtk.Menu() + self.__create_sys_menu(menu) + + menu.show_all() + menu.set_take_focus(False) + menu.popup(None, None, gtk.status_icon_position_menu, button, @@ -427,23 +462,52 @@ item = gtk.ImageMenuItem(_("No input window")) size = gtk.icon_size_lookup(gtk.ICON_SIZE_MENU) item.set_image(_icon.IconWidget("gtk-info", size[0])) - menu.add(item) - menu.show_all() + menu.append(item) else: menu = self.__create_im_menu() + + menu.set_take_focus(False) + menu.show_all() menu.popup(None, None, gtk.status_icon_position_menu, 0, gtk.get_current_event_time(), self.__status_icon) + def __appindicator_update_menu(self): + if not self.__appindicator: + return + + if not self.__previous_focus_ic: + menu = gtk.Menu() + item = gtk.ImageMenuItem(_("No input window")) + size = gtk.icon_size_lookup(gtk.ICON_SIZE_MENU) + item.set_image(_icon.IconWidget("gtk-info", size[0])) + item.show() + menu.append(item) + else: + menu = self.__create_im_menu() + + menu.append(gtk.SeparatorMenuItem()) + + self.__create_sys_menu(menu) + + menu.show_all() + menu.set_take_focus(False) + + self.__appindicator.set_menu(menu) + def __im_menu_item_activate_cb(self, item, engine): - if not self.__focus_ic: + focus_ic = self.__focus_ic + if self.__previous_focus_ic: + focus_ic = self.__previous_focus_ic + + if not focus_ic: return if engine: - self.__focus_ic.set_engine(engine) + focus_ic.set_engine(engine) else: - self.__focus_ic.disable() + focus_ic.disable() def __sys_menu_item_activate_cb(self, item, command): if command == gtk.STOCK_PREFERENCES: