Clutter调用底层原理剖析

2024-04-29 14:18

本文主要是介绍Clutter调用底层原理剖析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1 初识Clutter

按照Clutter官网所述,Clutter是一个支持2D曲面的3D动画的GUI库,是一个C API集合。目前版本Clutter1.8.0-stable release,http://download.gnome.org/sources/clutter/1.8。

2 编程在Gjs

const Clutter = imports.gi.Clutter;

正是通过这条语句在Gjs编程中导入路Clutter模块,使得Gjs可以访问底层基于C语言实现的Clutter lib。

2.1 基本Class

clutter的核心概念是:stage(画布,舞台)和actor(演员)。莎士比亚说“全世界是一座舞台,所有的男人女人不过是演员”,这句话很好的表现了这点。画布相当于一个window是actor的舞台。Clutter是一种封装,封装就会有container。所以clutter程序都需要创建一个stage,它是最顶层的对象,也是一个container(容器),让其他的actor在其上面表演。actor们本身都是2D对象,是平面的,不过clutter允许我们对这些actor在3D空间进行操作,比如绕着x,y,z轴旋转。

2.2 简单编程示例(C到Gjs)

程序实现一个矩形中嵌套一个小矩形,显示文字,并接受mouse事件。


int main(int argc,char **argv)
{
ClutterColor stage_color ={0x00,0x00,0x00,0xff};
clutter_init (&argc,&argv);
ClutterActor *stage = clutter_stage_get_default();
clutter_actor_set_size(stage,200,200);
clutter_stage_set_color(CLUTTER_STAGE(stage),&stage_color);
ClutterActor *actor= clutter_rectangle_new();
clutter_actor_set_size(actor,100,100);
clutter_container_add_actor(CLUTTER_CONTAINER(stage),actor);
clutter_actor_set_position (actor,50,50);
ClutterColor color_color={0xff,0xff,0xff,0xff};
ClutterActor *label = clutter_text_new_full ("Sans 12","Alex_Test",&color_color);
clutter_actor_set_size (label,50,20);
clutter_actor_set_position (label,20,160);
clutter_container_add_actor (CLUTTER_CONTAINER (stage),label);
clutter_actor_set_scale(actor,0.5,0.5);
clutter_actor_set_scale(actor,0.5,0.5);
clutter_actor_show(stage);
g_signal_connect (stage,"button-press-event",
G_CALLBACK(on_stage_button_press),NULL);
clutter_main();
return EXIT_SUCCESS;
}

使用Gjs编程,就需要改变Mothod,使用Gjs环境下的Clutter编程。方法类的调用,可以通过Clutter-1.0.gir查阅(详见下文)。


<class name="Timeline"
c:symbol-prefix="timeline"
c:type="ClutterTimeline"
version="0.2"
parent="GObject.Object"
glib:type-name="ClutterTimeline"
glib:get-type="clutter_timeline_get_type"
glib:type-struct="TimelineClass">

2.3 ClutterTimeline

 clutter除了可以让我们在3D空间操作2D的actor之外,最有特色的就是可以使用时间线。

以下是改动DockBar js文件中用于隐藏Bar的代码:


_hideDock: function (){
this._timeline = new Clutter.Timeline({ duration: 200 });
this._timeline.start();
this._timeline.connect('new-frame', Lang.bind(this,
function(timeline, frame) {
this._onHideNewFrame(frame);
}));
hideDock=true;
},
_onHideNewFrame : function(frame) {
let monitor = global.get_primary_monitor();
this._time = this._timeline.get_elapsed_time();
this.bin.set_position ((-this.actor.width)*(this._time/200)+1,monitor.height*0.122);
},


3 附录

关于clutter导入细节以及C到js的Clutter方法查询参考。

3.1 lib导入到Gjs(Clutter-1.0 version)

两条路径:

.typelib path:/usr/lib/girepository-1.0/

.gir path:/usr/share/gir-1.0/

GI(GObject Introspection)可以将API的信息描述成XML,再parse成typelib格式,即binary格式,方便runtime时使用。正是通过这一过程,GI使得基于GObject的native lib能轻易porting到script language。

3.2 GNOME 库被 GI 化

现在,GNOME 桌面的大部分程序库皆已 GI 化,通常可在 /usr/lib/girepository-1.0 目录中看到它们,只要在该目录中的出现的 typelib 文件,其对应的库便可在 gjs 通过 imports.gi 对象进行连接。如想查询API在js中使用的方法,可以使用command:

[alex@alex girepository-1.0]$ g-ir-generate Clutter-1.0.typelib | grep timeline

或者 可以从/usr/share/gir-1.0/对应的.gir文件查询C函数原型信息。


这篇关于Clutter调用底层原理剖析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/946319

相关文章

深入探索协同过滤:从原理到推荐模块案例

文章目录 前言一、协同过滤1. 基于用户的协同过滤(UserCF)2. 基于物品的协同过滤(ItemCF)3. 相似度计算方法 二、相似度计算方法1. 欧氏距离2. 皮尔逊相关系数3. 杰卡德相似系数4. 余弦相似度 三、推荐模块案例1.基于文章的协同过滤推荐功能2.基于用户的协同过滤推荐功能 前言     在信息过载的时代,推荐系统成为连接用户与内容的桥梁。本文聚焦于

如何在页面调用utility bar并传递参数至lwc组件

1.在app的utility item中添加lwc组件: 2.调用utility bar api的方式有两种: 方法一,通过lwc调用: import {LightningElement,api ,wire } from 'lwc';import { publish, MessageContext } from 'lightning/messageService';import Ca

hdu4407(容斥原理)

题意:给一串数字1,2,......n,两个操作:1、修改第k个数字,2、查询区间[l,r]中与n互质的数之和。 解题思路:咱一看,像线段树,但是如果用线段树做,那么每个区间一定要记录所有的素因子,这样会超内存。然后我就做不来了。后来看了题解,原来是用容斥原理来做的。还记得这道题目吗?求区间[1,r]中与p互质的数的个数,如果不会的话就先去做那题吧。现在这题是求区间[l,r]中与n互质的数的和

【编程底层思考】垃圾收集机制,GC算法,垃圾收集器类型概述

Java的垃圾收集(Garbage Collection,GC)机制是Java语言的一大特色,它负责自动管理内存的回收,释放不再使用的对象所占用的内存。以下是对Java垃圾收集机制的详细介绍: 一、垃圾收集机制概述: 对象存活判断:垃圾收集器定期检查堆内存中的对象,判断哪些对象是“垃圾”,即不再被任何引用链直接或间接引用的对象。内存回收:将判断为垃圾的对象占用的内存进行回收,以便重新使用。

hdu4407容斥原理

题意: 有一个元素为 1~n 的数列{An},有2种操作(1000次): 1、求某段区间 [a,b] 中与 p 互质的数的和。 2、将数列中某个位置元素的值改变。 import java.io.BufferedInputStream;import java.io.BufferedReader;import java.io.IOException;import java.io.Inpu

hdu4059容斥原理

求1-n中与n互质的数的4次方之和 import java.io.BufferedInputStream;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.io.PrintWrit

哈希表的底层实现(1)---C++版

目录 哈希表的基本原理 哈希表的优点 哈希表的缺点 应用场景 闭散列法 开散列法 开放定值法Open Addressing——线性探测的模拟实现 超大重点部分评析 链地址法Separate Chaining——哈希桶的模拟实现 哈希表(Hash Table)是一种数据结构,它通过将键(Key)映射到值(Value)的方式来实现快速的数据存储与查找。哈希表的核心概念是哈希

【LabVIEW学习篇 - 21】:DLL与API的调用

文章目录 DLL与API调用DLLAPIDLL的调用 DLL与API调用 LabVIEW虽然已经足够强大,但不同的语言在不同领域都有着自己的优势,为了强强联合,LabVIEW提供了强大的外部程序接口能力,包括DLL、CIN(C语言接口)、ActiveX、.NET、MATLAB等等。通过DLL可以使用户很方便地调用C、C++、C#、VB等编程语言写的程序以及windows自带的大

寻迹模块TCRT5000的应用原理和功能实现(基于STM32)

目录 概述 1 认识TCRT5000 1.1 模块介绍 1.2 电气特性 2 系统应用 2.1 系统架构 2.2 STM32Cube创建工程 3 功能实现 3.1 代码实现 3.2 源代码文件 4 功能测试 4.1 检测黑线状态 4.2 未检测黑线状态 概述 本文主要介绍TCRT5000模块的使用原理,包括该模块的硬件实现方式,电路实现原理,还使用STM32类

TL-Tomcat中长连接的底层源码原理实现

长连接:浏览器告诉tomcat不要将请求关掉。  如果不是长连接,tomcat响应后会告诉浏览器把这个连接关掉。    tomcat中有一个缓冲区  如果发送大批量数据后 又不处理  那么会堆积缓冲区 后面的请求会越来越慢。