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

相关文章

Java调用C++动态库超详细步骤讲解(附源码)

《Java调用C++动态库超详细步骤讲解(附源码)》C语言因其高效和接近硬件的特性,时常会被用在性能要求较高或者需要直接操作硬件的场合,:本文主要介绍Java调用C++动态库的相关资料,文中通过代... 目录一、直接调用C++库第一步:动态库生成(vs2017+qt5.12.10)第二步:Java调用C++

Java编译生成多个.class文件的原理和作用

《Java编译生成多个.class文件的原理和作用》作为一名经验丰富的开发者,在Java项目中执行编译后,可能会发现一个.java源文件有时会产生多个.class文件,从技术实现层面详细剖析这一现象... 目录一、内部类机制与.class文件生成成员内部类(常规内部类)局部内部类(方法内部类)匿名内部类二、

Python中随机休眠技术原理与应用详解

《Python中随机休眠技术原理与应用详解》在编程中,让程序暂停执行特定时间是常见需求,当需要引入不确定性时,随机休眠就成为关键技巧,下面我们就来看看Python中随机休眠技术的具体实现与应用吧... 目录引言一、实现原理与基础方法1.1 核心函数解析1.2 基础实现模板1.3 整数版实现二、典型应用场景2

Java的IO模型、Netty原理解析

《Java的IO模型、Netty原理解析》Java的I/O是以流的方式进行数据输入输出的,Java的类库涉及很多领域的IO内容:标准的输入输出,文件的操作、网络上的数据传输流、字符串流、对象流等,这篇... 目录1.什么是IO2.同步与异步、阻塞与非阻塞3.三种IO模型BIO(blocking I/O)NI

在C#中调用Python代码的两种实现方式

《在C#中调用Python代码的两种实现方式》:本文主要介绍在C#中调用Python代码的两种实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C#调用python代码的方式1. 使用 Python.NET2. 使用外部进程调用 Python 脚本总结C#调

SpringCloud之LoadBalancer负载均衡服务调用过程

《SpringCloud之LoadBalancer负载均衡服务调用过程》:本文主要介绍SpringCloud之LoadBalancer负载均衡服务调用过程,具有很好的参考价值,希望对大家有所帮助,... 目录前言一、LoadBalancer是什么?二、使用步骤1、启动consul2、客户端加入依赖3、以服务

Vue 调用摄像头扫描条码功能实现代码

《Vue调用摄像头扫描条码功能实现代码》本文介绍了如何使用Vue.js和jsQR库来实现调用摄像头并扫描条码的功能,通过安装依赖、获取摄像头视频流、解析条码等步骤,实现了从开始扫描到停止扫描的完整流... 目录实现步骤:代码实现1. 安装依赖2. vue 页面代码功能说明注意事项以下是一个基于 Vue.js

JAVA封装多线程实现的方式及原理

《JAVA封装多线程实现的方式及原理》:本文主要介绍Java中封装多线程的原理和常见方式,通过封装可以简化多线程的使用,提高安全性,并增强代码的可维护性和可扩展性,需要的朋友可以参考下... 目录前言一、封装的目标二、常见的封装方式及原理总结前言在 Java 中,封装多线程的原理主要围绕着将多线程相关的操

kotlin中的模块化结构组件及工作原理

《kotlin中的模块化结构组件及工作原理》本文介绍了Kotlin中模块化结构组件,包括ViewModel、LiveData、Room和Navigation的工作原理和基础使用,本文通过实例代码给大家... 目录ViewModel 工作原理LiveData 工作原理Room 工作原理Navigation 工

Java的volatile和sychronized底层实现原理解析

《Java的volatile和sychronized底层实现原理解析》文章详细介绍了Java中的synchronized和volatile关键字的底层实现原理,包括字节码层面、JVM层面的实现细节,以... 目录1. 概览2. Synchronized2.1 字节码层面2.2 JVM层面2.2.1 ente