示例#1
0
文件: main.py 项目: XueWei/ibus
    def __init_ui(self):
        # add icon search path
        self.__window = self.__builder.get_object("window_preferences")
        self.__window.connect("delete-event", gtk.main_quit)

        self.__button_close = self.__builder.get_object("button_close")
        self.__button_close.connect("clicked", gtk.main_quit)

        # auto start ibus
        self.__checkbutton_auto_start = self.__builder.get_object("checkbutton_auto_start")
        self.__checkbutton_auto_start.set_active(self.__is_auto_start())
        self.__checkbutton_auto_start.connect("toggled", self.__checkbutton_auto_start_toggled_cb)

        # keyboard shortcut
        # trigger
        self.__config = self.__bus.get_config()
        shortcuts = self.__config.get_value(
                        "general/hotkey", "trigger",
                        ibus.CONFIG_GENERAL_SHORTCUT_TRIGGER_DEFAULT)
        button = self.__builder.get_object("button_trigger")
        entry = self.__builder.get_object("entry_trigger")
        entry.set_text("; ".join(shortcuts))
        entry.set_tooltip_text("\n".join(shortcuts))
        button.connect("clicked", self.__shortcut_button_clicked_cb,
                    N_("trigger"), "general/hotkey", "trigger", entry)

        # next engine
        shortcuts = self.__config.get_value(
                        "general/hotkey", "next_engine",
                        ibus.CONFIG_GENERAL_SHORTCUT_NEXT_ENGINE_DEFAULT)
        button = self.__builder.get_object("button_next_engine")
        entry = self.__builder.get_object("entry_next_engine")
        entry.set_text("; ".join(shortcuts))
        entry.set_tooltip_text("\n".join(shortcuts))
        button.connect("clicked", self.__shortcut_button_clicked_cb,
                    N_("next input method"), "general/hotkey", "next_engine", entry)

        # prev engine
        shortcuts = self.__config.get_value(
                        "general/hotkey", "prev_engine",
                        ibus.CONFIG_GENERAL_SHORTCUT_PREV_ENGINE_DEFAULT)
        button = self.__builder.get_object("button_prev_engine")
        entry = self.__builder.get_object("entry_prev_engine")
        entry.set_text("; ".join(shortcuts))
        entry.set_tooltip_text("\n".join(shortcuts))
        button.connect("clicked", self.__shortcut_button_clicked_cb,
                    N_("previous input method"), "general/hotkey", "prev_engine", entry)

        # lookup table orientation
        self.__combobox_lookup_table_orientation = self.__builder.get_object("combobox_lookup_table_orientation")
        self.__combobox_lookup_table_orientation.set_active(
            self.__config.get_value("panel", "lookup_table_orientation", 0))
        self.__combobox_lookup_table_orientation.connect("changed",
            self.__combobox_lookup_table_orientation_changed_cb)

        # auto hide
        self.__combobox_panel_show = self.__builder.get_object("combobox_panel_show")
        self.__combobox_panel_show.set_active(
            self.__config.get_value("panel", "show", 1))
        self.__combobox_panel_show.connect("changed", self.__combobox_panel_show_changed_cb)

        # custom font
        self.__checkbutton_custom_font = self.__builder.get_object("checkbutton_custom_font")
        self.__checkbutton_custom_font.set_active(
            self.__config.get_value("panel", "use_custom_font", False))
        self.__checkbutton_custom_font.connect("toggled", self.__checkbutton_custom_font_toggled_cb)

        self.__label_custom_font = self.__builder.get_object("label_custom_font")
        self.__fontbutton_custom_font = self.__builder.get_object("fontbutton_custom_font")
        if self.__config.get_value("panel", "use_custom_font", False):
            self.__label_custom_font.set_sensitive(True)
            self.__fontbutton_custom_font.set_sensitive(True)
        else:
            self.__label_custom_font.set_sensitive(False)
            self.__fontbutton_custom_font.set_sensitive(False)
        font_name = gtk.settings_get_default().get_property("gtk-font-name")
        font_name = unicode(font_name, "utf-8")
        font_name = self.__config.get_value("panel", "custom_font", font_name)
        self.__fontbutton_custom_font.connect("notify::font-name", self.__fontbutton_custom_font_notify_cb)
        self.__fontbutton_custom_font.set_font_name(font_name)

        # show icon on system tray
        self.__checkbutton_show_icon_on_systray = self.__builder.get_object("checkbutton_show_icon_on_systray")
        self.__checkbutton_show_icon_on_systray.set_active(
            self.__config.get_value("panel", "show_icon_on_systray", True))
        self.__checkbutton_show_icon_on_systray.connect("toggled", self.__checkbutton_show_icon_on_systray_toggled_cb)

        # show ime name
        self.__checkbutton_show_im_name = self.__builder.get_object("checkbutton_show_im_name")
        self.__checkbutton_show_im_name.set_active(
            self.__config.get_value("panel", "show_im_name", False))
        self.__checkbutton_show_im_name.connect("toggled", self.__checkbutton_show_im_name_toggled_cb)

        # use system keyboard layout setting
        self.__checkbutton_use_sys_layout = self.__builder.get_object("checkbutton_use_sys_layout")
        self.__checkbutton_use_sys_layout.set_active(
            self.__config.get_value("general", "use_system_keyboard_layout", False))
        self.__checkbutton_use_sys_layout.connect("toggled", self.__checkbutton_use_sys_layout_toggled_cb)

        # init engine page
        self.__engines = self.__bus.list_engines()
        self.__combobox = EngineComboBox(self.__engines)
        self.__combobox.show()
        self.__builder.get_object("alignment_engine_combobox").add(self.__combobox)

        tmp_dict = {}
        for e in self.__engines:
            tmp_dict[e.name] = e
        engine_names = self.__config.get_value("general", "preload_engines", [])
        engines = []
        for n in engine_names:
            if n in tmp_dict:
                engines.append(tmp_dict[n])
        self.__treeview = EngineTreeView(engines)
        self.__treeview.show()
        self.__builder.get_object("scrolledwindow_engine_treeview").add(self.__treeview)

        self.__treeview.connect("changed", self.__treeview_changed_cb)

        button = self.__builder.get_object("button_engine_add")
        button.connect("clicked",
                       lambda *args:self.__treeview.append_engine(self.__combobox.get_active_engine()))
        button = self.__builder.get_object("button_engine_remove")
        button.connect("clicked", lambda *args:self.__treeview.remove_engine())
        button = self.__builder.get_object("button_engine_up")
        button.connect("clicked", lambda *args:self.__treeview.move_up_engine())

        button = self.__builder.get_object("button_engine_down")
        button.connect("clicked", lambda *args:self.__treeview.move_down_engine())

        button = self.__builder.get_object("button_engine_about")
        button.connect("clicked", self.__button_engine_about_cb)
示例#2
0
文件: main.py 项目: XueWei/ibus
class Setup(object):
    def __flush_gtk_events(self):
        while gtk.events_pending():
            gtk.main_iteration()

    def __init__(self):
        super(Setup, self).__init__()
        localedir = os.getenv("IBUS_LOCALEDIR")
        gettext.bindtextdomain("ibus", localedir)
        gettext.bind_textdomain_codeset("ibus", "UTF-8")
        gtk_builder_file = path.join(path.dirname(__file__), "./setup.ui")
        self.__builder = gtk.Builder()
        self.__builder.set_translation_domain("ibus")
        self.__builder.add_from_file(gtk_builder_file);
        self.__bus = None
        self.__init_bus()
        self.__init_ui()

    def __init_ui(self):
        # add icon search path
        self.__window = self.__builder.get_object("window_preferences")
        self.__window.connect("delete-event", gtk.main_quit)

        self.__button_close = self.__builder.get_object("button_close")
        self.__button_close.connect("clicked", gtk.main_quit)

        # auto start ibus
        self.__checkbutton_auto_start = self.__builder.get_object("checkbutton_auto_start")
        self.__checkbutton_auto_start.set_active(self.__is_auto_start())
        self.__checkbutton_auto_start.connect("toggled", self.__checkbutton_auto_start_toggled_cb)

        # keyboard shortcut
        # trigger
        self.__config = self.__bus.get_config()
        shortcuts = self.__config.get_value(
                        "general/hotkey", "trigger",
                        ibus.CONFIG_GENERAL_SHORTCUT_TRIGGER_DEFAULT)
        button = self.__builder.get_object("button_trigger")
        entry = self.__builder.get_object("entry_trigger")
        entry.set_text("; ".join(shortcuts))
        entry.set_tooltip_text("\n".join(shortcuts))
        button.connect("clicked", self.__shortcut_button_clicked_cb,
                    N_("trigger"), "general/hotkey", "trigger", entry)

        # next engine
        shortcuts = self.__config.get_value(
                        "general/hotkey", "next_engine",
                        ibus.CONFIG_GENERAL_SHORTCUT_NEXT_ENGINE_DEFAULT)
        button = self.__builder.get_object("button_next_engine")
        entry = self.__builder.get_object("entry_next_engine")
        entry.set_text("; ".join(shortcuts))
        entry.set_tooltip_text("\n".join(shortcuts))
        button.connect("clicked", self.__shortcut_button_clicked_cb,
                    N_("next input method"), "general/hotkey", "next_engine", entry)

        # prev engine
        shortcuts = self.__config.get_value(
                        "general/hotkey", "prev_engine",
                        ibus.CONFIG_GENERAL_SHORTCUT_PREV_ENGINE_DEFAULT)
        button = self.__builder.get_object("button_prev_engine")
        entry = self.__builder.get_object("entry_prev_engine")
        entry.set_text("; ".join(shortcuts))
        entry.set_tooltip_text("\n".join(shortcuts))
        button.connect("clicked", self.__shortcut_button_clicked_cb,
                    N_("previous input method"), "general/hotkey", "prev_engine", entry)

        # lookup table orientation
        self.__combobox_lookup_table_orientation = self.__builder.get_object("combobox_lookup_table_orientation")
        self.__combobox_lookup_table_orientation.set_active(
            self.__config.get_value("panel", "lookup_table_orientation", 0))
        self.__combobox_lookup_table_orientation.connect("changed",
            self.__combobox_lookup_table_orientation_changed_cb)

        # auto hide
        self.__combobox_panel_show = self.__builder.get_object("combobox_panel_show")
        self.__combobox_panel_show.set_active(
            self.__config.get_value("panel", "show", 1))
        self.__combobox_panel_show.connect("changed", self.__combobox_panel_show_changed_cb)

        # custom font
        self.__checkbutton_custom_font = self.__builder.get_object("checkbutton_custom_font")
        self.__checkbutton_custom_font.set_active(
            self.__config.get_value("panel", "use_custom_font", False))
        self.__checkbutton_custom_font.connect("toggled", self.__checkbutton_custom_font_toggled_cb)

        self.__label_custom_font = self.__builder.get_object("label_custom_font")
        self.__fontbutton_custom_font = self.__builder.get_object("fontbutton_custom_font")
        if self.__config.get_value("panel", "use_custom_font", False):
            self.__label_custom_font.set_sensitive(True)
            self.__fontbutton_custom_font.set_sensitive(True)
        else:
            self.__label_custom_font.set_sensitive(False)
            self.__fontbutton_custom_font.set_sensitive(False)
        font_name = gtk.settings_get_default().get_property("gtk-font-name")
        font_name = unicode(font_name, "utf-8")
        font_name = self.__config.get_value("panel", "custom_font", font_name)
        self.__fontbutton_custom_font.connect("notify::font-name", self.__fontbutton_custom_font_notify_cb)
        self.__fontbutton_custom_font.set_font_name(font_name)

        # show icon on system tray
        self.__checkbutton_show_icon_on_systray = self.__builder.get_object("checkbutton_show_icon_on_systray")
        self.__checkbutton_show_icon_on_systray.set_active(
            self.__config.get_value("panel", "show_icon_on_systray", True))
        self.__checkbutton_show_icon_on_systray.connect("toggled", self.__checkbutton_show_icon_on_systray_toggled_cb)

        # show ime name
        self.__checkbutton_show_im_name = self.__builder.get_object("checkbutton_show_im_name")
        self.__checkbutton_show_im_name.set_active(
            self.__config.get_value("panel", "show_im_name", False))
        self.__checkbutton_show_im_name.connect("toggled", self.__checkbutton_show_im_name_toggled_cb)

        # use system keyboard layout setting
        self.__checkbutton_use_sys_layout = self.__builder.get_object("checkbutton_use_sys_layout")
        self.__checkbutton_use_sys_layout.set_active(
            self.__config.get_value("general", "use_system_keyboard_layout", False))
        self.__checkbutton_use_sys_layout.connect("toggled", self.__checkbutton_use_sys_layout_toggled_cb)

        # init engine page
        self.__engines = self.__bus.list_engines()
        self.__combobox = EngineComboBox(self.__engines)
        self.__combobox.show()
        self.__builder.get_object("alignment_engine_combobox").add(self.__combobox)

        tmp_dict = {}
        for e in self.__engines:
            tmp_dict[e.name] = e
        engine_names = self.__config.get_value("general", "preload_engines", [])
        engines = []
        for n in engine_names:
            if n in tmp_dict:
                engines.append(tmp_dict[n])
        self.__treeview = EngineTreeView(engines)
        self.__treeview.show()
        self.__builder.get_object("scrolledwindow_engine_treeview").add(self.__treeview)

        self.__treeview.connect("changed", self.__treeview_changed_cb)

        button = self.__builder.get_object("button_engine_add")
        button.connect("clicked",
                       lambda *args:self.__treeview.append_engine(self.__combobox.get_active_engine()))
        button = self.__builder.get_object("button_engine_remove")
        button.connect("clicked", lambda *args:self.__treeview.remove_engine())
        button = self.__builder.get_object("button_engine_up")
        button.connect("clicked", lambda *args:self.__treeview.move_up_engine())

        button = self.__builder.get_object("button_engine_down")
        button.connect("clicked", lambda *args:self.__treeview.move_down_engine())

        button = self.__builder.get_object("button_engine_about")
        button.connect("clicked", self.__button_engine_about_cb)

    def __button_engine_about_cb(self, button):
        engine = self.__treeview.get_select_engine()
        if engine:
            about = EngineAbout(engine)
            about.run()
            about.destroy()

    def __treeview_changed_cb(self, treeview):
        engines = self.__treeview.get_engines()
        engine_names = map(lambda e: e.name, engines)
        self.__config.set_list("general", "preload_engines", engine_names, "s")

    def __init_bus(self):
        try:
            self.__bus = ibus.Bus()
            # self.__bus.connect("config-value-changed", self.__config_value_changed_cb)
            # self.__bus.connect("config-reloaded", self.__config_reloaded_cb)
            # self.__bus.config_add_watch("/general")
            # self.__bus.config_add_watch("/general/hotkey")
            # self.__bus.config_add_watch("/panel")
        except:
            while self.__bus == None:
                message = _("IBus daemon is not started. Do you want to start it now?")
                dlg = gtk.MessageDialog(type = gtk.MESSAGE_QUESTION,
                        buttons = gtk.BUTTONS_YES_NO,
                        message_format = message)
                id = dlg.run()
                dlg.destroy()
                self.__flush_gtk_events()
                if id != gtk.RESPONSE_YES:
                    sys.exit(0)
                pid = os.spawnlp(os.P_NOWAIT, "ibus-daemon", "ibus-daemon")
                time.sleep(1)
                try:
                    self.__bus = ibus.Bus()
                except:
                    continue
                message = _("IBus has been started! "
                    "If you can not use IBus, please add below lines in $HOME/.bashrc, and relogin your desktop.\n"
                    "  export GTK_IM_MODULE=ibus\n"
                    "  export XMODIFIERS=@im=ibus\n"
                    "  export QT_IM_MODULE=ibus"
                    )
                dlg = gtk.MessageDialog(type = gtk.MESSAGE_INFO,
                                        buttons = gtk.BUTTONS_OK,
                                        message_format = message)
                id = dlg.run()
                dlg.destroy()
                self.__flush_gtk_events()

    def __shortcut_button_clicked_cb(self, button, name, section, _name, entry):
        buttons = (gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, gtk.STOCK_OK, gtk.RESPONSE_OK)
        title = _("Select keyboard shortcut for %s") %  _(name)
        dialog = keyboardshortcut.KeyboardShortcutSelectionDialog(buttons = buttons, title = title)
        text = entry.get_text()
        if text:
            shortcuts = text.split("; ")
        else:
            shortcuts = None
        dialog.set_shortcuts(shortcuts)
        id = dialog.run()
        shortcuts = dialog.get_shortcuts()
        dialog.destroy()
        if id != gtk.RESPONSE_OK:
            return
        self.__config.set_list(section, _name, shortcuts, "s")
        text = "; ".join(shortcuts)
        entry.set_text(text)
        entry.set_tooltip_text(text)


    def __item_started_column_toggled_cb(self, cell, path_str, model):

        # get toggled iter
        iter = model.get_iter_from_string(path_str)
        data = model.get_value(iter, COLUMN_DATA)

        # do something with the value
        if data[DATA_STARTED] == False:
            try:
                self.__bus.register_start_engine(data[DATA_LANG], data[DATA_NAME])
            except Exception, e:
                dlg = gtk.MessageDialog(type = gtk.MESSAGE_ERROR,
                        buttons = gtk.BUTTONS_CLOSE,
                        message_format = str(e))
                dlg.run()
                dlg.destroy()
                self.__flush_gtk_events()
                return
        else: