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



In Gio。我可以使用

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

,我可以用

Gio.Settings.new_with_path(schema_id, path)

获取Gio.Settings实例。但是我怎么能得到path的所有值,目前用于给定的schema_id ?

通常,一个模式有一个固定的路径,该路径决定了设置存储在概念全局设置树中。然而,模式也可以是"可重定位的",即不配备固定的路径。这是有用的,例如当模式描述一个' account ',并且您希望能够存储任意数量的账户。

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

我认为你可以找到更多的信息与GSettingsSchemas -这是一个例子,在描述的情况下,Schema是插件的一部分。

不幸的是,您无法从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)
    

不能,至少对于任意模式来说不能,这就是可重定位模式的定义:一个模式可以有多个实例,存储在多个任意路径中。

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

当创建给定可重定位模式的多个实例时,由应用程序决定是否将每个实例存储在一个合理的、易于发现的路径中,例如(不可重定位的)应用程序模式的子路径。或者在这样的模式中将实例路径(或后缀)存储为列表键。

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

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

这样,客户端可以使用gsettings访问所有实例,读取list并从uuid构建路径,或者通过直接列出/org/gnome/terminal/legacy/profiles:/的子路径从dconf访问所有实例。

当然,对于不可重定位的模式,您总是可以使用: 获取它们的路径。
gsettings list-schemas --print-paths

相关内容

  • 没有找到相关文章