Blame setup/main.py

Packit Service 1d8f1c
# vim:set et sts=4 sw=4:
Packit Service 1d8f1c
# -*- coding: utf-8 -*-
Packit Service 1d8f1c
#
Packit Service 1d8f1c
# ibus - The Input Bus
Packit Service 1d8f1c
#
Packit Service 1d8f1c
# Copyright (c) 2007-2016 Peng Huang <shawn.p.huang@gmail.com>
Packit Service 1d8f1c
# Copyright (c) 2010-2018 Takao Fujiwara <takao.fujiwara1@gmail.com>
Packit Service 1d8f1c
# Copyright (c) 2007-2016 Red Hat, Inc.
Packit Service 1d8f1c
#
Packit Service 1d8f1c
# This library is free software; you can redistribute it and/or
Packit Service 1d8f1c
# modify it under the terms of the GNU Lesser General Public
Packit Service 1d8f1c
# License as published by the Free Software Foundation; either
Packit Service 1d8f1c
# version 2.1 of the License, or (at your option) any later version.
Packit Service 1d8f1c
#
Packit Service 1d8f1c
# This library is distributed in the hope that it will be useful,
Packit Service 1d8f1c
# but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service 1d8f1c
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit Service 1d8f1c
# Lesser General Public License for more details.
Packit Service 1d8f1c
#
Packit Service 1d8f1c
# You should have received a copy of the GNU Lesser General Public
Packit Service 1d8f1c
# License along with this library; if not, write to the Free Software
Packit Service 1d8f1c
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301
Packit Service 1d8f1c
# USA
Packit Service 1d8f1c
Packit Service 1d8f1c
# for python2
Packit Service 1d8f1c
from __future__ import print_function
Packit Service 1d8f1c
Packit Service 1d8f1c
import os
Packit Service 1d8f1c
import signal
Packit Service 1d8f1c
import sys
Packit Service 1d8f1c
import time
Packit Service 1d8f1c
Packit Service 1d8f1c
from gi import require_version as gi_require_version
Packit Service 1d8f1c
gi_require_version('GLib', '2.0')
Packit Service 1d8f1c
gi_require_version('GdkX11', '3.0')
Packit Service 1d8f1c
gi_require_version('Gio', '2.0')
Packit Service 1d8f1c
gi_require_version('Gtk', '3.0')
Packit Service 1d8f1c
gi_require_version('IBus', '1.0')
Packit Service 1d8f1c
Packit Service 1d8f1c
from gi.repository import GLib
Packit Service 1d8f1c
# set_prgname before importing other modules to show the name in warning
Packit Service 1d8f1c
# messages when import modules are failed.
Packit Service 1d8f1c
GLib.set_prgname('ibus-setup')
Packit Service 1d8f1c
Packit Service 1d8f1c
from gi.repository import GdkX11
Packit Service 1d8f1c
from gi.repository import Gio
Packit Service 1d8f1c
from gi.repository import Gtk
Packit Service 1d8f1c
from gi.repository import IBus
Packit Service 1d8f1c
from os import path
Packit Service 1d8f1c
Packit Service 1d8f1c
import i18n
Packit Service 1d8f1c
import keyboardshortcut
Packit Service 1d8f1c
import locale
Packit Service 1d8f1c
from emojilang import EmojiLangButton
Packit Service 1d8f1c
from enginecombobox import EngineComboBox
Packit Service 1d8f1c
from enginedialog import EngineDialog
Packit Service 1d8f1c
from enginetreeview import EngineTreeView
Packit Service 1d8f1c
from engineabout import EngineAbout
Packit Service 1d8f1c
from i18n import DOMAINNAME, _, N_
Packit Service 1d8f1c
Packit Service 1d8f1c
(
Packit Service 1d8f1c
    COLUMN_NAME,
Packit Service 1d8f1c
    COLUMN_ENABLE,
Packit Service 1d8f1c
    COLUMN_PRELOAD,
Packit Service 1d8f1c
    COLUMN_VISIBLE,
Packit Service 1d8f1c
    COLUMN_ICON,
Packit Service 1d8f1c
    COLUMN_DATA,
Packit Service 1d8f1c
) = list(range(6))
Packit Service 1d8f1c
Packit Service 1d8f1c
(
Packit Service 1d8f1c
    DATA_NAME,
Packit Service 1d8f1c
    DATA_LOCAL_NAME,
Packit Service 1d8f1c
    DATA_LANG,
Packit Service 1d8f1c
    DATA_ICON,
Packit Service 1d8f1c
    DATA_AUTHOR,
Packit Service 1d8f1c
    DATA_CREDITS,
Packit Service 1d8f1c
    DATA_EXEC,
Packit Service 1d8f1c
    DATA_STARTED,
Packit Service 1d8f1c
    DATA_PRELOAD
Packit Service 1d8f1c
) = list(range(9))
Packit Service 1d8f1c
Packit Service 1d8f1c
class Setup(object):
Packit Service 1d8f1c
    def __flush_gtk_events(self):
Packit Service 1d8f1c
        while Gtk.events_pending():
Packit Service 1d8f1c
            Gtk.main_iteration()
Packit Service 1d8f1c
Packit Service 1d8f1c
    def __init__(self):
Packit Service 1d8f1c
        super(Setup, self).__init__()
Packit Service 1d8f1c
Packit Service 1d8f1c
        self.__settings_general = Gio.Settings(
Packit Service 1d8f1c
                schema = "org.freedesktop.ibus.general");
Packit Service 1d8f1c
        self.__settings_hotkey = Gio.Settings(
Packit Service 1d8f1c
                schema = "org.freedesktop.ibus.general.hotkey");
Packit Service 1d8f1c
        self.__settings_panel = Gio.Settings(
Packit Service 1d8f1c
                schema = "org.freedesktop.ibus.panel");
Packit Service 1d8f1c
        self.__settings_emoji = Gio.Settings(
Packit Service 1d8f1c
                schema = "org.freedesktop.ibus.panel.emoji");
Packit Service 1d8f1c
Packit Service 1d8f1c
        # IBus.Bus() calls ibus_bus_new().
Packit Service 1d8f1c
        # Gtk.Builder().add_from_file() also calls ibus_bus_new_async()
Packit Service 1d8f1c
        # via ibus_im_context_new().
Packit Service 1d8f1c
        # Then if IBus.Bus() is called after Gtk.Builder().add_from_file(),
Packit Service 1d8f1c
        # the connection delay would be happened without an async
Packit Service 1d8f1c
        # finish function.
Packit Service 1d8f1c
        self.__bus = None
Packit Service 1d8f1c
        self.__init_bus()
Packit Service 1d8f1c
Packit Service 1d8f1c
        # Gtk.ListBox has been available since gtk 3.10
Packit Service 1d8f1c
        self.__has_list_box = hasattr(Gtk, 'ListBox')
Packit Service 1d8f1c
Packit Service 1d8f1c
        gtk_builder_file = path.join(path.dirname(__file__), "./setup.ui")
Packit Service 1d8f1c
        self.__builder = Gtk.Builder()
Packit Service 1d8f1c
        self.__builder.set_translation_domain(DOMAINNAME)
Packit Service 1d8f1c
        self.__builder.add_from_file(gtk_builder_file);
Packit Service 1d8f1c
        self.__init_ui()
Packit Service 1d8f1c
Packit Service 1d8f1c
    def __init_hotkeys(self):
Packit Service 1d8f1c
        name = 'triggers'
Packit Service 1d8f1c
        label = 'switch_engine'
Packit Service 1d8f1c
        comment = \
Packit Service 1d8f1c
            _("Use shortcut with shift to switch to the previous input method") 
Packit Service 1d8f1c
        self.__init_hotkey(name, label, comment)
Packit Service 1d8f1c
        name = 'emoji'
Packit Service 1d8f1c
        label = 'emoji_dialog'
Packit Service 1d8f1c
        self.__init_hotkey(name, label)
Packit Service 1d8f1c
        name = 'unicode'
Packit Service 1d8f1c
        label = 'unicode_dialog'
Packit Service 1d8f1c
        self.__init_hotkey(name, label)
Packit Service 1d8f1c
Packit Service 1d8f1c
    def __init_hotkey(self, name, label, comment=None):
Packit Service 1d8f1c
        if name == 'emoji':
Packit Service 1d8f1c
            shortcuts = self.__settings_emoji.get_strv('hotkey')
Packit Service 1d8f1c
        elif name == 'unicode':
Packit Service 1d8f1c
            shortcuts = self.__settings_emoji.get_strv('unicode-hotkey')
Packit Service 1d8f1c
        else:
Packit Service 1d8f1c
            shortcuts = self.__settings_hotkey.get_strv(name)
Packit Service 1d8f1c
        button = self.__builder.get_object("button_%s" % label)
Packit Service 1d8f1c
        entry = self.__builder.get_object("entry_%s" % label)
Packit Service 1d8f1c
        entry.set_text("; ".join(shortcuts))
Packit Service 1d8f1c
        tooltip = "\n".join(shortcuts)
Packit Service 1d8f1c
        if comment != None:
Packit Service 1d8f1c
            tooltip += "\n" + comment
Packit Service 1d8f1c
        entry.set_tooltip_text(tooltip)
Packit Service 1d8f1c
        if name == 'emoji':
Packit Service 1d8f1c
            button.connect("clicked", self.__shortcut_button_clicked_cb,
Packit Service 1d8f1c
                    'hotkey', 'panel/' + name, label, entry)
Packit Service 1d8f1c
        elif name == 'unicode':
Packit Service 1d8f1c
            button.connect("clicked", self.__shortcut_button_clicked_cb,
Packit Service 1d8f1c
                    'unicode-hotkey', 'panel/emoji', label, entry)
Packit Service 1d8f1c
        else:
Packit Service 1d8f1c
            button.connect("clicked", self.__shortcut_button_clicked_cb,
Packit Service 1d8f1c
                    name, "general/hotkey", label, entry)
Packit Service 1d8f1c
Packit Service 1d8f1c
    def __init_panel(self):
Packit Service 1d8f1c
        # lookup table orientation
Packit Service 1d8f1c
        self.__combobox_lookup_table_orientation = self.__builder.get_object(
Packit Service 1d8f1c
                "combobox_lookup_table_orientation")
Packit Service 1d8f1c
        self.__settings_panel.bind('lookup-table-orientation',
Packit Service 1d8f1c
                                   self.__combobox_lookup_table_orientation,
Packit Service 1d8f1c
                                   'active',
Packit Service 1d8f1c
                                   Gio.SettingsBindFlags.DEFAULT)
Packit Service 1d8f1c
Packit Service 1d8f1c
        # auto hide
Packit Service 1d8f1c
        self.__combobox_panel_show = self.__builder.get_object(
Packit Service 1d8f1c
                "combobox_panel_show")
Packit Service 1d8f1c
        self.__settings_panel.bind('show',
Packit Service 1d8f1c
                                   self.__combobox_panel_show,
Packit Service 1d8f1c
                                   'active',
Packit Service 1d8f1c
                                   Gio.SettingsBindFlags.DEFAULT)
Packit Service 1d8f1c
Packit Service 1d8f1c
        # panel position
Packit Service 1d8f1c
        self.__combobox_panel_position = self.__builder.get_object(
Packit Service 1d8f1c
                "combobox_panel_position")
Packit Service 1d8f1c
        self.__combobox_panel_position.set_active(3)
Packit Service 1d8f1c
        #self.__settings_panel.bind('position',
Packit Service 1d8f1c
        #                           self.__combobox_panel_position,
Packit Service 1d8f1c
        #                           'active',
Packit Service 1d8f1c
        #                           Gio.SettingsBindFlags.DEFAULT)
Packit Service 1d8f1c
Packit Service 1d8f1c
        # custom font
Packit Service 1d8f1c
        self.__checkbutton_custom_font = self.__builder.get_object(
Packit Service 1d8f1c
                "checkbutton_custom_font")
Packit Service 1d8f1c
        self.__settings_panel.bind('use-custom-font',
Packit Service 1d8f1c
                                   self.__checkbutton_custom_font,
Packit Service 1d8f1c
                                   'active',
Packit Service 1d8f1c
                                   Gio.SettingsBindFlags.DEFAULT)
Packit Service 1d8f1c
Packit Service 1d8f1c
        self.__fontbutton_custom_font = self.__builder.get_object(
Packit Service 1d8f1c
                "fontbutton_custom_font")
Packit Service 1d8f1c
        self.__settings_panel.bind('custom-font',
Packit Service 1d8f1c
                                    self.__fontbutton_custom_font,
Packit Service 1d8f1c
                                   'font-name',
Packit Service 1d8f1c
                                   Gio.SettingsBindFlags.DEFAULT)
Packit Service 1d8f1c
        self.__settings_panel.bind('use-custom-font',
Packit Service 1d8f1c
                                    self.__fontbutton_custom_font,
Packit Service 1d8f1c
                                   'sensitive',
Packit Service 1d8f1c
                                   Gio.SettingsBindFlags.GET)
Packit Service 1d8f1c
Packit Service 1d8f1c
        # show icon on system tray
Packit Service 1d8f1c
        self.__checkbutton_show_icon_on_systray = self.__builder.get_object(
Packit Service 1d8f1c
                "checkbutton_show_icon_on_systray")
Packit Service 1d8f1c
        self.__settings_panel.bind('show-icon-on-systray',
Packit Service 1d8f1c
                                   self.__checkbutton_show_icon_on_systray,
Packit Service 1d8f1c
                                   'active',
Packit Service 1d8f1c
                                   Gio.SettingsBindFlags.DEFAULT)
Packit Service 1d8f1c
Packit Service 1d8f1c
        # show ime name
Packit Service 1d8f1c
        self.__checkbutton_show_im_name = self.__builder.get_object(
Packit Service 1d8f1c
                "checkbutton_show_im_name")
Packit Service 1d8f1c
        self.__settings_panel.bind('show-im-name',
Packit Service 1d8f1c
                                   self.__checkbutton_show_im_name,
Packit Service 1d8f1c
                                   'active',
Packit Service 1d8f1c
                                   Gio.SettingsBindFlags.DEFAULT)
Packit Service 1d8f1c
Packit Service 1d8f1c
    def __init_general(self):
Packit Service 1d8f1c
        # embed preedit text
Packit Service 1d8f1c
        self.__checkbutton_embed_preedit_text = self.__builder.get_object(
Packit Service 1d8f1c
                "checkbutton_embed_preedit_text")
Packit Service 1d8f1c
        self.__settings_general.bind('embed-preedit-text',
Packit Service 1d8f1c
                                    self.__checkbutton_embed_preedit_text,
Packit Service 1d8f1c
                                    'active',
Packit Service 1d8f1c
                                    Gio.SettingsBindFlags.DEFAULT)
Packit Service 1d8f1c
Packit Service 1d8f1c
        # use system keyboard layout setting
Packit Service 1d8f1c
        self.__checkbutton_use_sys_layout = self.__builder.get_object(
Packit Service 1d8f1c
                "checkbutton_use_sys_layout")
Packit Service 1d8f1c
        self.__settings_general.bind('use-system-keyboard-layout',
Packit Service 1d8f1c
                                    self.__checkbutton_use_sys_layout,
Packit Service 1d8f1c
                                    'active',
Packit Service 1d8f1c
                                    Gio.SettingsBindFlags.DEFAULT)
Packit Service 1d8f1c
Packit Service 1d8f1c
        # use global ime setting
Packit Service 1d8f1c
        self.__checkbutton_use_global_engine = self.__builder.get_object(
Packit Service 1d8f1c
                "checkbutton_use_global_engine")
Packit Service 1d8f1c
        self.__settings_general.bind('use-global-engine',
Packit Service 1d8f1c
                                    self.__checkbutton_use_global_engine,
Packit Service 1d8f1c
                                    'active',
Packit Service 1d8f1c
                                    Gio.SettingsBindFlags.DEFAULT)
Packit Service 1d8f1c
Packit Service 1d8f1c
        # init engine page
Packit Service 1d8f1c
        self.__engines = self.__bus.list_engines()
Packit Service 1d8f1c
        self.__combobox = self.__builder.get_object("combobox_engines")
Packit Service 1d8f1c
        if self.__has_list_box:
Packit Service 1d8f1c
            self.__combobox.set_no_show_all(True)
Packit Service 1d8f1c
            self.__combobox.hide()
Packit Service 1d8f1c
        else:
Packit Service 1d8f1c
            self.__combobox.set_engines(self.__engines)
Packit Service 1d8f1c
Packit Service 1d8f1c
        tmp_dict = {}
Packit Service 1d8f1c
        for e in self.__engines:
Packit Service 1d8f1c
            tmp_dict[e.get_name()] = e
Packit Service 1d8f1c
        engine_names = self.__settings_general.get_strv('preload-engines')
Packit Service 1d8f1c
        engines = [tmp_dict[name] for name in engine_names if name in tmp_dict]
Packit Service 1d8f1c
Packit Service 1d8f1c
        self.__treeview = self.__builder.get_object("treeview_engines")
Packit Service 1d8f1c
        self.__treeview.set_engines(engines)
Packit Service 1d8f1c
Packit Service 1d8f1c
        button = self.__builder.get_object("button_engine_add")
Packit Service 1d8f1c
        if self.__has_list_box:
Packit Service 1d8f1c
            button.set_sensitive(True)
Packit Service 1d8f1c
            button.connect("clicked", self.__button_engine_add_cb)
Packit Service 1d8f1c
        else:
Packit Service 1d8f1c
            button.connect("clicked", self.__button_engine_add_cb_deprecate)
Packit Service 1d8f1c
        button = self.__builder.get_object("button_engine_remove")
Packit Service 1d8f1c
        button.connect("clicked", lambda *args:self.__treeview.remove_engine())
Packit Service 1d8f1c
        button = self.__builder.get_object("button_engine_up")
Packit Service 1d8f1c
        button.connect("clicked", lambda *args:self.__treeview.move_up_engine())
Packit Service 1d8f1c
Packit Service 1d8f1c
        button = self.__builder.get_object("button_engine_down")
Packit Service 1d8f1c
        button.connect("clicked",
Packit Service 1d8f1c
                lambda *args:self.__treeview.move_down_engine())
Packit Service 1d8f1c
Packit Service 1d8f1c
        button = self.__builder.get_object("button_engine_about")
Packit Service 1d8f1c
        button.connect("clicked", self.__button_engine_about_cb)
Packit Service 1d8f1c
Packit Service 1d8f1c
        self.__engine_setup_exec_list = {}
Packit Service 1d8f1c
        button = self.__builder.get_object("button_engine_preferences")
Packit Service 1d8f1c
        button.connect("clicked", self.__button_engine_preferences_cb)
Packit Service 1d8f1c
Packit Service 1d8f1c
        self.__combobox.connect("notify::active-engine",
Packit Service 1d8f1c
                self.__combobox_notify_active_engine_cb)
Packit Service 1d8f1c
        self.__treeview.connect("notify::active-engine", self.__treeview_notify_cb)
Packit Service 1d8f1c
        self.__treeview.connect("notify::engines", self.__treeview_notify_cb)
Packit Service 1d8f1c
Packit Service 1d8f1c
    def __init_emoji(self):
Packit Service 1d8f1c
        self.__fontbutton_emoji_font = self.__builder.get_object(
Packit Service 1d8f1c
                'fontbutton_emoji_font')
Packit Service 1d8f1c
        self.__fontbutton_emoji_font.set_preview_text('🙂🍎🚃💓📧⚽🐳');
Packit Service 1d8f1c
        self.__settings_emoji.bind('font',
Packit Service 1d8f1c
                                    self.__fontbutton_emoji_font,
Packit Service 1d8f1c
                                   'font-name',
Packit Service 1d8f1c
                                   Gio.SettingsBindFlags.DEFAULT)
Packit Service 1d8f1c
        self.__button_emoji_lang = self.__builder.get_object(
Packit Service 1d8f1c
                'button_emoji_lang')
Packit Service 1d8f1c
        self.__settings_emoji.bind('lang',
Packit Service 1d8f1c
                                    self.__button_emoji_lang,
Packit Service 1d8f1c
                                   'lang',
Packit Service 1d8f1c
                                   Gio.SettingsBindFlags.DEFAULT)
Packit Service 1d8f1c
        self.__checkbutton_emoji_partial_match = self.__builder.get_object(
Packit Service 1d8f1c
                'checkbutton_emoji_partial_match')
Packit Service 1d8f1c
        checkbutton_label = self.__checkbutton_emoji_partial_match.get_child()
Packit Service 1d8f1c
        if type(checkbutton_label) == Gtk.Label:
Packit Service 1d8f1c
            checkbutton_label.set_property('wrap', True)
Packit Service 1d8f1c
            checkbutton_label.set_property('max-width-chars', 74)
Packit Service 1d8f1c
        self.__spinbutton_emoji_partial_match = self.__builder.get_object(
Packit Service 1d8f1c
                'spinbutton_emoji_partial_match')
Packit Service 1d8f1c
        self.__settings_emoji.bind('has-partial-match',
Packit Service 1d8f1c
                                   self.__checkbutton_emoji_partial_match,
Packit Service 1d8f1c
                                   'active',
Packit Service 1d8f1c
                                   Gio.SettingsBindFlags.DEFAULT)
Packit Service 1d8f1c
        self.__settings_emoji.bind('has-partial-match',
Packit Service 1d8f1c
                                   self.__spinbutton_emoji_partial_match,
Packit Service 1d8f1c
                                   'sensitive',
Packit Service 1d8f1c
                                   Gio.SettingsBindFlags.GET)
Packit Service 1d8f1c
Packit Service 1d8f1c
        def adjustment_value_changed_cb(obj):
Packit Service 1d8f1c
            key = 'partial-match-length'
Packit Service 1d8f1c
            value = int(adjustment.get_value())
Packit Service 1d8f1c
            if value == self.__settings_emoji.get_int(key):
Packit Service 1d8f1c
                return
Packit Service 1d8f1c
            self.__settings_emoji.set_int(key, value)
Packit Service 1d8f1c
        def settings_emoji_partial_match_length_cb(settings, key):
Packit Service 1d8f1c
            value = self.__settings_emoji.get_int(key)
Packit Service 1d8f1c
            old_value = int(self.__spinbutton_emoji_partial_match.get_value())
Packit Service 1d8f1c
            if value == old_value:
Packit Service 1d8f1c
                return
Packit Service 1d8f1c
            self.__spinbutton_emoji_partial_match.set_value(value)
Packit Service 1d8f1c
        settings_emoji_partial_match_length_cb(None, 'partial-match-length')
Packit Service 1d8f1c
        adjustment = self.__spinbutton_emoji_partial_match.get_adjustment()
Packit Service 1d8f1c
        adjustment.connect('value-changed', adjustment_value_changed_cb)
Packit Service 1d8f1c
        self.__settings_emoji.connect('changed::partial-match-length',
Packit Service 1d8f1c
                                      settings_emoji_partial_match_length_cb)
Packit Service 1d8f1c
Packit Service 1d8f1c
        self.__hbox_emoji_partial_match = self.__builder.get_object(
Packit Service 1d8f1c
                'hbox_emoji_partial_match')
Packit Service 1d8f1c
        self.__settings_emoji.bind('has-partial-match',
Packit Service 1d8f1c
                                   self.__hbox_emoji_partial_match,
Packit Service 1d8f1c
                                   'sensitive',
Packit Service 1d8f1c
                                   Gio.SettingsBindFlags.GET)
Packit Service 1d8f1c
        self.__radiobutton_emoji_prefix_match = self.__builder.get_object(
Packit Service 1d8f1c
                'radiobutton_emoji_prefix_match')
Packit Service 1d8f1c
        self.__radiobutton_emoji_suffix_match = self.__builder.get_object(
Packit Service 1d8f1c
                'radiobutton_emoji_suffix_match')
Packit Service 1d8f1c
        self.__radiobutton_emoji_contain_match = self.__builder.get_object(
Packit Service 1d8f1c
                'radiobutton_emoji_contain_match')
Packit Service 1d8f1c
Packit Service 1d8f1c
        def radiobuton_emoji_partial_match_cb(obj):
Packit Service 1d8f1c
            key = 'partial-match-condition'
Packit Service 1d8f1c
            condition = 0
Packit Service 1d8f1c
            if not obj.get_active():
Packit Service 1d8f1c
                return
Packit Service 1d8f1c
            if obj == self.__radiobutton_emoji_prefix_match:
Packit Service 1d8f1c
                condition = 0
Packit Service 1d8f1c
            elif obj == self.__radiobutton_emoji_suffix_match:
Packit Service 1d8f1c
                condition = 1
Packit Service 1d8f1c
            elif obj == self.__radiobutton_emoji_contain_match:
Packit Service 1d8f1c
                condition = 2
Packit Service 1d8f1c
            else:
Packit Service 1d8f1c
                print('Wrong emoji partial match object')
Packit Service 1d8f1c
                return
Packit Service 1d8f1c
            self.__settings_emoji.set_int(key, condition)
Packit Service 1d8f1c
        def settings_emoji_partial_match_condition_cb(settings, key):
Packit Service 1d8f1c
            value = self.__settings_emoji.get_int(key)
Packit Service 1d8f1c
            obj = None
Packit Service 1d8f1c
            if value == 0:
Packit Service 1d8f1c
                obj = self.__radiobutton_emoji_prefix_match
Packit Service 1d8f1c
            elif value == 1:
Packit Service 1d8f1c
                obj = self.__radiobutton_emoji_suffix_match
Packit Service 1d8f1c
            elif value == 2:
Packit Service 1d8f1c
                obj = self.__radiobutton_emoji_contain_match
Packit Service 1d8f1c
            else:
Packit Service 1d8f1c
                print('Wrong emoji partial match condition')
Packit Service 1d8f1c
                return
Packit Service 1d8f1c
            if obj.get_active():
Packit Service 1d8f1c
                return
Packit Service 1d8f1c
            obj.set_active(True)
Packit Service 1d8f1c
Packit Service 1d8f1c
        settings_emoji_partial_match_condition_cb(None,
Packit Service 1d8f1c
                                                  'partial-match-condition')
Packit Service 1d8f1c
        self.__radiobutton_emoji_prefix_match.connect(
Packit Service 1d8f1c
                'toggled',
Packit Service 1d8f1c
                radiobuton_emoji_partial_match_cb)
Packit Service 1d8f1c
        self.__radiobutton_emoji_suffix_match.connect(
Packit Service 1d8f1c
                'toggled',
Packit Service 1d8f1c
                radiobuton_emoji_partial_match_cb)
Packit Service 1d8f1c
        self.__radiobutton_emoji_contain_match.connect(
Packit Service 1d8f1c
                'toggled',
Packit Service 1d8f1c
                radiobuton_emoji_partial_match_cb)
Packit Service 1d8f1c
        self.__settings_emoji.connect('changed::partial-match-condition',
Packit Service 1d8f1c
                                      settings_emoji_partial_match_condition_cb)
Packit Service 1d8f1c
Packit Service 1d8f1c
    def __init_ui(self):
Packit Service 1d8f1c
        # add icon search path
Packit Service 1d8f1c
        self.__window = self.__builder.get_object("window_preferences")
Packit Service 1d8f1c
        self.__window.connect("delete-event", Gtk.main_quit)
Packit Service 1d8f1c
        self.__window.connect("notify::window", self.__gdk_window_set_cb)
Packit Service 1d8f1c
Packit Service 1d8f1c
        self.__button_close = self.__builder.get_object("button_close")
Packit Service 1d8f1c
        self.__button_close.connect("clicked", Gtk.main_quit)
Packit Service 1d8f1c
Packit Service 1d8f1c
        # auto start ibus
Packit Service 1d8f1c
        self.__checkbutton_auto_start = self.__builder.get_object(
Packit Service 1d8f1c
                "checkbutton_auto_start")
Packit Service 1d8f1c
        self.__checkbutton_auto_start.set_active(self.__is_auto_start())
Packit Service 1d8f1c
        self.__checkbutton_auto_start.connect("toggled",
Packit Service 1d8f1c
                self.__checkbutton_auto_start_toggled_cb)
Packit Service 1d8f1c
Packit Service 1d8f1c
        self.__init_hotkeys()
Packit Service 1d8f1c
        self.__init_panel()
Packit Service 1d8f1c
        self.__init_general()
Packit Service 1d8f1c
        self.__init_emoji()
Packit Service 1d8f1c
Packit Service 1d8f1c
    def __gdk_window_set_cb(self, object, pspec):
Packit Service 1d8f1c
        window = object.get_window()
Packit Service 1d8f1c
        if type(window) != GdkX11.X11Window:
Packit Service 1d8f1c
            return
Packit Service 1d8f1c
        s = '%u' % GdkX11.X11Window.get_xid(window)
Packit Service 1d8f1c
        GLib.setenv('IBUS_SETUP_XID', s, True)
Packit Service 1d8f1c
Packit Service 1d8f1c
    def __combobox_notify_active_engine_cb(self, combobox, property):
Packit Service 1d8f1c
        engine = self.__combobox.get_active_engine()
Packit Service 1d8f1c
        button = self.__builder.get_object("button_engine_add")
Packit Service 1d8f1c
        button.set_sensitive(
Packit Service 1d8f1c
                engine != None and engine not in self.__treeview.get_engines())
Packit Service 1d8f1c
Packit Service 1d8f1c
    def __get_engine_setup_exec_args(self, engine):
Packit Service 1d8f1c
        args = []
Packit Service 1d8f1c
        if engine == None:
Packit Service 1d8f1c
           return args
Packit Service 1d8f1c
        setup = str(engine.get_setup())
Packit Service 1d8f1c
        if len(setup) != 0:
Packit Service 1d8f1c
            args = setup.split()
Packit Service 1d8f1c
            args.insert(1, path.basename(args[0]))
Packit Service 1d8f1c
            return args
Packit Service 1d8f1c
        name = str(engine.get_name())
Packit Service 1d8f1c
        libexecdir = os.environ['IBUS_LIBEXECDIR']
Packit Service 1d8f1c
        setup_path = (libexecdir + '/' + 'ibus-setup-' if libexecdir != None \
Packit Service 1d8f1c
            else 'ibus-setup-') + name.split(':')[0]
Packit Service 1d8f1c
        if path.exists(setup_path):
Packit Service 1d8f1c
            args.append(setup_path)
Packit Service 1d8f1c
            args.append(path.basename(setup_path))
Packit Service 1d8f1c
        return args
Packit Service 1d8f1c
Packit Service 1d8f1c
    def __treeview_notify_cb(self, treeview, prop):
Packit Service 1d8f1c
        if prop.name not in ("active-engine", "engines"):
Packit Service 1d8f1c
            return
Packit Service 1d8f1c
Packit Service 1d8f1c
        engines = self.__treeview.get_sorted_engines()
Packit Service 1d8f1c
        engine = self.__treeview.get_active_engine()
Packit Service 1d8f1c
Packit Service 1d8f1c
        self.__builder.get_object("button_engine_remove").set_sensitive(engine != None)
Packit Service 1d8f1c
        self.__builder.get_object("button_engine_about").set_sensitive(engine != None)
Packit Service 1d8f1c
        self.__builder.get_object("button_engine_up").set_sensitive(engine not in engines[:1])
Packit Service 1d8f1c
        self.__builder.get_object("button_engine_down").set_sensitive(engine not in engines[-1:])
Packit Service 1d8f1c
Packit Service 1d8f1c
        obj = self.__builder.get_object("button_engine_preferences")
Packit Service 1d8f1c
        if len(self.__get_engine_setup_exec_args(engine)) != 0:
Packit Service 1d8f1c
            obj.set_sensitive(True)
Packit Service 1d8f1c
        else:
Packit Service 1d8f1c
            obj.set_sensitive(False)
Packit Service 1d8f1c
Packit Service 1d8f1c
        if prop.name == "engines":
Packit Service 1d8f1c
            engines = self.__treeview.get_engines()
Packit Service 1d8f1c
            engine_names = [e.get_name() for e in engines]
Packit Service 1d8f1c
            self.__settings_general.set_strv('preload-engines', engine_names)
Packit Service 1d8f1c
Packit Service 1d8f1c
    def __button_engine_add_cb(self, button):
Packit Service 1d8f1c
        dialog = EngineDialog(transient_for = self.__window)
Packit Service 1d8f1c
        dialog.set_engines(self.__engines)
Packit Service 1d8f1c
        id = dialog.run()
Packit Service 1d8f1c
Packit Service 1d8f1c
        if id != Gtk.ResponseType.APPLY:
Packit Service 1d8f1c
            dialog.destroy()
Packit Service 1d8f1c
            return
Packit Service 1d8f1c
Packit Service 1d8f1c
        engine = dialog.get_selected_engine()
Packit Service 1d8f1c
        dialog.destroy()
Packit Service 1d8f1c
Packit Service 1d8f1c
        self.__treeview.append_engine(engine)
Packit Service 1d8f1c
Packit Service 1d8f1c
    def __button_engine_add_cb_deprecate(self, button):
Packit Service 1d8f1c
        engine = self.__combobox.get_active_engine()
Packit Service 1d8f1c
        self.__treeview.append_engine(engine)
Packit Service 1d8f1c
Packit Service 1d8f1c
    def __button_engine_about_cb(self, button):
Packit Service 1d8f1c
        engine = self.__treeview.get_active_engine()
Packit Service 1d8f1c
        if engine:
Packit Service 1d8f1c
            about = EngineAbout(engine = engine, transient_for = self.__window)
Packit Service 1d8f1c
            about.run()
Packit Service 1d8f1c
            about.destroy()
Packit Service 1d8f1c
Packit Service 1d8f1c
    def __button_engine_preferences_cb(self, button):
Packit Service 1d8f1c
        engine = self.__treeview.get_active_engine()
Packit Service 1d8f1c
        args = self.__get_engine_setup_exec_args(engine)
Packit Service 1d8f1c
        if len(args) == 0:
Packit Service 1d8f1c
            return
Packit Service 1d8f1c
        name = engine.get_name()
Packit Service 1d8f1c
        if name in list(self.__engine_setup_exec_list.keys()):
Packit Service 1d8f1c
            try:
Packit Service 1d8f1c
                wpid, sts = os.waitpid(self.__engine_setup_exec_list[name],
Packit Service 1d8f1c
                                       os.WNOHANG)
Packit Service 1d8f1c
                # the setup is still running.
Packit Service 1d8f1c
                if wpid == 0:
Packit Service 1d8f1c
                    return
Packit Service 1d8f1c
            except OSError:
Packit Service 1d8f1c
                pass
Packit Service 1d8f1c
            del self.__engine_setup_exec_list[name]
Packit Service 1d8f1c
        self.__engine_setup_exec_list[name] = os.spawnl(os.P_NOWAIT, *args)
Packit Service 1d8f1c
Packit Service 1d8f1c
    def __init_bus(self):
Packit Service 1d8f1c
        self.__bus = IBus.Bus()
Packit Service 1d8f1c
        if self.__bus.is_connected():
Packit Service 1d8f1c
            return
Packit Service 1d8f1c
Packit Service 1d8f1c
        message = _("The IBus daemon is not running. Do you wish to start it?")
Packit Service 1d8f1c
        dlg = Gtk.MessageDialog(message_type = Gtk.MessageType.QUESTION,
Packit Service 1d8f1c
                                buttons = Gtk.ButtonsType.YES_NO,
Packit Service 1d8f1c
                                text = message)
Packit Service 1d8f1c
        id = dlg.run()
Packit Service 1d8f1c
        dlg.destroy()
Packit Service 1d8f1c
        self.__flush_gtk_events()
Packit Service 1d8f1c
        if id != Gtk.ResponseType.YES:
Packit Service 1d8f1c
            sys.exit(0)
Packit Service 1d8f1c
Packit Service 1d8f1c
        main_loop = GLib.MainLoop()
Packit Service 1d8f1c
Packit Service 1d8f1c
        timeout = 5
Packit Service 1d8f1c
        GLib.timeout_add_seconds(timeout, lambda *args: main_loop.quit())
Packit Service 1d8f1c
        self.__bus.connect("connected", lambda *args: main_loop.quit())
Packit Service 1d8f1c
Packit Service 1d8f1c
        os.spawnlp(os.P_NOWAIT, "ibus-daemon", "ibus-daemon", "--xim")
Packit Service 1d8f1c
Packit Service 1d8f1c
        main_loop.run()
Packit Service 1d8f1c
Packit Service 1d8f1c
        if self.__bus.is_connected():
Packit Service 1d8f1c
            message = _("IBus has been started! "
Packit Service 1d8f1c
                "If you cannot use IBus, add the following lines to your $HOME/.bashrc; then relog into your desktop.\n"
Packit Service 1d8f1c
                "  export GTK_IM_MODULE=ibus\n"
Packit Service 1d8f1c
                "  export XMODIFIERS=@im=ibus\n"
Packit Service 1d8f1c
                "  export QT_IM_MODULE=ibus"
Packit Service 1d8f1c
                )
Packit Service 1d8f1c
            dlg = Gtk.MessageDialog(message_type = Gtk.MessageType.INFO,
Packit Service 1d8f1c
                                    buttons = Gtk.ButtonsType.OK,
Packit Service 1d8f1c
                                    text = message)
Packit Service 1d8f1c
            id = dlg.run()
Packit Service 1d8f1c
            dlg.destroy()
Packit Service 1d8f1c
            self.__flush_gtk_events()
Packit Service 1d8f1c
        else:
Packit Service 1d8f1c
            # Translators: %d == 5 currently
Packit Service 1d8f1c
            message = _("IBus daemon could not be started in %d seconds")
Packit Service 1d8f1c
            dlg = Gtk.MessageDialog(message_type = Gtk.MessageType.INFO,
Packit Service 1d8f1c
                                    buttons = Gtk.ButtonsType.OK,
Packit Service 1d8f1c
                                    text = message % timeout)
Packit Service 1d8f1c
            id = dlg.run()
Packit Service 1d8f1c
            dlg.destroy()
Packit Service 1d8f1c
            self.__flush_gtk_events()
Packit Service 1d8f1c
            sys.exit(0)
Packit Service 1d8f1c
Packit Service 1d8f1c
    def __shortcut_button_clicked_cb(self, button, name, section, _name, entry):
Packit Service 1d8f1c
        buttons = (_("_Cancel"), Gtk.ResponseType.CANCEL,
Packit Service 1d8f1c
                   _("_OK"), Gtk.ResponseType.OK)
Packit Service 1d8f1c
        title1 = _("Select keyboard shortcut for %s")
Packit Service 1d8f1c
        # Translators: Title of the window
Packit Service 1d8f1c
        title2 = _("switching input methods")
Packit Service 1d8f1c
        title = title1 % title2
Packit Service 1d8f1c
        dialog = keyboardshortcut.KeyboardShortcutSelectionDialog(
Packit Service 1d8f1c
                title = title, transient_for = self.__window)
Packit Service 1d8f1c
        dialog.add_buttons(*buttons)
Packit Service 1d8f1c
        text = entry.get_text()
Packit Service 1d8f1c
        if text:
Packit Service 1d8f1c
            shortcuts = text.split("; ")
Packit Service 1d8f1c
        else:
Packit Service 1d8f1c
            shortcuts = None
Packit Service 1d8f1c
        dialog.set_shortcuts(shortcuts)
Packit Service 1d8f1c
        id = dialog.run()
Packit Service 1d8f1c
        shortcuts = dialog.get_shortcuts()
Packit Service 1d8f1c
        dialog.destroy()
Packit Service 1d8f1c
        if id != Gtk.ResponseType.OK:
Packit Service 1d8f1c
            return
Packit Service 1d8f1c
        if section == 'panel/emoji':
Packit Service 1d8f1c
            self.__settings_emoji.set_strv(name, shortcuts)
Packit Service 1d8f1c
        else:
Packit Service 1d8f1c
            self.__settings_hotkey.set_strv(name, shortcuts)
Packit Service 1d8f1c
        text = "; ".join(shortcuts)
Packit Service 1d8f1c
        entry.set_text(text)
Packit Service 1d8f1c
        tooltip = "\n".join(shortcuts)
Packit Service 1d8f1c
        tooltip += "\n" + \
Packit Service 1d8f1c
            _("Use shortcut with shift to switch to the previous input method") 
Packit Service 1d8f1c
        entry.set_tooltip_text(tooltip)
Packit Service 1d8f1c
Packit Service 1d8f1c
    def __item_started_column_toggled_cb(self, cell, path_str, model):
Packit Service 1d8f1c
Packit Service 1d8f1c
        # get toggled iter
Packit Service 1d8f1c
        iter = model.get_iter_from_string(path_str)
Packit Service 1d8f1c
        data = model.get_value(iter, COLUMN_DATA)
Packit Service 1d8f1c
Packit Service 1d8f1c
        # do something with the value
Packit Service 1d8f1c
        if data[DATA_STARTED] == False:
Packit Service 1d8f1c
            try:
Packit Service 1d8f1c
                self.__bus.register_start_engine(data[DATA_LANG], data[DATA_NAME])
Packit Service 1d8f1c
            except Exception as e:
Packit Service 1d8f1c
                dlg = Gtk.MessageDialog(message_type = Gtk.MessageType.ERROR,
Packit Service 1d8f1c
                        transient_for = self.__window,
Packit Service 1d8f1c
                        buttons = Gtk.ButtonsType.CLOSE,
Packit Service 1d8f1c
                        text = str(e))
Packit Service 1d8f1c
                dlg.run()
Packit Service 1d8f1c
                dlg.destroy()
Packit Service 1d8f1c
                self.__flush_gtk_events()
Packit Service 1d8f1c
                return
Packit Service 1d8f1c
        else:
Packit Service 1d8f1c
            try:
Packit Service 1d8f1c
                self.__bus.register_stop_engine(data[DATA_LANG], data[DATA_NAME])
Packit Service 1d8f1c
            except Exception as e:
Packit Service 1d8f1c
                dlg = Gtk.MessageDialog(message_type = Gtk.MessageType.ERROR,
Packit Service 1d8f1c
                        transient_for = self.__window,
Packit Service 1d8f1c
                        buttons = Gtk.ButtonsType.CLOSE,
Packit Service 1d8f1c
                        text = str(e))
Packit Service 1d8f1c
                dlg.run()
Packit Service 1d8f1c
                dlg.destroy()
Packit Service 1d8f1c
                self.__flush_gtk_events()
Packit Service 1d8f1c
                return
Packit Service 1d8f1c
        data[DATA_STARTED] = not data[DATA_STARTED]
Packit Service 1d8f1c
Packit Service 1d8f1c
        # set new value
Packit Service 1d8f1c
        model.set(iter, COLUMN_ENABLE, data[DATA_STARTED])
Packit Service 1d8f1c
Packit Service 1d8f1c
    def __item_preload_column_toggled_cb(self, cell, path_str, model):
Packit Service 1d8f1c
Packit Service 1d8f1c
        # get toggled iter
Packit Service 1d8f1c
        iter = model.get_iter_from_string(path_str)
Packit Service 1d8f1c
        data = model.get_value(iter, COLUMN_DATA)
Packit Service 1d8f1c
Packit Service 1d8f1c
        data[DATA_PRELOAD] = not data[DATA_PRELOAD]
Packit Service 1d8f1c
        engine = "%s:%s" % (data[DATA_LANG], data[DATA_NAME])
Packit Service 1d8f1c
Packit Service 1d8f1c
        if data[DATA_PRELOAD]:
Packit Service 1d8f1c
            if engine not in self.__preload_engines:
Packit Service 1d8f1c
                self.__preload_engines.add(engine)
Packit Service 1d8f1c
                self.__settings_general.set_strv('preload-engines',
Packit Service 1d8f1c
                                                 list(self.__preload_engines))
Packit Service 1d8f1c
        else:
Packit Service 1d8f1c
            if engine in self.__preload_engines:
Packit Service 1d8f1c
                self.__preload_engines.remove(engine)
Packit Service 1d8f1c
                self.__settings_general.set_strv('preload-engines',
Packit Service 1d8f1c
                                                 list(self.__preload_engines))
Packit Service 1d8f1c
Packit Service 1d8f1c
        # set new value
Packit Service 1d8f1c
        model.set(iter, COLUMN_PRELOAD, data[DATA_PRELOAD])
Packit Service 1d8f1c
Packit Service 1d8f1c
    def __is_auto_start(self):
Packit Service 1d8f1c
        link_file = path.join(GLib.get_user_config_dir(),
Packit Service 1d8f1c
                              "autostart/ibus.desktop")
Packit Service 1d8f1c
        ibus_desktop = path.join(os.getenv("IBUS_PREFIX"),
Packit Service 1d8f1c
                                 "share/applications/ibus.desktop")
Packit Service 1d8f1c
Packit Service 1d8f1c
        if not path.exists(link_file):
Packit Service 1d8f1c
            return False
Packit Service 1d8f1c
        if not path.islink(link_file):
Packit Service 1d8f1c
            return False
Packit Service 1d8f1c
        if path.realpath(link_file) != ibus_desktop:
Packit Service 1d8f1c
            return False
Packit Service 1d8f1c
        return True
Packit Service 1d8f1c
Packit Service 1d8f1c
    def __checkbutton_auto_start_toggled_cb(self, button):
Packit Service 1d8f1c
        auto_start_dir = path.join(GLib.get_user_config_dir(), "autostart")
Packit Service 1d8f1c
        if not path.isdir(auto_start_dir):
Packit Service 1d8f1c
            os.makedirs(auto_start_dir)
Packit Service 1d8f1c
Packit Service 1d8f1c
        link_file = path.join(GLib.get_user_config_dir(),
Packit Service 1d8f1c
                              "autostart/ibus.desktop")
Packit Service 1d8f1c
        ibus_desktop = path.join(os.getenv("IBUS_PREFIX"),
Packit Service 1d8f1c
                                 "share/applications/ibus.desktop")
Packit Service 1d8f1c
        # unlink file
Packit Service 1d8f1c
        try:
Packit Service 1d8f1c
            os.unlink(link_file)
Packit Service 1d8f1c
        except:
Packit Service 1d8f1c
            pass
Packit Service 1d8f1c
        if self.__checkbutton_auto_start.get_active():
Packit Service 1d8f1c
            os.symlink(ibus_desktop, link_file)
Packit Service 1d8f1c
Packit Service 1d8f1c
    def __sigusr1_cb(self, *args):
Packit Service 1d8f1c
        self.__window.present()
Packit Service 1d8f1c
Packit Service 1d8f1c
    def run(self):
Packit Service 1d8f1c
        self.__window.show_all()
Packit Service 1d8f1c
        signal.signal(signal.SIGUSR1, self.__sigusr1_cb)
Packit Service 1d8f1c
        Gtk.main()
Packit Service 1d8f1c
Packit Service 1d8f1c
if __name__ == "__main__":
Packit Service 1d8f1c
    try:
Packit Service 1d8f1c
        locale.setlocale(locale.LC_ALL, '')
Packit Service 1d8f1c
    except locale.Error:
Packit Service 1d8f1c
        print("Using the fallback 'C' locale", file=sys.stderr)
Packit Service 1d8f1c
        locale.setlocale(locale.LC_ALL, 'C')
Packit Service 1d8f1c
Packit Service 1d8f1c
    i18n.init_textdomain(DOMAINNAME)
Packit Service 1d8f1c
    i18n.init_textdomain('xkeyboard-config')
Packit Service 1d8f1c
    setup = Setup()
Packit Service 1d8f1c
    setup.run()