如何在Gio.Settings中获取可重定位模式的路径?

时间:2015-06-06 21:35:39

标签: gtk gtk3 gio gsettings

在Gio.Settings中,我可以使用

列出可重定位模式
Gio.Settings.list_relocatable_schemas()

我可以使用

Gio.Settings.new_with_path(schema_id, path)

获取Gio.Settings个实例。但是,如何才能获得当前用于给定path的{​​{1}}的所有值?

3 个答案:

答案 0 :(得分:1)

  

通常,架构具有确定路径的固定路径   设置存储在概念全局设置树中。   但是,模式也可以是“可重定位的”,即没有配备   固定路径。这很有用,例如架构描述时   'account',您希望能够存储任意数量的   帐户。

这不是new_with_path吗?您必须将模式存储在与帐户关联的某个位置,但这不是“设置”系统的责任。我认为new_with_path适用于您的架构依赖于帐户的情况。

我认为您可以使用GSettingsSchemas找到更多信息 - 这是Schema是插件一部分的描述中的示例。

答案 1 :(得分:0)

不幸的是你无法从Gio.Settings那里做到。

我在这里看到两个选项:

  • 保持单独的gsetting以存储可重定位模式的路径
  • 使用dconf API,这是一个低级配置系统。由于没有Python绑定(猜测它的Python问题),我建议使用ctypes与C绑定。 如果您知道可重定位模式的根路径,则可以在下面的代码段中使用它们。

    import ctypes
    from ctypes import Structure, POINTER, byref, c_char_p,  c_int, util
    
    from typing import List
    
    
    class DconfClient:
        def __init__(self):
            self.__dconf_client = _DCONF_LIB.dconf_client_new()
    
        def list(self, directory: str) -> List[str]:
            length_c = c_int()
            directory_p = c_char_p(directory.encode())
            result_list_c = _DCONF_LIB.dconf_client_list(self.__dconf_client, directory_p, byref(length_c))
    
            result_list = self.__decode_list(result_list_c, length_c.value)
            return result_list
    
        def __decode_list(self, list_to_decode_c, length):
            new_list = []
            for i in range(length):
                # convert to str and remove slash at the end
                decoded_str = list_to_decode_c[i].decode().rstrip("/")
                new_list.append(decoded_str)
            return new_list
    
    
    class _DConfClient(Structure):
        _fields_ = []
    
    
    _DCONF_LIB = ctypes.CDLL(util.find_library("dconf"))
    _DCONF_LIB.dconf_client_new.argtypes = []
    _DCONF_LIB.dconf_client_new.restype = POINTER(_DConfClient)
    _DCONF_LIB.dconf_client_new.argtypes = []
    _DCONF_LIB.dconf_client_list.argtypes = [POINTER(_DConfClient), c_char_p, POINTER(c_int)]
    _DCONF_LIB.dconf_client_list.restype = POINTER(c_char_p)
    

答案 2 :(得分:0)

不能,至少对于任意模式不能,这是根据定义可重定位模式是什么:可以有多个实例的架构,存储在多个任意路径中。

由于可重定位模式实例基本上可以任何地方存储在 DConf 内,gsettings 无法列出它们的路径,它不会跟踪实例。而 dconf 也帮不了你,因为它根本没有 模式 的概念,它只知道路径和键。它可以列出给定路径的子路径,仅此而已。

应用程序在创建给定可重定位模式的多个实例时,应将每个实例存储在合理且易于发现的路径中,例如(不可重定位的)应用程序模式的子路径。或者将实例路径(或后缀)作为列表键存储在此类架构中。

或者两者兼而有之,就像 Gnome 终端对其配置文件所做的那样:

  • org.gnome.Terminal.ProfilesList 是不可重定位的常规模式,存储在 DConf 路径 /org/gnome/terminal/legacy/profiles:/
  • 该架构有 2 个键,一个带有单个 UUID 的 default 字符串,以及一个包含 UUID 的字符串列表 list
  • 每个配置文件都是 可重定位 架构 org.gnome.Terminal.Legacy.Profile 的一个实例,并且存储在,您猜... /org/gnome/terminal/legacy/profiles:/:<UUID>/

通过这种方式,客户端可以使用 gsettings,读取 list 并从 UUID 或从 dconf 构建路径,通过直接列出 {{1} 的子路径来访问所有实例}}。

当然,对于不可重定位模式,您总是可以通过以下方式获取它们的路径:

/org/gnome/terminal/legacy/profiles:/