summaryrefslogtreecommitdiffstats
path: root/setup/enginefile.py
blob: 9e48ca291453590534549995b558401ed3f24009 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
# vim:set et ts=4 sts=4:
# -*- coding: utf-8 -*-
#
# ibus-libpinyin - Intelligent Pinyin engine based on libpinyin for IBus
#
# Copyright (c) 2024 Peng Wu <alexepico@gmail.com>
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2, or (at your option)
# any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.

import os
import xml.dom.minidom
import codecs

from gi import require_version as gi_require_version
gi_require_version('GLib', '2.0')
gi_require_version('Gio', '2.0')

from gi.repository import GLib
from gi.repository import Gio

pkgdatadir = os.getenv("IBUS_PKGDATADIR") or "."

def save_layout():
    # assume the name and layout tag has the same order,
    # save both libpinyin and libbopomofo value here.
    system_config = os.path.join(pkgdatadir, 'default.xml')

    dom = xml.dom.minidom.parse(system_config)
    names = dom.getElementsByTagName('name')
    layouts = dom.getElementsByTagName('layout')
    assert len(names) == len(layouts)
    for i, name in enumerate(names):
        engine = name.childNodes[0].data
        config_namespace = "com.github.libpinyin.ibus-libpinyin." + engine
        config = Gio.Settings.new(config_namespace)
        var = config.get_value("keyboard-layout")
        assert 's' == var.get_type_string()
        layout = var.get_string()
        layouts[i].childNodes[0].data = layout

    user_config = os.path.join(GLib.get_user_config_dir(),
                               'ibus', 'libpinyin', 'engines.xml')
    dir = os.path.dirname(user_config)
    os.path.exists(dir) or os.makedirs(dir, 0o700)
    # io.open() causes TypeError for unicode.
    f = codecs.open(user_config, 'w', 'utf-8')
    dom.writexml(f, '', '', '', 'utf-8')
    f.close()
    os.chmod(user_config, 0o600)

def resync_engine_file():
    user_config = os.path.join(GLib.get_user_config_dir(),
                               'ibus', 'libpinyin', 'engines.xml')
    system_config = os.path.join(pkgdatadir, 'default.xml')
    if not os.path.exists(user_config):
        return
    if not os.path.exists(system_config):
        os.unlink(user_config)
        return

    # path.getmtime depends on the build time rather than install time.
    def __get_engine_file_version(engine_file):
        version_str = ''
        dom = xml.dom.minidom.parse(engine_file)
        # there are two versions in the engines.xml, only use the first one
        elements = dom.getElementsByTagName('version')
        nodes = []
        if len(elements) > 0:
            nodes = elements[0].childNodes
        if len(nodes) > 0:
            version_str = nodes[0].data
        if version_str != '':
            version_str = version_str.strip()
        return version_str

    user_config_version = __get_engine_file_version(user_config)
    system_config_version = __get_engine_file_version(system_config)
    if system_config_version != user_config_version:
        # generate the user config from gsettings
        save_layout()