#! /bin/sh /usr/share/dpatch/dpatch-run ## 05_appindicator.dpatch by ## ## All lines beginning with `## DP:' are a description of the patch. ## DP: No description. @DPATCH@ diff -urNad ibus-1.3.7.orig/ui/gtk/main.py ibus-1.3.7/ui/gtk/main.py --- ibus-1.3.7.orig/ui/gtk/main.py 2010-06-29 06:43:12.000000000 +0100 +++ ibus-1.3.7/ui/gtk/main.py 2010-08-13 14:50:37.754755027 +0100 @@ -58,9 +58,11 @@ "Please restart ibus input platform."), \ "ibus") self.__notify.set_timeout(10 * 1000) - self.__notify.attach_to_status_icon (self.__panel.get_status_icon()) - self.__notify.add_action("restart", _("Restart Now"), self.__restart_cb, None) - self.__notify.add_action("ignore", _("Later"), lambda *args: None, None) + status_icon = self.__panel.get_status_icon() + if status_icon: + self.__notify.attach_to_status_icon (status_icon) + self.__notify.add_action("restart", _("Restart Now"), self.__restart_cb, None) + self.__notify.add_action("ignore", _("Later"), lambda *args: None, None) def __restart_cb(self, notify, action, data): if action == "restart": diff -urNad ibus-1.3.7.orig/ui/gtk/panel.py ibus-1.3.7/ui/gtk/panel.py --- ibus-1.3.7.orig/ui/gtk/panel.py 2010-08-13 09:27:10.788726000 +0100 +++ ibus-1.3.7/ui/gtk/panel.py 2010-08-13 14:55:42.782755023 +0100 @@ -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 @@ -68,7 +73,7 @@ self.__data_dir = path.join(self.__prefix, "share", "ibus") # self.__icons_dir = path.join(self.__data_dir, "icons") self.__setup_cmd = path.join(self.__prefix, "bin", "ibus-setup") - + # hanlder signal signal.signal(signal.SIGCHLD, self.__sigchld_cb) @@ -106,12 +111,22 @@ 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() + self.__status_icon = None + 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 +203,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 +232,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() @@ -290,7 +311,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) @@ -317,8 +344,7 @@ 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) @@ -337,8 +363,6 @@ self.__sys_menu_item_activate_cb, gtk.STOCK_QUIT) menu.add(item) - menu.show_all() - menu.set_take_focus(False) return menu # def __create_im_menu(self): @@ -422,12 +446,12 @@ item.set_sensitive(False) menu.add(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): @@ -444,7 +468,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, @@ -458,23 +487,50 @@ size = gtk.icon_size_lookup(gtk.ICON_SIZE_MENU) item.set_image(_icon.IconWidget("gtk-info", size[0])) menu.add(item) - menu.show_all() else: menu = self.__create_im_menu() self.__language_bar.create_im_menu(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 __im_menu_item_activate_cb(self, item, engine): - if not self.__focus_ic: + 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])) + menu.add(item) + else: + menu = self.__create_im_menu() + + menu.add(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): + 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: