十一、Gio->Resource
struct GResource {/* No available fields */
}
应用程序applications和库libraries通常包含二进制或文本数据,这些数据实际上是应用程序的一部分,而不是用户数据。例如GtkBuilder .ui文件,splashscreen图像,GMenu标记XML, CSS文件,图标等。它们通常以文件的形式存储在$datadir/appname中,或者以字符串字面量的形式手动包含在代码中。
GResource API
和[glib-compile-resources]。[glib-compile-resources]
程序提供了一个方便高效的替代方案,它有一些很好的属性。你可以像普通文件一样维护这些文件,所以很容易编辑它们,但是在构建过程中,这些文件会被组合成一个链接到可执行文件中的二进制包。这意味着加载资源文件是高效的(因为它们已经在内存中,与其他实例共享)和简单的(不需要检查I/O错误或在文件系统中定位文件)。它还使创建可重定位的应用程序变得更容易。
资源文件也可以标记为压缩文件compressed
。这些文件将以压缩形式包含在资源包中,但在使用资源时将自动解除压缩。这非常有用,例如,对于只解析一次(或很少解析)然后丢弃的大型文本文件(调用次数少)。
通过将preprocess属性的值设置为逗号分隔的预处理选项列表,也可以将资源文件标记为可预处理。目前唯一支持的选项是:
xml-stripblanks
它将使用xmllint命令从XML文件中去除可忽略的空白。为此,必须将XMLLINT环境变量设置为XMLLINT可执行文件的完整路径,或者必须将XMLLINT包含在该路径中;否则跳过预处理步骤。
to-pixdata
(自gdk-pixbuf 2.32起已弃用),它将使用gdk-pixbuf-pixdata命令将图像转换为GdkPixdata格式,这允许您直接使用资源文件中的数据创建pixbufs,而不是它的(未压缩)副本。为此,路径中必须有gdk-pixbuf-pixdata程序,或者必须将GDK_PIXBUF_PIXDATA环境变量设置为gdk-pixbuf-pixdata可执行文件的完整路径;否则资源编译器将中止。自从gdk-pixbuf 2.32以来,to-pixdata已经被弃用,因为GResource同样支持嵌入现代图像格式。与其直接使用它**,不如在GResource中嵌入PNG或SVG文件**。
json-stripblanks
将使用json-glib-format命令从JSON文件中删除可忽略的空格。要做到这一点,必须将环境变量JSON_GLIB_FORMAT设置为json-glib-format可执行文件的完整路径,或者它必须在该路径中;否则跳过预处理步骤。此外,至少需要1.6版本的json-glib格式。
使用给定的前缀和file元素中的文件名的组合,资源文件将在GResource命名空间中导出。alias
属性可用于更改文件名,以便在资源命名空间中的不同位置公开它们。通常,这用于包含来自不同源目录的文件,而不会暴露资源命名空间中的源目录,如下面的示例所示。
资源包是由[glib-compile-resources]
.[glib-compile-resources]
程序创建的,该程序接受一个描述资源包的XML文件和XML引用的一组文件。这些组合成二进制资源包。
资源描述示例:注意前缀开始时候有斜杠,结尾没有。调用资源的时候/org/gtk/Example/file_name
<?xml version="1.0" encoding="UTF-8"?>
<gresources><gresource prefix="/org/gtk/Example"><file>data/splashscreen.png</file><file compressed="true">dialog.ui</file><file preprocess="xml-stripblanks">menumarkup.xml</file><file alias="example.css">data/example.css</file></gresource>
</gresources>
这将创建一个包含以下文件的资源包:
/org/gtk/Example/data/splashscreen.png
/org/gtk/Example/dialog.ui
/org/gtk/Example/menumarkup.xml
/org/gtk/Example/example.css
请注意,进程中的所有资源都共享相同的命名空间,因此请使用java风格的路径前缀(如上例所示)来避免冲突。
然后,您可以使用[glib-compile-resources]
。[glib-compile-resources]
将XML编译为可以用g_resource_load()加载的二进制包。然而,更常见的是使用-generate-source和-generate-header参数来创建直接链接到应用程序的源文件和头文件。这将生成get_resource()、register_resource()和unregister_resource()函数,以传递给[glib-compile-resources]``[glib-compile-resources]
的–c-name参数作为前缀。get_resource()返回生成的GResource对象register和unregister函数注册资源,以便可以使用g_resources_lookup_data()访问其文件。
一旦创建并注册了GResource,就可以在进程中使用API调用(如g_resources_open_stream())来访问数据流或g_resources_lookup_data()来获得数据的直接指针,从而全局访问其中的所有数据。你也可以使用类似于" resource:///org/gtk/Example/data/splashscreen.png "的uri来访问GFile中的资源数据。
一些高级api,如GtkApplication,将自动从资源命名空间中的某些知名路径加载资源,以方便使用。有关这些api的详细信息,请参阅文档。
生成的源代码有两种形式,默认版本使用编译器对构造函数和析构函数的支持(如果可用),在启动或库加载时自动创建和注册GResource。如果传递--manual-register
参数,则会创建两个用于注册/注销资源的函数。这需要在应用程序/库中显式地调用初始化,但它在所有平台上都可以工作,即使是在不支持构造函数的次要平台上。(至少Win32、Mac OS和Linux支持构造函数。)
请注意,资源数据可以直接指向数据段(例如library),所以如果你在运行时卸载库,你需要非常小心地保存来自资源的数据指针,因为当库卸载时,这将消失。然而,在实践中这通常不是问题,因为大多数资源访问都是为了您自己的资源,而且资源数据通常只在解析期间使用一次,然后发布。
在调试程序或测试对已安装版本的更改时,能够在不重新编译的情况下替换程序或库中的资源,以达到调试或快速破解和测试的目的,通常很有用。从GLib 2.50开始,就可以使用G_RESOURCE_OVERLAYS环境变量有选择地覆盖文件系统中的资源。它是一个由g_searchpath_separator分隔的替换列表,在资源查找期间执行。在setuid进程中运行时,它会被忽略。
代换有这样的形式
/org/gtk/libgtk=/home/desrt/gtk-overlay
=之前的部分是覆盖应用的资源子路径。后面的部分是一个文件系统路径,其中包含了你希望作为资源加载的文件和子目录,具有相同的名称。
在上面的例子中,如果应用程序试图加载资源路径为/org/gtk/libgtk/ui/gtkdialog的资源。然后GResource会检查文件系统路径/home/desrt/gtk-overlay/ui/gtkdialog.ui。如果在那里找到了文件,就会使用它。这是一个覆盖层,而不是完全的替换,这意味着如果在该路径下没有找到文件,则将使用内置版本。目前不支持whiteouts。
替换必须以斜杠开始,并且不能在=
之前包含一个斜杠。理想情况下,斜杠后面的路径应该是绝对的,但这不是严格要求的。可以用单个文件覆盖单个资源的位置。
可用版本:2.32
参考:Gio Resource
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.dgrt.cn/a/392032.html
如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!相关文章:

十一、Gio->Resource
struct GResource {/* No available fields */ }应用程序applications和库libraries通常包含二进制或文本数据,这些数据实际上是应用程序的一部分,而不是用户数据。例如GtkBuilder .ui文件,splashscreen图像,GMenu标记XML, CSS文件…...

vm+centos设置NAT
centos 设置 NAT模式 系统环境 VMWare: Workstation16 Pro centos:7.9 [rootowl owl]# cat /etc/centos-release CentOS Linux release 7.9.2009 (Core)[rootowl owl]# uname -a Linux owl.com 3.10.0-1160.el7.x86_64 #1 SMP Mon Oct 19 16:18:59 U…...

Metaprogram 对一个程序进行编程
metaprogram含有对一个程序进行编程的意思,换句话说,编程系统将会执行我们所写的代码,来生成新的代码,而这些新的代码才真正实现了我们所期望的功能,通常而言,metaprogram 这个概念意味着一种反射的特性&am…...

【测开篇】测试基础
文章目录名词解释:1. 什么是需求?2. 什么是Bug?3. 什么是测试用例?软件的生命周期开发模型1. 瀑布模型2. 螺旋模型3. 增量模型和迭代模型4. 敏捷模型测试模型1. V模型2. W模型软件测试的生命周期Bug如何描述一个Bug?Bu…...

力扣第331场周赛题解
rankT1T2T3T4331 / 42560:01:460:06:18 (1)0:11:580:57:29 (4) T1 从数量最多的堆取走礼物模拟题,每次操作找出最大值maxxmaxxmaxx并将其变成sqrt(maxx)sqrt(maxx)sqrt(maxx),kkk次操作后求和。 数据范围很小,可以暴力模拟,更好的…...

基于LDA模型的非监督分类算法介绍
前言基于LDA(Latent Dirichlet Allocation)模型的非监督分类算法,将LDA模型从文本分析的应用过渡到遥感高分辨率影像处理的应用,利用Gibbs采样方法设计基于LDA模型的非监督分类算法,并使用IDL语言实现。在一定程度上解…...

以安全有效为目标的综合运营
一、安全行业的现状所有做安全的方案大多会在开始介绍安全的案例,都会列举近期国内外发生的重大安全事件, 基本上都是惨不忍睹,危害巨大。这里就不一一列举了,稍微了解这个行业的人都能看到大量的案例。但业界又有个很奇怪的现象就…...

mysql常见面试题--03 事务常考题以及事务的隔离
什么是事务? 对数据库的一系列操作,要么全执行,要么不执行. 事务时逻辑上的一组操作,要么全部执行,要么都不执行。 事务的三大特征 原子性 A 事务是最小执行单位,要么全部执行,要么都不执行一致性 C 事务执行前后&…...

【推荐研究方向(1)】小样本开集目标检测(few-shot open-set detection)
论文题目:Towards Few-Shot Open-Set Object Detection 论文链接:https://arxiv.org/abs/2210.15996 1、任务:小样本开集目标检测,使用少量已知类样本训练模型,使得模型既能够检测小样本已知类又能够检测未知类。 2、动机:解决FSOSOD问题有三个重要原因。 1)可…...

细讲TCP三次握手四次挥手(四)
常见面试题 为什么TCP连接的时候是3次?2次不可以吗? 因为需要考虑连接时丢包的问题,如果只握手2次,第二次握手时如果服务端发给客户端的确认报文段丢失,此时服务端已经准备好了收发数(可以理解服务端已经连接成功)据…...

PTA:C课程设计(4)
山东大学(威海)2022级大一下C习题集(4)4-6-1 删除字符(函数题)4-6-2 数组循环右移(函数题)4-6-3 使用函数实现字符串部分复制(函数题)4-7-1 校验ISBN-10编码4-7-2 删除重复字符4-7-3 字符串转换成十进制整数4-7-4 IP地址转换4-6-1…...

基于Java+MySQL+Tomcat+Servlet+Maven+JQuery+jackson+开源Markdown编辑器实现前后端分离个人博客系统
目录 项目简介 模块实现 设计实现数据库相关代码 博客列表页 博客详情页 注册页 登录页 检测登录状态 显示用户信息 退出登录 发布博客 删除博客 统计博客数量 效果展示 部分代码展示 小结: 项目简介 项目中使用了Java ,MySQL ÿ…...

PyCharm从C盘转移到D盘
找到在C盘的pycharm,复制整个文件夹到D盘指定位置 C盘位置:C:\Program Files\JetBrains\PyCharm Community Edition 2019.3.3 D盘位置:D:\PyCharm\PyCharm Community Edition 2019.3.3 创建新的快捷方式: 转移C盘中Pycharm缓存文…...

ansible 简单基础使用 防忘备忘录
-v #显示过程 vvv详细 vvvv开启debug模式 -i #指定主机清单的路径,默认是在/etc/ansible/hosts -m #指定模块,默认command模块 -a #指定模块的参数,动作 -k #输入ssh的密码,首次使用可以使用 -…...

cdh 6.2.1部署
环境准备 此次部署为5台服务器,hadoop1有公网,其他均为内网 角色划分方面,由于演示集群的总节点数很少,不可避免有大量角色合设。最终分配方案如下(CM:Cloudera Manager;NN:NameNo…...

命令行上的数据科学第二版 五、清理数据
原文:https://datascienceatthecommandline.com/2e/chapter-5-scrubbing-data.html 两章前,在 OSEMN 数据科学模型的第一步,我们看到了从各种来源获取数据。这一章讲的都是第二步:清理数据。你看,你很少能立即继续探索…...

Ajax:服务器的基本概念与初识
Ajax:服务器的基本概念与初识Ajax Date: January 19, 2023 目标 能够知道和服务器相关的基本概念 能够知道客户端和服务器通信的过程 能够知道数据也是一种资源 能够说出什么是Ajax以及应用场景 能够使用jQuery中的Ajax函数请求数据 能够知道接口和接口文档的…...

Python学习:如何通过非阻塞方式读写子进程输入输出
1.问题 并发性能一直都是Python之殇,线程很多情况下不能提升性能,而且不容易杀死,容易阻塞,编写线程并发永远不是一个简单的问题。多进程并发,也是如此,如何杀死进程,如何读进程输出不阻塞&…...

kotlin<第六篇>:协程(一)
一、什么是协程? 协程:可以简单地将它理解成一种轻量级的线程协程允许我们在单线程模式下模拟多线程编程的效果, 代码执行时的挂起与恢复完全是由编程语言来控制的,和操作系统无关。这种特性使得高并发程序的运行效率得到了极大的提升。协程让异步线程同步化,杜绝回调地狱…...

从大佬的“重新出发”中想到的
“无意中发现了一个巨牛的人工智能教程,忍不住分享一下给大家。教程不仅是零基础,通俗易懂,而且非常风趣幽默,像看小说一样!觉得太牛了,所以分享给大家。点这里可以跳转到教程。” 一到每年的三月份&#x…...